커널(Kernel)
운영체제는 우리 컴퓨터에서 아주 많은 기능을 담당한다. 그중에서도 '자원에 접근하고 조작하는 기능', '프로그램이 올바르고 안전하게 실행되게 하는 기능' 등, 가장 핵심적인 서비스들을 담당하는 부분을 커널(kernel)이라고 한다.
(* 사용자 인터페이스인 GUI와 CLI는 컴퓨터와 상호작용하기 위한 통로일 뿐 커널에 속한 기능은 아니다)
커널의 핵심 역할
이중 모드와 시스템 호출
: 운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 응용 프로그램이 CPU, 메모리, HDD 등에 마음대로 접근하고 조작할 수 있다면 자원이 무질서하게 관리될 것이고, 응용 프로그램이 조금만 실수하더라도 컴퓨터 전체에 큰 영향을 끼칠 수 있기 때문이다.
이중모드(dual mode): CPU가 명령어를 실행하는 모드를 '사용자 모드'와 '커널 모드'로 구분하는 방식
- 사용자 모드(user mode)
- 일반적인 응용 프로그램이 실행되는 모드
- 입출력 명령어와 같이 하드웨어 자원에 접근하는 커널 영역 코드를 실행할 수 없다
- 커널 모드(kernel mode)
- 운영체제가 실행되는 모드
- 커널 영역의 코드를 실행할 수 있다. 즉, 자원에 접근할 수 있다
시스템 호출(system call): '사용자 모드'의 프로그램이 자원에 접근하기 위해 '커널 모드'로의 전환을 요청하는 것
- 시스템 콜은 소프트웨어적인 인터럽트이다
- 시스템 콜이 일어나면 다음과 같은 순서로 동작한다
- 응용 프로그램이 자원에 접근하기 위해 시스템 콜을 호출
- CPU는 지금까지의 응용 프로그램 작업을 백업
- 시스템 콜에 의해 '사용자 모드'에서 '커널 모드'로 전환
- '커널 모드'에서 자원에 접근하는 코드 실행
- 다시 '사용자 모드'로 복귀하여 응용 프로그램의 작업을 진행
시스템 호출의 종류 (Unix, Linux)
- 프로세스 관리
- fork() : 새 자식 프로세스 생성
- execve() : 프로세스 실행(메모리 공간을 새로운 프로그램의 내용으로 덮어 씌움)
- exit() : 프로세스 종료
- waitpid() : 자식 프로세스가 종료할 때까지 대기
- 파일 관리
- open(), close(), read(), write() : 파일 열기, 닫기, 읽기, 쓰기
- stat() : 파일 정보 획득
- 디렉터리 관리
- chdir() : 작업 디렉터리 변경
- mkdir() : 디렉터리 생성
- rmdir() : 비어있는 디렉터리 삭제
- 파일 시스템 관리
- mount() : 파일 시스템 마운트
- umount() : 파일 세스템 마운트 해제
커널 역할의 세분화
: 위에서 다룬 커널 작업들을 좀 더 자세히 보면 다음과 같다
- 프로세스의 생성, 스케줄링, 상태 관리와 같은 프로세스를 관리하는 역할
- 메모리, CPU, 입출력 장치 등을 관리하여 프로세스 간의 자원 충돌 방지 및 시스템의 효율성을 높이는 시스템 자원 접근 및 할당
- 파일의 생성, 삭제, 읽기, 쓰기 작업을 관리하는 파일 시스템 인터페이스를 제공하여, 데이터를 안전하게 저장 및 접근하는 역할
세분화한 내용들은 다른 글에서 자세히 다루도록 하겠다
하이퍼바이저 모드(Hypervisor Mode)
위에서는 커널의 이중 모드를 소개하였지만, 사실 가상 머신(VM, Virtual Machine)을 제공하는 현대 CPU는 하이퍼바이저 모드(hypervisor mode)라는 추가적인 모드를 지원한다
Virtual Machine?
- 소프트웨어적으로 만들어낸 가상 컴퓨터를 의미
- VM에서는, 실제 컴퓨터처럼 새로운 OS와 응용 프로그램을 설치하고 실행할 수 있다
Hypervisor Mode
- 그러나 VM 또한 응용 프로그램이기 때문에 '사용자 모드'로 작동하고, VM의 운영체제 역시 '사용자 모드'로 작동한다
- 따라서 VM의 응용 프로그램이 '커널 모드'로 전환된다 하더라도 실제 컴퓨터의 '커널 모드'를 사용할 수 없는데, 이를 해결하기 위해 가상 머신을 위한 '하이퍼바이저 모드'를 통해 실제 컴퓨터의 '커널 모드'의 서비스를 제공받을 수 있다
Reference
- 혼자 공부하는 컴퓨터구조 + 운영체제 (CH.9 운영체제 시작하기)