- 목차 -
1. 운영체제의 역할과 구조
2. System Call
3. Modebit
4. Trap
5. Interrupt
6. DMA Controller
1. 운영체제의 역할과 구조
2. System Call
- 운영체제가 Kernel에 접근하기 위한 인터페이스
- Kernel 함수를 호출할 때 사용
- 유저 프로그램에서 수행하는 작업이 Kernel에서 동작해야 하는지 판단 (하드웨어 자원에 접근하는 작업)
2.1 System Call 동작방식
- 유저 프로그램에서 시스템 호출 요청 : 유저 프로그램은 라이브러리 함수(예: C의 printf, open, read 등)를 통해 시스템 호출을 요청합니다.
- 시스템 호출 트랩(Trap) : 유저 모드에서 커널 모드로 전환하는 방식은 트랩(Trap) 명령어를 사용하여 이루어집니다. 트랩은 특별한 종류의 CPU 명령어로, CPU는 트랩이 발생하면 커널 모드로 전환하고, 시스템 호출 테이블을 참조하여 적절한 핸들러를 호출합니다.
- 커널 모드에서 시스템 호출 처리 : 커널은 시스템 호출 번호를 기반으로, 요청된 작업이 무엇인지 확인하고 적절한 작업을 수행합니다. 예를 들어, 파일을 읽으라는 요청이면, 커널은 파일 시스템에서 파일을 찾아 데이터를 읽고, 해당 데이터를 유저 프로그램으로 전달합니다.
- 결과 반환 및 유저 모드로 복귀 : 작업이 완료되면, 커널은 유저 프로그램으로 결과를 반환하고, CPU는 다시 유저 모드로 전환하여 프로그램이 계속 실행됩니다.
Memory (Process, Thread) → System Call → Kernel → OS
3. Modebit
- 현재 CPU가 User Mode 혹은 Kernel Mode에서 실행 중인지 판단하는 Flag 변수
- System Call이 발생하면, CPU는 트랩(Trap)을 발생시켜 Mode Bit을 변경하고, 커널 모드로 전환
4. Trap
- CPU가 Kernel Mode로 전환이 필요할 때 발생시키는 것
- 유저 프로그램에서 하드웨어 자원에 접근이 필요할 때 발생시킴
- 프로세스 오류가 발생했을 때 발생시킴
- 위 두 작업 모두 Kernel Mode에서 동작해야 하기 때문에 Trap을 발생시켜 Kernel Mode로 전환
5. Interrupt
5.1 CPU 권한 레벨 (Privilege Levels)
CPU는 권한 레벨을 통해 코드가 어느 정도의 시스템 자원에 접근할 수 있는지를 결정합니다. 대표적으로 x86 아키텍처에서는 4개의 권한 레벨이 존재하며, 이는 Protection Rings라고 불립니다
- Ring 0: 가장 높은 권한을 가진 커널 모드. 운영체제의 커널과 같은 중요한 시스템 코드가 이 권한을 사용합니다.
- Ring 3: 가장 낮은 권한을 가진 유저 모드. 응용 프로그램이 실행되는 모드입니다.
그 외에 Ring 1, Ring 2도 존재하지만, 대부분의 운영체제는 주로 Ring 0과 Ring 3만을 사용합니다.
유저 모드에서 실행 중인 프로그램은 하드웨어 자원에 직접 접근할 수 없으며, 제한된 시스템 호출을 통해서만 커널 자원에 접근할 수 있습니다. 커널 모드는 시스템의 모든 자원에 접근할 수 있는 권한을 가집니다.
5.2 세그먼트 디스크립터와 권한 확인
권한을 확인하는 핵심 요소는 세그먼트 디스크립터(Segment Descriptor)입니다. x86 아키텍처에서 메모리 접근은 세그먼트 방식으로 이루어지며, 각각의 세그먼트는 세그먼트 디스크립터에 의해 정의됩니다.
세그먼트 디스크립터는 GDT(Global Descriptor Table)에 저장되며, 각 세그먼트의 권한 레벨과 메모리 경계를 정의합니다.
세그먼트 디스크립터는 다음과 같은 정보를 포함하고 있습니다:
- Base Address : 세그먼트의 시작 주소
- Limit : 세그먼트의 크기
- Privilege Level : 해당 세그먼트에 접근할 수 있는 권한 레벨 (0 ~ 3)
- Type : 코드 세그먼트, 데이터 세그먼트 여부 등
CPU는 인터럽트가 발생했을 때, 현재 실행 중인 코드의 세그먼트 디스크립터를 확인합니다. 이 세그먼트 디스크립터는 현재 코드의 권한 레벨을 나타내며, CPU는 이를 통해 현재 권한과 인터럽트 처리에 필요한 권한을 비교합니다.
5.3 권한 확인 과정
- 현재 권한 확인: 인터럽트가 발생하면, CPU는 현재 실행 중인 코드의 세그먼트 디스크립터를 참조하여, 해당 코드가 어떤 권한 레벨(Ring)에서 실행 중인지 확인합니다.
- 인터럽트 처리 권한 확인: CPU는 인터럽트 벡터 테이블(IDT)에서 해당 인터럽트 핸들러의 세그먼트 디스크립터를 확인합니다. 이 세그먼트 디스크립터에는 해당 핸들러가 Ring 0에서 실행되어야 한다는 정보가 포함되어 있습니다. 즉, CPU는 인터럽트 핸들러가 커널 모드(Ring 0)에서 실행되어야 함을 인식합니다.
- 권한 비교: CPU는 현재 실행 중인 코드의 권한 레벨(Ring 3)과, 인터럽트 핸들러가 실행될 권한 레벨(Ring 0)을 비교합니다. 만약 현재 권한이 낮고(Ring 3), 인터럽트 핸들러가 더 높은 권한에서 실행되어야 한다면(Ring 0), CPU는 권한 상승을 수행합니다.
5.4 모드 비트 변경 및 커널 모드 전환
권한 확인이 끝나면 CPU는 모드 비트를 변경하여 유저 모드(Ring 3)에서 커널 모드(Ring 0)로 전환합니다.
- 권한 상승 : CPU는 모드 비트를 변경하여 커널 모드로 전환하고, 시스템 자원에 대한 접근 권한을 확대합니다.
- 스택 전환 : 권한 레벨이 바뀌면, CPU는 자동으로 커널 스택으로 전환합니다. 유저 모드에서 사용하는 스택과 커널 모드에서 사용하는 스택은 분리되어 있습니다. 인터럽트가 발생하면 CPU는 커널 모드 전용 스택을 사용하여 인터럽트 처리를 안전하게 수행합니다.
- 인터럽트 핸들러 실행 : 커널 모드에서 안전하게 인터럽트 핸들러를 실행합니다.
인터럽트 핸들러 수행이 완료되면 수행 중이던 작업의 권한을 확인하고 권한을 변경합니다.
5.5 권한 확인과 모드 전환 과정 정리
- 인터럽트 발생 : 하드웨어나 소프트웨어에서 인터럽트가 발생.
- 현재 권한 확인 : CPU는 현재 실행 중인 코드의 세그먼트 디스크립터를 통해 권한 레벨(Ring)을 확인.
- 인터럽트 핸들러 권한 확인 : 인터럽트 벡터 테이블을 통해 인터럽트 핸들러의 권한 레벨을 확인.
- 권한 비교 : 현재 권한과 인터럽트 핸들러의 권한을 비교하여, 필요하면 권한 상승.
- 모드 비트 변경 및 커널 모드 전환 : CPU는 모드 비트를 변경하여 유저 모드에서 커널 모드로 전환.
- 커널 스택 전환 : 커널 전용 스택을 사용하여 안전하게 인터럽트 핸들러 실행.
- 인터럽트 핸들러 실행 : 커널 모드에서 인터럽트 핸들러를 실행하여 인터럽트 처리.
6. DMA Controller
- I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
- CPU에 너무 많은 Interrupt 요청이 들어가는 것을 막음 (I/O Interrupt를 같이 부담함)
- 하나의 작업을 CPU와 DMA Controller가 동시에 하는 것을 방지
'CS' 카테고리의 다른 글
디자인 패턴 (4) | 2024.10.28 |
---|---|
IP 주소 (0) | 2024.10.13 |
메모리 구조 (Stack, Heap) (1) | 2024.09.29 |
메모리 (0) | 2024.09.29 |