kernel_init은 처음 부팅될때 돌아가는 함수

init/main.c에찾아볼수있다.



int switch=0;
void kernel_init(){
    ......
    do_basic_setup();
    my_atk_func();//
    ......
}

my_atk_func에는 무한루프로 1초씩 msleep를하면서switch가 on이됬는지 검사


에서 키보드입력이 들어오면 switch를 on시키도록
if( code==19)
{
    switch=1;
}


결과





설명:
커널초기화중일때 무한루프상태로 msleep(1) 씩주기로 프로세스가 강제로 스위칭되어 바뀌며 switch 1인지 검사
->계속 검사하던도중 내가 키보드 r을 입력하면 키보드인풋으로 키보드 인터럽트가 날라옴 cpu는 하는일 중단하고 먼저 인터럽트처리 
->그 인터럽트 처리함수로가서 실행되는데 이때  값이 내가 설정해둔 값을때switch  0에서 1로바꿈
->인터럽트처리 끝나서 우선스케줄링된 프로세스부터 실행(인터럽트전 중단된프로세스 일수도있고 알고리즘에따라 다름)
->아까중단된 프로세스가 스케줄되서 kernerinit안에 my_atk_func 함수는 if문을 탈출하게 된다.



블로그 이미지

pringlee

하드코어보단 캐주얼!

,
drivers/input/keyboard/atkbd.c
에있는 atkbd_interrupt함수를 그냥 바로 return 시켜보자


이상태에서 키보드입력을 할수가없음.


drivers/input/keyboard/atkbd.c 에서 code값을 하나증겨시켜버리자

root를 치면 tppy가 쳐진다. 키보드번호의증가때문







블로그 이미지

pringlee

하드코어보단 캐주얼!

,
인터럽트발생 -> idt_table을 참조하여 해당인터럽트 실행
1.시스템콜  -> 시스템콜 테이블참조하여 시스템함수실행
2.인터럽트번호 32~255-> irq_desc참조하여 그 함수실행


ex) 키보드입력
키보드 눌림 -> 인터럽트33번 cpu에게전달 -> cpu는처음 운영체제가 시작할때 메모리에 할당해준 IDT를 참조 -> 33번이기때문에 irq_desc로감 -> 33번에해당하는 irq_desc[1]을 부름-> irq_desc[1] 는 atkbd함수를 호출 -> atkbd함수실행 



128번은 system_call 인터럽트 이고 타이머인터럽트,페이지폴트,키보드입력(그림에는없지만 아마 33)은 다른번호에 배정받아있다.




System_call일때는 IDT넘버가 128번이고 sys_call_table을 참조하여 그에해당하는 커널함수를 알수있다.


fork가 실행될때 간단설명 
  1.  mov eax  4           //시스템콜번호를 레지스터에저장
    INT 128                 
  2. IDT[128]                 //idt테이블에서 128번으로가라 = system_call()
  3. sys_call_table[4]         //sys_call_tale 4번으로가서 실행해라.





블로그 이미지

pringlee

하드코어보단 캐주얼!

,


-커널영역 vs 유저영역


인터럽트는 cpu에게 커널영역의 시스템함수를 호출한다.

cpu는 유저모드 커널모드가 있고, 커널영역의 코드를 실행하기위해서는 cpu는 커널모드로 변경되어야한다. 이를 나눈이유는 커널은 시스템관련 중요한 함수들과 변수가 있기 때문에 함부러 접근할수 없게 하기위함이다.


printf는 라이브러리의 일종이고 안에 여러가지 알고리즘이 있지만 결국에 모니터에 찍을때에는 write라는 시스템함수을 호출하여 인터럽트를 날려 cpu에게 커널영역에있는 함수를 실행해달라고 요청한다.


printf호출(유저영역) ->write호출  -> cpu는 커널모드로 변경 -> write에해당하는 함수실행 ->write끝남-> 유저모드변경 ->다음실행 


-System call Interrupt


read,write호출시 cpu는 커널모드로 바뀌고 커널 주소공간에 있는 코드를 실행하여야 한다. 이는 cpu에 인터럽트를 요청하는것

으로도 볼수있음.소프트웨어 인터럽트이고. system call에서 자세히 다룰것이다.


앞에서 말한 인터럽트처리가 


주프로그램 -> 인터럽트발생(..키보드입력) -> 인터럽트처리 ->주프로그램으로 복귀 


이에반해 system call interrupt는 프로그램이 명령어를 실행하면서 interrupt를 거는것이기때문에 순차적으로 


주프로그램 -> 실행되다가  write를 호출 -> cpu는 커널모드로 바뀌고 write에대한 명령처리 라고봐도 무방하다.


코드를 중단하고 끼어드는 느낌은 아니라고 말하고싶다.


-Hardware Interrupt

인터럽트가 걸리면 현재 실행중인 기계어를 중단하고 해당 인터럽트에 대한 처리를한다.

ex)키보드입력,마우스입력등...


-exception interrupt

0으로나누기, 할당되지 않은주소접근 등 치명적인 오류를 막기위한 인터럽트

블로그 이미지

pringlee

하드코어보단 캐주얼!

,

언뇽ㅇㅎ


-인터럽트란? 


인터럽트(interrupt, 문화어: 중단, 새치기)란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다. -wikipedia


예)여러 프로세스가 실행되는 도중 갑자기 키보드입력이 들어오면

cpu는 하던것을 잠시멈추고 키보드입력에 대한 이벤트 처리를한다.


-이벤트처리?


이키보드입력을 어디프로세스로 보낼것인가? 등..



네이버 검색할때를 생각해보자

1.네이버화면을 킨다.

2.검색하려고 검색창에 키보드입력을 기다리고있다. 이때 컴퓨터는 이런저런 프로세스(게임,날짜,동영상,다른프로세스들...)가 돌아가고 있는상태이다.

3.검색창에 a를 입력하기위해 키보드 a를누른다.

4.인터럽트가 발생하여 cpu는 하던일을 멈추고 키보드 이벤트 처리를한다.

5.들어온값이 a라는것을 어떠한 알고리즘에 의해알고 , 보내야할 프로세스(네이버창)도 알고있다.

6.그 프로세스(네이버창)로 보낸다.

7.네이버창 프로세스의 검색창의 처리는 enter치기전까지는 그저 들어온 입력(글자)를 화면에 찍는다.


일단은 추상적으로 이런과정이라 생각하면된다.

인터럽트는 이외에도 여러가지있으며 생각하는것보다 엄청많이 발생한다. 지금도 타이머틱은 돌아가 인터럽트를 발생시키고있다.


블로그 이미지

pringlee

하드코어보단 캐주얼!

,

시작!!

블로그 이미지

pringlee

하드코어보단 캐주얼!

,