1. Trpa, System call, Exception?
우선 System call의 정의와 역할에 대해서 알아보자. System call이란 OS Kernel이 제공하는 어플리케이션으로, 간접적으로 추상화된 하드웨어 접근을 이용하여 의도한 기능을 얻음과 동시에 OS 및 하드웨어를 많은 위험으로 부터 보호하는 기능을 한다. system call을 사용하는 이유는 모든 process가 하드웨어 및 OS 자원은 공유되는데, 이를 직접적으로 접근하면 간섭 및 오류가 날 가능성이 있기 때문이다. 그렇기 때문에 user mode의 OS 및 하드웨어의 직접적인 접근을 막고, system call을 통해 모든 기능이 활성화된 kernel mode로 이러한 기능을 수행하도록 하는 것이다.
system call을 호출 과정에서 trap(interrupt)이 발생되어야 하는데, 여기서 trap(exception, fault)이란, breakpoint, 잘못된 메모리 접근, 잘못된 나눗셈 등과 같이 예외 조건에 의해 발생되는 동기화 간섭(synchronous interrupt)의 한 종류이다. 이 trap에 빠지게 되면 기존에 실행중이던 프로세스의 흐름을 반환하기 전에 사전에 정의된 행동을 취하기 위해 kernel mode로 전환되는데, 이러한 특성으로 부터, trap은 context switch를 발생시키기 위해 의도적으로 interrupt하는 것을 의미하기도 한다.
하지만, Trap의 개념은 사용처에 따라 다르게 정의되어 있는듯 하다. Intel x86을 기준으로 보면, Interrupt는 Timer interrupt와 같은 HW Interrupt와 Singnal(혹은 System call)과 같은 SW Interrupt로 분류되고, Instruction 실행중에 발생하는 에러 컨디션인 Exception에 Trap(예를 들어 Breakpoint, Overflow)이 포함된 것으로 바라본다고 한다.
하지만 다른 곳에서는 Interrupt를 비동기적 이벤트를 처리하는 기법으로, Trap을 Devide by zero와 같은 프로그램 에러를 포함하는 동기적 이벤트를 처리하기 위한 기법으로 바라보기도 한다. 이상했던게 system call은 interrupt에 포함되는데 왜 system call 호출에 trap이 발생한다는 걸까? 라고 햇갈렷는데, 결국 받은 system call(signal) 이벤트는 Interrupt로 처리하는 것이고, system call 호출 시에는 깊게 살펴보면 Trap이 관여되어 있다는 것이다(받냐, 주냐의 관점 차이! 이건 system call 호출 과정에서 자세히 알아보자). 중요한 것은 Interrupt와 Trap 모두 이벤트를 처리하는 기법이고, Interrupt는 비동기적 이벤트를, Trap은 동기적 이벤트를 OS에 요청 및 처리하는 기법을 의미하며 Kernel으로 전환되어 Handle된다고만 알아두자
2. System call 호출 과정
User process가 실제 system call을 호출하는 방법을 살펴보자면, User process가 IDT(Interrupt Descriptor Table)에 system_call로 등록된 trap을 의도적으로 발생시켜 kernel mode로 전환하고, system_call처리 시 sys_call_table로 부터 eax 레지스터로에 저장된 systeam call값을 참조하여 의도한 system call을 호출한다. 이렇게 호출된 system call은 kernel mode에서 user mode가 접근하지 못하는 자원들을 대신 사용하며 요청된 행동을 대신 취해주고 도출된 결과를 레지스터로 공유하여 user mode가 그 결과를 사용하게 된다.
이러한 과정을 바탕으로 유저가 정의하는 Application은 직접적으로 OS 및 하드웨어 자원에 접근하지 않으면서 안전하게 요구한 기능을 달성할 수 있게 되는 것이다. C를 이용하는 경우, 대부분의 시스템 콜은 libc를 통한 Wrapper Function 형태로 제공받을 수 있다고 한다.
IDT(Interrupt Descriptor Table)
sys_call_table : syscall_64.tbl
-> 시스템 콜의 고유번호를 저장하는 테이블, 시스템 콜의 symbol 정보의 집합이다 (리눅스 소스코드에서 흩어진 시스템 콜의 주소를 저장하는 테이블로 이 시스템 콜 주소는 링커가 자동으로 관리한다)
syscalls.h
-> 시스템 콜 함수들의 prototype들, 다른 OS소스에서 사용할 때 참조 및 링크를 위해서 인듯 하다.
system call
-> 실제 system call의 로직, 아래는 직접 추가한 queue관리 시스템 콜이다.
'학교 공부 > OS' 카테고리의 다른 글
운영 체제 (Operating System) - Task Scheduler에서 Priority 조정을 위한 System Call 구현 (0) | 2021.11.28 |
---|---|
운영 체제 (Operating System) - CPU Scheduling (0) | 2021.11.28 |
운영 체제 (Operating System) - Computer Architecture (0) | 2021.11.28 |
운영 체제 (Operating System) - Process (0) | 2021.11.28 |
운영 체제 (Operating System) - 운영체제 구조 (2) (0) | 2021.11.28 |