커널
운영체제의 알맹이입니다. 기계가 켜져 있는 동안 내려가지 않습니다. 하드웨어에 손댈 수 있는 권한을 혼자 쥡니다. 다른 프로그램은 정해진 창구로 부탁합니다.
상세
은행 금고 안쪽으로 들어가는 사람은 직원뿐입니다. 손님은 창구에서 무엇이 필요한지 말합니다. 직원이 금고에 들어가 대신 꺼내 옵니다.
커널은 하드웨어를 다룰 권한을 독점하고 그 권한을 다른 프로그램 대신 써 주는 소프트웨어입니다. 성질은 셋으로 셉니다. 기계가 켜져 있는 동안 늘 떠 있습니다. 하드웨어에 손댈 수 있는 특권 상태를 혼자 씁니다. 그 권한이 필요해진 프로그램에게는 정해진 창구로만 대신 해 줍니다.
프로세서는 두 상태를 가릅니다. 하나는 무엇이든 할 수 있는 상태입니다. 다른 하나는 제한된 상태입니다. 커널의 코드는 앞쪽에서 돕니다. 응용 프로그램의 코드는 뒤쪽에서 돕니다. 뒤쪽에서 도는 코드는 장치를 직접 건드리지 못합니다. 남의 메모리를 읽지도 못합니다.
flowchart TD
A[응용 프로그램] -->|정해진 창구| B[커널]
B -->|특권 상태| C[하드웨어]
A -.->|직접 접근은 막힌다| C
두 상태 사이를 넘는 문은 좁습니다. 프로그램이 그 문을 두드리면 프로세서가 상태를 바꾸고 커널의 코드로 넘어갑니다. 일이 끝나면 다시 제한된 상태로 돌아옵니다. 문 안쪽에 무엇을 놓을지는 커널마다 갈립니다. 그 갈림이 아래 「갈래」의 축입니다.
배경
기계 한 대에 프로그램을 여럿 겹쳐 올리자 불편이 생겼습니다. 아무 프로그램이나 장치와 메모리를 직접 만지면 하나가 잘못 도는 순간 남의 것까지 망가집니다. 누가 무엇을 쥐는지 정해 줄 자리가 필요해졌습니다.
Brinch Hansen 은 1970년 논문에서 그 자리를 nucleus 라고 부릅니다. 다중 프로그래밍과 내부·외부 프로세스 사이의 통신을 이 nucleus 가 조율한다고 적습니다. nucleus 를 입출력과 저장 보호와 인터럽트 시스템을 완전히 통제하는 인터럽트 응답 프로그램이라고 적습니다. 같은 논문은 이것을 독립된 프로세스로 보지 않는다고 적습니다. 하드웨어 구조의 소프트웨어 확장으로 본다고 적습니다. 그렇게 해서 컴퓨터가 다중 프로그래밍에 더 알맞아진다고 적습니다.
무엇을 그 안에 남길지도 같은 논문이 갈라 적습니다. 모든 특권 기능이 nucleus 에 구현된다고 적습니다. 그런데 nucleus 에는 내장된 전략이 없다고 적습니다. 전략은 여러 상위 레벨에서 도입될 수 있다고 적습니다. 거기서는 각 프로세스가 자기 자식들의 스케줄링과 자원 할당을 통제할 힘을 갖는다고 적습니다. nucleus 가 강제하는 규칙은 둘뿐이라고 적습니다. 프로세스는 자기 자원의 부분집합만 자식에게 줄 수 있다고 적습니다. 프로세스는 자기 자식만 시작하고 멈추고 제거할 수 있다고 적습니다.
알맹이를 가리키는 이름은 논문마다 다르게 붙었습니다. Ritchie 와 Thompson 은 1974년 시분할 시스템 논문에서 kernel 이라는 낱말을 씁니다. 그 시스템의 kernel 이 90K 바이트를 차지한다고 적습니다. 코드와 데이터 표가 거의 반씩이라고 적습니다. 다만 이 시스템이 아주 많은 수의 디바이스 드라이버를 담고 있다고 덧붙입니다. 입출력 버퍼와 시스템 표에 넉넉한 자리를 쓰고 있다고도 덧붙입니다.
예시
Windows
Microsoft 공식 문서는 Windows 를 돌리는 컴퓨터의 프로세서가 사용자 모드와 커널 모드라는 두 모드로 동작한다고 적습니다. 실행하는 코드의 종류에 따라 프로세서가 두 모드 사이를 오간다고 적습니다. 애플리케이션은 사용자 모드에서 동작한다고 적습니다. 핵심 운영체제 구성요소는 커널 모드에서 기능한다고 적습니다. 많은 드라이버가 커널 모드에서 동작하지만 일부는 사용자 모드에서도 기능할 수 있다고 적습니다.
같은 문서는 두 모드가 무엇을 내주는지도 적습니다. 사용자 모드로 애플리케이션을 띄우면 Windows 가 그것을 위한 프로세스를 만든다고 적습니다. 이 프로세스가 사설 가상 주소 공간과 사설 핸들 테이블을 준다고 적습니다. 주소 공간이 사설이라 한 애플리케이션이 다른 애플리케이션의 데이터를 고칠 수 없다고 적습니다. 그래서 애플리케이션이 죽어도 다른 애플리케이션이나 운영체제에 영향을 주지 않는다고 적습니다. 커널 모드는 반대라고 적습니다. 커널 모드에서 도는 모든 코드가 하나의 가상 주소 공간을 공유한다고 적습니다. 그래서 커널 모드 드라이버는 다른 드라이버나 운영체제로부터 격리되지 않는다고 적습니다. 커널 모드 드라이버가 잘못된 가상 주소에 쓰면 운영체제나 다른 드라이버에 속한 데이터를 훼손할 수 있다고 적습니다. 커널 모드 드라이버가 죽으면 운영체제 전체가 죽는다고 적습니다.
Linux
Linux 커널 공식 문서는 시스템 콜을 사용자 공간과 커널 사이의 가장 전통적이고 가장 뚜렷한 상호작용 지점이라고 적습니다. 다만 새 시스템 콜을 더할 때 제일 먼저 따져 볼 것은 대안 가운데 하나가 대신 맞을 수도 있는지라고 적습니다. 관련된 연산을 파일시스템 비슷한 객체처럼 보이게 만들 수 있다면 새 파일시스템이나 장치를 만드는 편이 더 말이 될 수 있다고 적습니다. 그렇게 하면 새 기능을 메인 커널에 빌드해 넣는 대신 커널 모듈로 감싸기가 더 쉬워진다고도 적습니다. 창구가 하나가 아니라는 것을 이 문서가 보여 줍니다.
FreeBSD
FreeBSD Architecture Handbook 은 켜지는 쪽에서 커널이 놓인 자리를 적습니다. BIOS(Basic Input/Output System, 기본 입출력 시스템)에서 제어가 넘어온 뒤 커널을 적재해 실행하기까지 상당한 양의 저수준 설정이 필요하다고 적습니다.
같은 문서는 커널이 첫 사용자 프로세스를 만드는 자리도 적습니다. init 이라는 첫 사용자
프로세스가 sysinit 객체에 의해 만들어진다고 적습니다. create_init() 이 fork1() 을 불러 새
프로세스를 할당하지만 실행 가능으로 표시하지는 않는다고 적습니다. 스케줄러가 이 새 프로세스를
실행하도록 스케줄하면 start_init() 이 불린다고 적습니다. 그 함수가 init 바이너리를 적재해
실행하려 시도하며 /sbin/init 을 먼저 찾는다고 적습니다.
seL4
seL4 공식 문서는 자기 커널을 특권 모드에서 도는 핵심 소프트웨어 프로그램이라고 적습니다. 응용 프로그램에게 하드웨어 위의 최소한의 추상화 계층을 제공한다고 적습니다. 응용 프로그램은 seL4 위에 곧바로 올릴 수도 있다고 적습니다. Microkit 이나 CAmkES 같은 프레임워크를 써서 더 쉬운 진입점을 잡을 수도 있다고 적습니다. 같은 문서는 커널 라이선스의 GPL(GNU General Public License, GNU 일반 공중 사용 허가서) 전파 조항이 커널과 사용자 코드의 경계에서 멈춘다고 적습니다. 커널 안과 밖을 가르는 선이 이 문서에서는 라이선스가 미치는 범위를 정하는 자리로도 쓰입니다.
갈래
무엇을 특권 상태 안에 남기느냐가 축입니다. 파일시스템과 네트워크 프로토콜까지 안에 두는 쪽이 한끝입니다. 주소 공간과 스레드와 프로세스 간 통신만 남기고 나머지를 사용자 공간으로 내보내는 쪽이 다른 끝입니다.
flowchart TD
A["모놀리식 · 파일시스템과 네트워크까지 특권 안"] --- B["축 · 무엇을 특권 안에 남기나"] --- C["마이크로커널 · 주소 공간과 스레드와 메시지만"]
모놀리식
파일시스템과 네트워크 프로토콜과 파일 접근 제어까지 커널 안에 두는 쪽입니다. GNU 공식 사이트는 Hurd 를 GNU 프로젝트가 내놓는 유닉스 커널의 대체물이라고 적습니다. Mach 마이크로커널 위에서 도는 서버 묶음이라고 적습니다. 그 서버들이 파일시스템과 네트워크 프로토콜과 파일 접근 제어와 그 밖의 기능을 구현한다고 적습니다. 그리고 그것들이 유닉스 커널이나 Linux 같은 비슷한 커널이 구현하는 기능이라고 적습니다. Hurd 가 사용자 공간 서버로 내보낸 그 목록이 곧 이쪽 커널들이 자기 안에 담고 있는 목록입니다. Exokernel 논문은 Ultrix 를 성숙한 모놀리식 유닉스 운영체제라고 부릅니다.
마이크로커널
특권 상태 안에 남길 것을 최소로 줄이는 쪽입니다. Liedtke 는 1995년 논문에서 무엇을 남길지 가르는 기준이 성능이 아니라 기능성이라고 적습니다. 어떤 개념을 커널 밖으로 옮기는 것이, 다시 말해 경쟁하는 구현들을 허용하는 것이, 시스템이 요구하는 기능의 구현을 불가능하게 만들 때에만 그 개념을 커널 안에 남긴다고 적습니다. 그 기준으로 남는 것으로 먼저 주소 공간을 듭니다. 모든 서브시스템에 공통인 필수 계층인 마이크로커널이 하드웨어의 주소 공간 개념을 감춰야 한다고 적습니다. 그러지 않으면 보호를 구현하는 것이 불가능해진다고 적습니다. 스레드와 프로세스 간 통신도 듭니다. 스레드를 하나의 주소 공간 안에서 실행되는 활동이라고 적습니다. 프로세스 간 통신이 서브시스템 사이 통신의 기본 개념일 뿐 아니라 주소 공간과 함께 독립성의 토대라고 적습니다. 밖으로 나가는 것도 같은 논문이 적습니다. 하드웨어 인터럽트의 자연스러운 추상은 프로세스 간 통신 메시지라고 적습니다. 인터럽트를 메시지로 바꾸는 일은 커널이 해야 하지만 마이크로커널은 장치별 인터럽트 처리에 관여하지 않는다고 적습니다. 인터럽트의 의미를 전혀 모른다고 적습니다. 디바이스 드라이버는 자기 주소 공간에 매핑된 하드웨어 입출력 포트에 직접 접근하는 프로세스라고 적습니다.
MINIX 3 공식 위키는 같은 가름을 자기 구조로 적습니다. 마이크로커널이 커널 모드에서 도는 유일한 구성요소라고 적습니다. 그래서 마이크로커널만이 맨 하드웨어에 완전히 접근한다고 적습니다. 인터럽트와 스케줄링과 원시적인 형태의 프로세스와 프로세스 간 통신 같은 저수준 기능을 다룬다고 적습니다. 그 위에서 서버 프로세스 묶음이 돈다고 적습니다. 그 묶음이 시스템의 나머지에 서비스를 제공한다고 적습니다. 그 프로세스들은 사용자 모드에서 돌기 때문에 하드웨어나 자기 것이 아닌 메모리에 직접 접근할 권한이 없다고 적습니다.
하이브리드
마이크로커널을 바탕으로 삼되 유닉스 계열 서브시스템을 함께 갖추는 쪽입니다. Apple 의 커널 프로그래밍 안내서는 OS X 가 카네기 멜런 대학이 설계한 Mach 3.0 마이크로커널에 기반한다고 적습니다. 나중에 Apple 과 Open Software Foundation Research Institute 가 Power Macintosh 에 맞췄다고 적습니다. 같은 문서가 다루는 범위에는 Mach 와 부트스트랩 태스크가 들어갑니다. 프로세스 간 통신과 부트스트랩 컨텍스트와 포트와 포트 권한도 들어갑니다. 그리고 I/O Kit 과 BSD(Berkeley Software Distribution)가 들어갑니다. BSD 서브시스템은 BSD 네트워킹과 파일시스템 설명까지 더 자세히 다뤄진다고 적습니다.
바탕이 되는 Mach 가 무엇을 담는지는 1986년 Mach 논문이 적습니다. 커널이 네 가지 기본 추상을 지원한다고 적습니다. 태스크는 스레드가 그 안에서 돌 수 있는 실행 환경이며 자원 할당의 기본 단위라고 적습니다. 페이징되는 가상 주소 공간과 시스템 자원에 대한 보호된 접근을 담는다고 적습니다. 스레드는 CPU(Central Processing Unit, 중앙 처리 장치) 사용의 기본 단위라고 적습니다. 포트는 커널이 보호하는 메시지 큐인 통신 채널이라고 적습니다. 메시지는 스레드 사이 통신에 쓰이는 타입 있는 데이터 객체 묶음이라고 적습니다.
엑소커널
추상화 자체를 주지 않는 쪽입니다. 1995년 Exokernel 논문은 작은 커널이 저수준 인터페이스를 통해 모든 하드웨어 자원을 신뢰하지 않는 라이브러리 운영체제들에게 안전하게 내보낸다고 적습니다. 라이브러리 운영체제가 그 인터페이스로 시스템 객체와 정책을 구현한다고 적습니다. 자원 보호를 자원 관리에서 떼어 냈기 때문에 전통적인 운영체제 추상을 응용 프로그램에 맞춰 확장하거나 특수화하거나 아예 교체할 수 있다고 적습니다. 가상 메모리와 프로세스 간 통신 같은 전통적인 운영체제 추상이 신뢰하지 않는 소프트웨어에 의해 전적으로 응용 프로그램 수준에서 구현된다고 적습니다. 같은 논문은 예외 처리와 보호된 제어 이전 같은 대부분의 원시 커널 연산이 성숙한 모놀리식 유닉스 운영체제인 Ultrix 보다 열 배에서 백 배 빠르다고 측정 결과를 적습니다.
관련 항목
권한이 가르는 대립 개념
사용자 공간 · 커널 공간 · 사용자 모드와 커널 모드 · 특권 모드 · 권한
위아래로 잇닿는 계층
운영체제 · 하드웨어 · 응용 프로그램 · 하이퍼바이저
넘나드는 창구
시스템 콜 · 인터럽트 · 프로세스 간 통신 · 커널 모듈
안에서 수행하는 기능
스케줄링 · 문맥 교환 · LRU(Least Recently Used, 최소 최근 사용)
안에서 관리하는 대상
프로세스 · 스레드 · 가상 메모리 · 페이지 폴트 · 디바이스 드라이버 · 파일시스템 · I/O Kit · CPU
하위 종류
모놀리식 커널 · 마이크로커널 · 하이브리드 커널 · 엑소커널
실제로 구현·채택한 제품
Linux · Mach · BSD · FreeBSD · Ultrix · seL4 · MINIX 3 · Hurd · QNX · XNU · Windows NT 커널
만들거나 관리하는 주체
Microsoft · Apple · GNU
부팅부터 멈추기까지 거치는 단계
BIOS · 부팅 · init · 커널 패닉
다른 이름: kernel