※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 반드시 댓글로 알려주세요!
[ 1 ] system call
만약 사용자가 실행하고 있는 응용 프로그램이 CPU, 메모리 등에 직접 접근하고 조작할 수 있다면 하드웨어 자원이 무질서하게 관리될 것이다. 이에 OS는 CPU의 실행 모드를 User mode와 Kernel mode로 나누어 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하며 자원을 보호하는 역할을 한다.
그렇다면 user mode와 kernel mode는 무엇일까?
User mode는 단지 응용 프로그램이 실행되는 모드이며 I/O 장치 제어 명령어 등의 Privilege 명령어 실행, 레지스터 접근 등이 불가하다.
이와 달리 kernel mode는 모든 권한을 가진 실행 모드이자 운영체제가 실행되는 모드이며 앞서 언급한 Privilege 명령어 실행이나 레지스터 접근이 가능하다.
user mode에서 실행 중인 응용 프로그램이 Privilege 명령어 실행이나 레지스터 접근 등 Kernel mode의 권한이 필요한 기능을 수행하기 위해서는 user mode에서 kernel mode로 실행 모드를 전환(mode switch라 한다)해야 하며, 이를 지원하는 인터페이스가 바로 system call이다.
단, 응용 프로그램은 system call을 직접 호출하기보다 대부분 Standard C Library와 같은 High Level API를 사용하여 system call을 호출한다.
[ 2 ] system call 호출 루틴
user mode에서 응용 프로그램이 실행되고 있고, 실행 중인 프로그램의 코드 내부에 I/O를 수행해야 하는 printf() 함수가 있다고 가정할 때 system call 호출 루틴은 다음과 같다.
① User mode에서는 I/O 장치 제어 명령어를 수행할 수 없으므로 printf()를 호출하면 Wrapper Routine이 실행된다.
② Wrapper Routine에 printf()에 대응되는 System call function의 System call number와 파라미터가 담기고, 0x80 trap instruction이 발생한다.
※ 파라미터는 레지스터에 바로 저장되거나, 파라미터의 수가 많다면 메모리의 어딘가에 저장된 후 메모리 시작 주소를 레지스터에 넣어 전달된다.
③ 0x80 trap으로 인해 User mode에서 kernel mode로 mode switch가 발생하고, trap handler는 System call function number를 통해 System call table에서 그에 맞는 System call function을 찾아 System call handler를 호출한다.
④ System call handler는 파라미터를 복사하여 kernel 내에서 연산을 독립적으로 수행한 후 연산 결과를 다시 user 영역으로 복사한다.
※ 파라미터를 커널이 사용 가능한 메모리 영역으로 복사하여 커널 내에서 독립적으로 연산을 수행하는 데, 그 이유는 유저 영역과 커널 영역을 분리하여 커널을 malicious(악의적인 - cpu를 조작하는 등)한 상황으로부터 보호하기 위함이다.
⑤ Kernel mode에서 User mode로 mode switch가 발생한다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제 OS] 프로세스와 스레드, 그리고 병렬처리 (2) | 2023.06.14 |
---|---|
[운영체제 OS] Monolithic kernel, Micro kernel (1) | 2023.05.08 |
[운영체제 OS] 운영체제의 역사 - Mainframe, Spooling, Multiprogramming, Timesharing (1) | 2023.04.18 |
[운영체제 OS] 운영체제란? (1) | 2023.04.16 |