2022. 9. 19. 01:37ㆍ개발 관련 책 읽기/리눅스 커널 내부구조
시스템 호출 처리 과정
시스템 호출이란 유저 레벨 응용 프로그램들에게 커널이 자신의 서비스를 제공하는 인터페이스이다.
따라서 사용자가 운영체제의 기능이나 모듈을 활용하기 위해서는 반드시 시스템 콜을 사용해야 한다.
시스템 콜은 커널로의 진입점(Entry Point)라고 볼수 있다. 대표적으로 sys_fork(),sys_read()등이 있다
커널은 각 시스템 콜을 함수로(시스템 콜 핸들러) 구현해 놓고 각 시스템 콜이 호출되었을 때 헨들러를 호출하여 서비스를 제공한다.
(위의 그림을 참고하면서) 유저 프로세스가 fork() 시스템 콜을 요청했다고 가정해보자.
그러면 표준 C 라이브러리의 fork()라는 함수가 호출된다. 이 함수는 사용자 대신에 트랩을 요청한다
이 라이브러리 함수는 CPU내의 범용 레지스터중 하나인 eax레지스터에(intel 기준 만약 ARM CPU라면 r7 레지스터에) fork() 함수에 할당되어 있는 고유한 번호인 2를 넣고, 0x80 인자로 트랩을 건다.
인텔 CPU에서 트랩을 거는 명령은 "int"이다 (만약 ARM이라면 "swi"명령)
일단 트랩이 걸리면 제어가 커널로 넘겨지고 CPU 수행 모드가 user -> Kernel로 변화한다.
그리고 커널은 현재 실행 중이던 태스크의 문맥을 저장하고 트랩의 번호에 대응되는 엔트리에 등록되어있는 함수를 호출한다.(여기선 0x80 = 128(10)) 따라서 호출되는 함수는 system_call() 이다.
이 함수는 eax의 값을 인덱스로 하여 sys_call_table을 탐색한다.
따라서 현재 eax에 들어있는 2라는 값을 인덱스로 sys_call_table을 인덱싱하여 sys_fork() 함수포인터를 얻어올 수 있다. sys_call_table의 엔트리는 시스템 콜 처리 함수의 시작 주소가 들어 있다.
결국 유저 프로세스가 시스템 콜을 요청하면, IDT 테이블과 sys_call_table 을 이용해 커널에서 구현된 시스템 콜 함수가 호출되는 것이다
'개발 관련 책 읽기 > 리눅스 커널 내부구조' 카테고리의 다른 글
Chapter 6 - Interrupt/Trap & System call(1) (0) | 2022.09.19 |
---|---|
Chapter 5 - 파일 시스템(3) (0) | 2022.09.19 |
Chapter 5 - 파일 시스템(2) (0) | 2022.09.19 |
Chapter 5 - 파일 시스템(1) (1) | 2022.09.19 |
Chapter 4 - 메모리 관리(3) (1) | 2022.09.19 |