arch/x86/kernel/syscall_table_32.S로가면
시스템콜 함수들이 나열되어있다.



1.sys_write 변경해보기


유저모드에서는 어떤곳에 출력(write)하고 싶다면 항상 커널에게 요청해야한다. 
-> write()로 시스템콜을 요청하여 sys_write함수를 이용하여 모니터에찍음  

커널모드로 진입한 커널내에서 모니터에 간단히 찍고싶을때
printk이용
-> printk는 커널함수이기 때문에 시스템콜을 요청하는것이아니라 그냥 함수를 실행하여 출력해줌.

쉘에서 printk되는것을 보고싶다면 명령어로
echo 8 > /proc/sys/kernel/printk 를 이용하여 printk 를 모니터에 출력되게 해야함.



무언가 write될때마다 계속 모니터에 찍힘




2.시스템콜 추가해보기


sys_ni_syscall은 현재 사용되지않는 시스템콜이다.
이를 적절히 수정하여 시스템콜을 변경해보자.

(1).시스템콜 테이블에 등록하기

sys_ni_syscall 이름을 내가만들 함수의 이름으로 바꿔준다. 17번에 만들어줌


(2)


커널 컴파일시 이용되는 .c 파일중 아무데나 똑같은 이름으로 만들어준다.

(3)시스템콜 확인





별 쓸모없어 보이는데 다음문제를 생각해보자.
만약 커널내의 전역변수로 할당된 어떤 변수에 접근하고싶다면 어떻게 해야할까?

유저모드에서는 당연히 커널내의 함수는 물론이고 변수접근 할수없음.
적절한 시스템콜함수를 만들어서 시스템콜을 호출해주어야함 .
만약 시스템콜을 이용하여 커널내의 전역변수의 주소값 리턴하여 가져왔다면?
아마 런타임에러가날것임. 유저모드에서는 커널내의 전역변수(특정 로컬 주소값을 지님)접근이 불가함.

이처럼 유저영역과 커널영역은 나누어져있고 유저레벨에서 커널레벨로 접근하려면 꼭 시스템콜을 이용하도록 설계되어있다.
어느곳에 write하고싶으면 항상 write함수를 이용할수밖에없는것이다.

라이브러리로 제작된 printf,scanf 나 파일입출력 라이브러리나  안에 들여다보면 모두 write,read 로 시스템콜을 호출한다.






블로그 이미지

pringlee

하드코어보단 캐주얼!

,
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

하드코어보단 캐주얼!

,