본문 바로가기
운영체제

[운영체제] 2. 컴퓨터 시스템과 운영체제 - (3) 커널과 시스템 호출

by NoDapKeepGoing 2025. 4. 9.

<2025.3.20.목요일 수업>

 

 

 

📍1. 응용프로그램의 직접 자원 접근 문제

1-1. 응용프로그램의 직접 자원 접근은 심각한 문제를 초래!

✔️오늘날 운영체제는 멀티프로그래밍 처리 방식을 지원

- 다수의 응용프로그램이 한 컴퓨터에서 동시에 수행

✔️응용프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 자원 훼손 발생
- 다른 응용프로그램이 적재된 메모리 내용 훼손 가능
- 다른 응용프로그램이 만든 파일 삭제 및 훼손 가능
- 응용프로그램이 커널이 적재된 영역 훼손 가능

✔️응용프로그램의 직접 자원 접근 불허
➡️ 자원에 대한 모든 접근은 커널에만 부여

 

1-2. 구체적인 해결 방법

1️⃣메모리 공간을 사용자 공간과 커널 공간으로 분리

응용프로그램은 사용자 공간에 적재, 커널 코드와 데이터는 커널 공간에만 적재

2️⃣CPU의 수행 모드를 사용자 모드와 커널 모드로 구분

- 응용프로그램은 사용자 모드에서만 수행, 커널 코드는 커널 모드에서만 수행
- 사용자 공간에서 커널 공간의 코드를 직접 접근하지 못하게 하기 위해
- 사용자 모드에서 커널 코드를 접근하면 응용 프로그램 강제 종료

3️⃣응용프로그램이 커널 기능을 이용하고자 할 때, 시스템 호출을 통해서만 커널 코드 이용 가능

 

 

📍2. 사용자 메모리 공간과 커널 메모리 공간 분할

2-1. 운영체제가 메모리를 두 공간으로 분리

1️⃣사용자 공간(user space)

모든 응용프로그램들이 나누어 사용하는 공간

2️⃣커널 공간(kernel space)

커널만 사용할 수 있는 공간

 

2-2. 분리 이유

✔️ 악의적인 응용 프로그램이나 코딩 실수로부터 커널 코드와 데이터 보호

 

2-3. 사용자 공간 크기

✔️ 한 응용 프로그램의 최대 크기 결정

프로그램 코드 + 데이터(전역변수) + 힙(동적할당) + 스택 합친 크기

e.g.) 32비트 Windows 운영체제에서 사용자 공간 2GB란 ➡️ 응용 프로그램을 2GB 크기 이상 개발할 수 없음

 

2-4. 사용자 공간의 주소 범위

✔️ 응용프로그램은 운영체제가 설정한 사용자 공간의 주소 범위를 넘어설 수 없음
e.g.)  32비트 Windows 운영체제에서, 응용프로그램은 0~7FFFFFFF 범위의 주소를 넘어 액세스하면, 바로 종료(심각한 오류)

 

✔️ 사용자 주소 공간은 운영체제가 만들어주는 가상 주소 공간임

- 응용 프로그램 관점에서 보는 주소 범위

- 응용 프로그램 크기는 가상 주소 공간 크기에 제약됨

 

2-5. 응용 프로그램들의 사용자 공간 충돌 시 해결 방법: 재배치

✔️ 각 응용 프로그램의 가상 주소 공간*을 물리 주소 공간으로 매핑

= 서로 다른 프로그램들이 충돌 없이 동시에 실행될 수 있도록 메모리를 관리

(*가상 주소 공간: 응용 프로그램이 자신만의 독립된 메모리 공간처럼 사용하는 주소 영역)
✔️ 물리 메모리를 여러 응용 프로그램의 사용자 공간이 나누어 사용

➡️  각 프로그램이 자기만의 독립된 메모리처럼 사용하되, 실제 메모리에서는 충돌 없이 운영되도록 운영체제가 주소 변환을 해준다는 의미

 

2-6. 물리 메모리가 작은 경우 해결 방법: 가상 메모리

✔️ 운영체제는 보조기억장치의 영역을 물리 메모리 영역으로 간주함

 

 

📍3. CPU의 사용자 모드와 커널 모드 구분

3-1. CPU는 사용자 모드와 커널 모드 중 한 모드로 수행됨

✔️ CPU 내부에 모드 상태를 나타내는 ‘모드 비트(mode bit)’ 존재

 

3-2. 사용자 모드(user mode)

✔️ CPU의 모드 비트 = 1
✔️ CPU는 사용자 공간에 있는 코드나 데이터를 수행하는 중
✔️ CPU의 커널 공간 접근 불허 ➡️ 커널 코드나 데이터, 자료구조 보호
✔️ 특권 명령(privileged instruction) 수행 불허

 

3-3. 커널 모드(kernel mode, supervisor mode)

