본문 바로가기
컴퓨터 COMPUTER/Linux 리눅스

3. [System Call Handling] : 운영체제는 어떻게 시스템콜을 핸들링하는가. + System call vs. API

by 매실이 maesiri 2019. 1. 29.
반응형

* 참고로 아래 설명은 모두 리눅스 운영체제 기반의 내용입니다.

SYSTEM CALL :

이전 게시글에서 user mode 에서 kernel mode 로 가기 위해서 'system call' 이라는 것을 호출하면, system call handler 가 사용자가 원하는 행동을 할 수 있게끔 도와준다고 했다. System call은 돌아가는 프로그램과 운영체제 간에 인터페이스를 제공한다. 그럼 이 system call의 종류에는 무엇이 있을까?

시스템 콜은 기능에 따라 크게 세가지 - process management, file management, file system management - 로 나눌 수 있다.

① Process management : fork, waitpid, execve, exit, kill

② File management : open, close, read, write, ..

③ File system management : mkdir, rmdir, ..

학부 수준에서 꼭 알아야 하는건 위에 적은 것들 정도이다.

시스템 콜은 ingeter value 를 반환한다. 시스템 콜이 fail 할 시, -1을 반환한다.


SYSTEM CALL vs. API :

간혹 API 와 system call 을 헷갈릴 수 있다.

API 는 applicaton programming interface 의 줄임말로, system call 과 비슷하게 사용되지만, 약간의 차이가 있다. System call은 거의 항상 kernel mode 에 진입하지만, API 는 not necessarily.

간단한 예시로, libc 라는 라이브러리 안에 있는 malloc(), calloc(), free()는 POSIX-API 로, system call 이 아니다. 하지만 brk() 라는 system call을 사용한다. API 가 시스템 콜을 사용해서 어떤 기능을 수행할 수 있는 셈.


SYSTEM CALL HANDLING :

System call handling 은 어떻게 이루어지는가?

운영 체제를 이해함에 있어 이 부분은 굉장히 중요해서 시험에 무조건 나온다.

1. 커널모드 *스택* 에 레지스터 값을 저장한다. 여기에 저장되는건, system call이 어디에서 호출됐고 따라서 수행 후에 어디로 돌아가면 되는지 지칭해주는.. 그런 주소 값 비스무리.

2. *system call service routine*을 호출하여 기능 수행.

3. 핸들러로부터 나와서 스택에 저장해둔 레지스터 주소값으로 복귀, 유저모드로 다시 돌아간다.

그림으로 보면 좀 더 쉽게 이해할 수 있다. 열심히 발로그린 그림.



가장 왼쪽에서 시작하여 오른쪽으로 가는 화살표에서 시작한다.

User task에서 fork() 라는 system call 이 있었다고 가정하자. fork() 함수 안에 int $0x80 혹은 sysenter 라는 코드는 kernel code 로의 진입을 뜻한다. (위 예시의 경우 int $0x80)

위 그림의 int $0x80 은 IDT, interrrupt descript table 의 0x80 번째 칸의 system_call() 을 호출한다. IDT 는 이름처럼 특정 인터럽트가 있을 때 어디로 이동하여 기능을 호출해야하는지 저장해둔 테이블이다.

system_call() 안에 sys_call_table 을 부르는 코드에서 sys_call_table 로 이동하여 그 중 fork()를 찾는다. 이 테이블은 sys_fork() 의 주소로 보내준다.

sys_fork() 의 코드를 모두 수행한 후에 다시 거꾸로 유저모드로 돌아간다.

이 모든 일이 수행되어야 비로소 user task의 fork() 한 줄이 끝난다.


개인 공부 정리용으로 작성한 글입니다. 틀린 부분이 있을 수 있으니 참고용으로만 사용해주세요. 틀린 부분은 댓글로 알려주세요.♥


반응형