※ 본문은 혼자 공부한 것에 대한 기록입니다. 혹시 잘못된 상식이 있다면 댓글로 알려주세요!
( 1 ) 시스템 호출
사용자가 실행하는 응용 프로그램이 CPU, 메모리 등에 직접 접근하여 조작할 수 있다면 하드웨어 자원이 질서정연하게 관리될 것입니다. 이에 OS는 CPU의 실행 모드를 사용자 모드와 커널 모드로 구분하여 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하고 자원을 보호한다.
그렇다면 사용자 모드와 커널 모드는 무엇일까요?
사용자 모드는 응용 프로그램이 실행되는 모드일 뿐이며, I/O 장치 제어 명령, 레지스터 접근과 같은 권한 명령 실행이 허용되지 않습니다.
이와 달리 커널 모드는 모든 권한을 가진 실행 모드로 운영체제가 실행되는 모드로 앞서 언급한 Privilege 명령어 실행이나 레지스터 접근이 가능하다.
사용자 모드에서 실행되는 응용 프로그램이 권한 명령 실행이나 레지스터 액세스와 같이 커널 모드 권한이 필요한 기능을 수행하려면 실행 모드를 사용자 모드에서 커널 모드로 전환(모드 스위치라고 함)해야 하며 인터페이스 이를 지원하는 것으로 전환해야 합니다. 하자마자 시스템 호출오전.
그러나 대부분의 응용 프로그램은 시스템 호출을 직접 호출하지 않고 표준 C 라이브러리와 같은 고급 API를 사용하여 시스템 호출을 호출합니다.
( 2 ) 시스템 호출 호출 루틴
응용 프로그램이 사용자 모드로 실행 중이고 실행 중인 프로그램의 코드 내부에 I/O를 수행해야 하는 printf() 함수가 있다고 가정하면 시스템 호출 호출 루틴은 다음과 같습니다.
① 사용자 모드에서는 I/O 장치 제어 명령을 실행할 수 없으므로 printf() 호출 시 wrapper 루틴이 실행됩니다.
② Wrapper 루틴에는 시스템 호출 번호와 printf()에 해당하는 시스템 호출 함수의 매개변수가 포함되며 0x80 트랩 명령이 발생합니다.
※ 매개변수는 레지스터에 직접 저장하거나 매개변수가 많은 경우 메모리 어딘가에 저장하고 메모리 시작 주소를 레지스터에 넣어 전송합니다.
③ 0x80 트랩으로 인해 사용자 모드에서 커널 모드로 모드 전환이 발생하고 트랩 처리기는 시스템 호출 함수 번호를 통해 시스템 호출 테이블에서 적절한 시스템 호출 함수를 찾아 시스템 호출 처리기를 호출한다.
④ 시스템 콜 핸들러는 매개변수를 복사하여 커널 내에서 독립적으로 연산을 수행한 후 연산 결과를 다시 사용자 영역으로 복사한다.
※ 커널이 사용할 수 있는 메모리 영역에 매개변수를 복사하고 커널 내에서 독립적으로 연산을 수행하는데, 이는 사용자 영역과 커널 영역을 분리함으로써 악의적인 상황(악의적 – CPU 조작 등)으로부터 커널을 보호하기 때문입니다. 하는 것이다
⑤ Kernel 모드에서 User 모드로 모드 전환이 발생합니다.