✔️ CPU의 모드 비트 = 0
✔️ CPU가 커널 공간에 있는 코드나 데이터를 수행하는 중
✔️ 특권 명령 사용 가능

 

3-4. 특권 명령어 종류

1️⃣ I/O 명령
- 하드웨어 제어 및 장치로부터의 입출력
   e.g.) in eax, 300 ;I/O 포트 300 번지에서 값을 읽어 eax 레지스터에 저장
            out 301, eax ; eax 레지스터에 있는 값을 I/O 포트 301 번지에 쓰기

2️⃣ Halt(정지) 명령
- CPU의 작동을 중지시키는 명령

- 인터럽트 플래그를 켜고 끄는 명령
3️⃣ CPU 내에 있는 인터럽트 플래그 비트를 제어하여 CPU가 인터럽트를 허용하거나 무시하도록 지시
   e.g.) cli(clear interrupt)/sti(set interrupt) 명령

4️⃣ 타이머 설정 명령 / 컨텍스트 스위칭 명령

5️⃣ 메모리 지우기 명령 / 장치 상태 테이블 수정 등의 명령

 

3-5. 사용자 모드와 커널 모드에서 메모리 접근

 

3-6. 사용자 모드에서 커널 모드로 전환(mode switching)

➡️ 시스템 호출과 인터럽트 발생

e.g.) 시스템 호출을 통해 사용자 모드에서 커널 모드로 전환

 

3-6-1. 시스템 호출(system call)

✔️ 시스템 호출을 수행하는 특별한 기계 명령에 의해 진행
e.g.) int 0x80 / sysenter / trap / syscall 등 CPU마다 다름

✔️ 기계 명령이 CPU의 모드 비트를 커널 모드로 전환(1 ➡️ 0)

 

3-6-2. 인터럽트(interrupt)

✔️ CPU가 인터럽트 신호를 수신하면 커널 모드로 자동 전환
✔️ CPU는 커널 공간에 있는 인터럽트 서비스 루틴(ISR) 수행
✔️ ISR 수행이 끝나면 CPU는 사용자 모드로 자동 전환(0 ➡️ 1)

 

3-7. 컨텍스트 스위칭이 발생하는 사건

1️⃣ 프로세스 또는 스레드 스케줄링을 발생시키지 않는 시스템 호출과 인터럽트
CPU 컨텍스트 스위칭* 발생

(* CPU 컨텍스트 스위칭: CPU가 실행 중인 프로세스를 바꾸는 행위)

 

2️⃣ 프로세스 또는 스레드 스케줄링을 발생시키는 시스템 호출과 인터럽트
CPU 컨텍스트 스위칭 & 커널 컨텍스트 스위칭* 발생

(* 커널 컨텍스트 스위칭: 커널 내부에서 커널 스레드들 간에 실행을 전환하는 행위)

용어 의미
CPU 컨텍스트 스위칭 실행 중인 프로세스나 스레드를 다른 것으로 교체 시 발생
커널 컨텍스트 스위칭 커널 내부에서 커널 스레드 간 전환 혹은 커널 모드 간 흐름 전환 시 발생

 

 

3-8. 사용자 모드와 커널 모드의 비교

 

 

📍4. 커널의 실체

4-1. 커널의 정의

✔️ 부팅 시에 커널 공간에 적재된 함수들과 데이터 집합

✔️ 커널은 컴파일된 바이너리 형태, 하드디스크 특정 영역에 저장, 부팅 시에 커널 공간의 메모리에 적재

4-2. 커널은 프로세스*인가?

(*프로세스: OS가 실행 중인 프로그램을 관리하기 위해 만들어 놓은 실행 단위 + 그에 필요한 자원 묶음 = 코드 + 현재 상태 + 자원들)

 

✔️ No!

수행 중인 프로그램이 필요한 커널 함수를 호출 (예: 단일체 커널)

☑️ 단일체 커널 구조의 특징
운영체제의 핵심 기능이 모두 하나의 커다란 실행 단위로 묶여 있음

(시스템 콜 처리, 파일 시스템, 메모리 관리, 디바이스 드라이버 등 전부 커널 공간(Kernel space)에서 실행 

➡️ 커널 코드가 실행되지만, 별도의 프로세스로 존재하지는 않음

 

✔️ Yes!

커널 기능이 분리되어 프로세스로 수행 (예: 마이크로 커널)

☑️ 마이크로 커널 구조의 특징

- 커널의 기능을 최소화(스케줄링, IPC, 메모리 관리 정도만 포함)

- 나머지 기능(파일 시스템, 디바이스 드라이버 등)은 일반 프로세스로 분리하여 실행

➡️ 커널 구성 요소들이 독립적인 프로세스나 서버로 실행

 

4-3. 커널은 스택이나 힙을 가지는가?

✔️ 스택과 힙은 프로세스 또는 스레드가 생성될 때 할당됨