(1) 시스템 콜 처리과정
: |사용자 프로세스|====(시스템콜)====>|libc.a|====(0×80인터럽트발생)====>|커널에서 처리|
시스템콜은 소프트웨어 인터럽트로 볼 수 있다.


(2) 사용자가 fork()시스템콜을 호출한다 가정한다면!!(위의 그림 참조!!)

- c라이브러리 (libc.a)에서 fork시스템콜의 고유번호인 '2'를 eax레지스터에 저장하고 0×80인터럽트를 방생시킨다.

- 인터럽트가 발생하면 "사용자모드"->"커널모드" 로 바뀐다.

- 커널은 IDT에서 0×80 주소에 있는 system_call()을 찾는다. [system_call 은 시스템콜의 핸드러 함수 이다.] 
   system_call()은 arch/i386/kernel/entry.S에 구현되있다.

- system_call()함수에서는 호출된 시스템콜 번호와 모든 레지스터들을 스택에 저장하고 올바른 시스템콜 번호인지 검사후 sys_call_table [시스템콜테이블]에서 시스템콜 번호에 해단하는 함수를 호출한다.

- 이 함수가 종료하면, entry.S에 정의되 있는 ret_from_sys_call()함수에 의해 사용자 포르세스로 돌아간다.


※ 출처 : http://idkkangjs.blog.me/30091117058

'L inux > Kernel' 카테고리의 다른 글

모듈(Module)  (0) 2011.09.26
시스템 콜(System Call) - 3  (0) 2011.09.26
시스템 콜(System Call) - 1  (0) 2011.09.26
리눅스 커널 컴파일  (0) 2011.09.26
리눅스 부팅과정  (0) 2011.09.23
by 민트앤라떼 2011. 9. 26. 10:45