-
임시 - Linux Kernel - 2장 (1) : System Call (1) ( 고건 교수님 OLC 강의 )Linux Kernel 2024. 6. 30. 17:56
2장 - System Call( 1 )
user program을 아래와 같이 코드를 짰다고 하자.
MY_ CODE main() { add(); sub(); printf(); }
LIBRARY printf(3) { write(2); ... }printf( )는 library function이고
library에서 다시 write 시스템 콜 함수를 부르게 된다.
library function은 매우 많지만(putc, puts, printf 등)
시스템 콜은 하나뿐이다. (write! )
read도 마찬가지로 library function은 매우 많지만 (scanf, getc 등)
시스템 콜은 read 뿐이다!
모든 IO library function 은 반드시 그 안에 스스로 IO instruction을 가질 수 없다!
커널이 아니라면 그 어떤 프로그램도 IO instruction이 있을 수 없다.
write(2) 시스템 콜을 부르게 되면, write함수 안에서
파라미터를 준비하고 커널 모드로 바뀌도록 실행된다.
write() { prepare parameter chmodk; }이 때, 이 write () 함수를 system call wrapper routine 이라고도 부른다. ( sys_write()와 구분하자! )
목적은 system call이 발생하도록 하는 것이다.
runtime에는 chmodk에 의해 trap에 걸려서 kerenl 모드로 들어가게 된다.
system call wrapper routine에서 준비해놓은 파라미터를 보고 적절한 system call을 실행하게 된다.
kernel에서는 모든 system call 함수가 “sys_”로 시작하게 된다.
intel 같은 경우에는 int $ 0x80 ; 이라는 instruction으로 trap에 걸리게끔 해놓았다.
write(){ ... : 필요한 파라미터 채워넣기 movl 5, %eax : system call number int $0x80 : 트랩 걸리게 끔 하는 코드 }system call number 는 sys_call_table ( array ) 에서 index로 사용된다.
table에서는 index로 찾으면, system call을 서비스해주는 함수의 시작 주소값을 가지고 있다.
cf ) system call number는 컴파일러를 쓰는 회사가 결정.

정리하면 ,
my_code를 컴파일하면 gcc가 library를 가져다 끼워 놓는다.
라이브러리 안에는 반드시 write(2 ) system call이 그 안에 끼워져 들어온다.
write()안에는 cpu protection 모드를 커널로 바꾸는 코드가 들어가져 있다.
또 write에 대응되는 system call number로 컴파일러가 변화시켜 놓는다.
이후, 런타임에는
syscall number가 valid 한지 check를 해주고,
커널이 트랩에 걸리면 system call number를 바탕으로
array (sys_call table)에서 서비스하기를 원하는 함수의 시작주소를 찾는다.
그리로 가서, sys call function을 실행한다.
system call 이후에 user 모드로 돌아온다. (모드 bit 0으로 세팅)
그럼 내가 원하는 시스템 콜을 짜게 되면 어떻게 될까??
새로운 시스템 콜을 짜게 되면 ,
platform에 의존적이게 되는 프로그램을 짜게 되므로 추천하지 않는다.
대신, read나 write function call 을 활용해라.
새로운 file fd 를 구현하는 방식으로 대체해라.
'Linux Kernel' 카테고리의 다른 글
임시 - Linux Kernel - 4장 : Process management( 1 ) ( 고건 교수님 OLC 강의 ) (0) 2024.07.04 커널 모듈 개발의 기초 - Linux 커널 모듈 프로그래밍 가이드(5.x) 참고 (4) 2024.07.02 임시 - Linux Kernel - 3장 : System Call(2) ( 고건 교수님 OLC 강의 ) (0) 2024.07.01 임시 - Linux Kernel - 2장 (2) : Process Management ( 고건 교수님 OLC 강의 ) (2) 2024.06.30 임시 - Linux Kernel - Introduction ( 고건 교수님 OLC 강의 ) (0) 2024.06.29