본 정리는 운영체제(Operating System: Concepts) 9th edition과 22학년도 1학기 건국대학교 운영체제 수업을 바탕으로 하고 있습니다.
운영체제를 살펴보는 관점에는 3가지가 있다.
1. 운영체제가 제공하는 서비스
2. 운영체제가 사용자 및 프로그래머에게 제공하는 인터페이스
3. 시스템의 구성 요소와 그들의 상호 연결
이번엔 두 번째 관점에 대하여 알아보자.
시스템 호출 (System Call)
앞서, 커널에 시스템 호출 함수들의 집합이 있고 이에 알맞는 커널 내부 함수를 호출한다고 하였다.
참고: https://developbear.tistory.com/91
이러한 시스템 호출 함수가 실행되게끔 하는 것이 바로 시스템 호출 (system call)이다.
주로, 응용 프로그램에서 시스템 호출이 일어난다.
예를 들어, 사용자 모드로 동작하는 응용프로그램이 open() 함수를 호출하였다고 가정해보자.
그렇다면 시스템 호출로 전환되어 커널 내의 시스템 콜 테이블(시스템 콜에 해당하는 함수의 주소를 저장 - )에서 해당 함수가 i번 커널 내부 함수임을 알아내어 처리가 이루어지고 끝나면 다시 사용자 모드로 돌아가 open 함수를 호출한 응용 프로그램의 다음 라인을 수행한다.
* 사용자모드? 커널 모드?
하드웨어 및 변화에 대한 보호를 위해 응용 프로그램이 원하는 처리를 하는 모드(사용자 모드 - 사용자 공간 상의 코드가 실행된다.)와 커널이 제어권을 점유하여 시스템 호출에 의한 처리를 하는 모드(커널 모드 - 커널 공간 상의 코드만 실행된다.)를 구분하는 것을 이중 모드 라고한다.
더 자세한 내용 참고: https://developbear.tistory.com/96
원래대로라면,
두 파일의 이름이 얻어지면 프로그램은 입력 파일을 오픈, 출력 파일을 생성 → 입력 파일로부터 정보를 읽어서 출력 파일에 기록을 하는 루프를 수행하여야한다.
이 수행을 위하여 아래 그림과 같은 시스템 호출이 모두 필요하다.
하지만, 사용자들은 이런 세세한 기능을 사용하고 있음을 알지 못한다.
이는 사용자가 응용 프로그래밍 인터페이스(Application Programming Inteface, API)에 따라 프로그램을 설계하고
API를 구성하는 함수들이 대신하여 시스템 호출을 부르기 때문이다. (ex. UNIX, Linux 시스템의 libc 라이브러리,open함수를 부르면 위의 시스템 호출들이 불리게 됨)
실행시간 지원 시스템(컴파일러와 함께 제공되는 라이브러리에 내장된 함수의 집합)은 시스템 호출 인터페이스(System call interface)를 제공한다.
여기에는 각 시스템 호출에 할당된 번호가 색인된 시스템 호출 테이블이 존재한다.
즉, 정리하면 다음의 과정을 거치게 된다.
1. API 함수 호출 (open 등등)
2. 시스템 호출 인터페이스로 인해 원하는 시스텀 호출
3. 시스템 호출 테이블이 시스템 호출이 어떤 함수를 실행해야하는지 주소를 담고 있어 해당 함수 실행
4. 사용자 모드로 반환값 반환
이러한 구현으로 사용자 코드는 복잡한 시스템 호출을 모두 할 필요가 없게되고 어떻게 실행되는지 구체적인 사항을 알 필요가 없어진다.
운영체제에 매개변수를 전달하는 방법
그렇다면 운영체제에 함수의 매개변수는 이것이다 라고 어떻게 전달할 수 있을까?
1. 레지스터를 통한 주소 전달 (in. Linux, Solaris)
메모리 상의 블록이나 테이블에 매개변수 값을 기록한 후 시작 주소를 레지스터에 기록
→ 커널에서 레지스터 상의 주소를 얻어 매개변수에 접근한다.
2. Stack를 통한 주소 전달
스택에 매개변수 값을 push → 커널에서 pop
* 커널은 시스템 호출 사실을 어떻게 알게 되는가?
시스템 호출 번호를 CPU 내 레지스터에 기록, 트랩(trap) 명령어를 실행하는 것을 통해 호출 사실을 알게 된다.
시스템 호출의 유형 7가지
1. 프로세스 제어 (Process Control)
2. 파일 조작 (File Management)
3. 주변 장치 조작 (Device Management)
4. 정보 관리 (책에서는 정보의 유지 Information Maintenance)
6. 통신 (Communication)
7. 보호 (Protection)
최종 정리
최종적인 정리를 위해, 리눅스에서 시스템 호출이 일어나는 과정을 그려보자.
1. user process에서 read함수(API 함수) 호출
2. API 함수 실행
→ 시스템 호출 번호가 CPU내 eax 레지스터에 저장되고 API함수에서 소프트웨어적인 트랩 명령어 int(interrupt)를 호출.
3. 커널에서 트랩 명령어 처리를 위해 트랩이 어떤 것인지 알아내기 위해 IDT(Interrupt Descriptor Table)에서 해당 트랩이 system call()임을 인지
*Linux에서는 트랩도 인터럽트의 하나로 처리
4. eax 레지스터에 저장된 3을 통해 3번 시스템 콜임을 인지하고 이를 시스템 콜 테이블에 전달
5. sys_read() 실행
'CS > 운영체제' 카테고리의 다른 글
[Chapter 3. 프로세스] 프로세스와 문맥 (0) | 2022.08.16 |
---|---|
[Chapter 2. 시스템 구조] 입출력 시스템을 위한 운영체제의 3가지 인터페이스 (시스템 콜, 커널-드라이버 인터페이스, HW 인터페이스), 시스템 콜이 처리되는 과정 (0) | 2022.08.15 |
[Chapter 2. 시스템 구조] 이중 연산 모드와 모드 비트 (0) | 2022.08.14 |
[Chapter 2. 시스템 구조] 운영체제가 제공하는 서비스 (0) | 2022.08.11 |
[Chapter 1. 서론] 컴퓨터 시스템과 운영체제 (0) | 2022.08.07 |