Ntoskrnl.exe

ntoskrnl.exe (윈도우 NT 운영 체제 커널(Windows NT operating system kernel)의 준말)은 kernel image라고도 알려져 있으며, 윈도 NT 커널 공간의 커널과 익스큐티브 계층을 제공한다. 그리고 하드웨어 가상화나 프로세스 그리고 메모리 관리같은 다양한 시스템 서비스를 관리함으로써 시스템의 기본적인 부분이 되고 있다. 이것은 캐시 매니저, 익스큐티브, 커널, 보안 참조 보니터, 메모리 관리자, 스케줄러를 포함한다.

개요 
이 시스템 바이너리는 네이티브 애플리케이션 (in that it is not linked against ntdll.dll)이 아니라, 표준 '시작' 엔트리 포인트 즉, 컴퓨터 구조에 독립된 커널 초기 함수를 호출하는 함수를 포함한 것이다. ntoskrnl.exe는 ntdll.dll이 아니라, bootvid.dll, hal.dll 그리고 kdcom.dll에 링크되어 있다. 의존하는 C 런타임 객체들의 정적인 복사본을 요구하기 때문에 실행 파일은 보통 2MB 크기이다.

전체적으로, 4개의 커널 이미지 파일들이 있다. 멀티프로세서 또는 uniprocessor 파일들은 설치 시에 선택되며 PAE 또는 non-PAE 파일들은 프로세서의 특징에 따라 boot.ini 또는 BCD 옵션에 따라 선택된다.

윈도우 커널 코딩은 보통 타입 네임으로 (변수 네임이 아니라) Hungarian notation를 사용한다.

ntoskrnl의 루틴들은 이름에 그들이 정의된 ntoskrnl의 구성 요소를 가리키는 접두어를 사용한다. 아래의 테이블은 몇몇을 나열한 것이다.

초기화 
커널이 제어를 받는 경우, 파라미터로 구조체에 대한 포인터를 받게 된다. 이 구조체는 부트로더에 의해 배달되며, 이것은 하드웨어에 대한 정보(레지스트리 파일의 경로, 커널 파라미터, 부트로더에 의해 담겨진 파일들의 경로, 부팅 선호 옵션 등)를 담고 있다. 이 구조체의 정의는 커널 디버거에 의해 검색될 수 있다.

X86에서 커널은 (보호 모드) GDT, IDT 그리고 TSS 준비와 함께 시스템을 받는다. 그러나 각각의 주소를 모르기 때문에 PCR 구조를 채우기 위해서는 하나씩 로드해야 한다.

ntoskrnl.exe의 메인 엔트리포인트는 시스템에 의존적인 초기화를 수행하고, 시스템 독립적인 호출한 후에 유휴(idle) 루프에 빠진다.

인터럽트 핸들링 
현대의 운영 체제들은 입출력 포트 폴링 대신 인터럽트를 사용한다.

x86에서, 인터럽트들은 인터럽트 디스패치 테이블 (IDT)에 의해 관리된다. 장치가 인터럽트를 유발시키면, 플래그 레지스터의 interrupt flag (IF)가 세팅되며, 프로세서의 하드웨어는 테이블 엔트리가 인터럽트 번호(IRQ)와 일치하는 인터럽트 핸들러를 찾는다. 인터럽트 핸들러는 인터럽트를 조작하고 복구하기 전에 보통 모든 또는 몇몇 레지스터의 상태들 저장한다.

인터럽트 테이블은 하드웨어 인터럽트, 소프트웨어 인터럽트 그리고 예외를 위한 핸들러를 포함한다. 예를 들어 소프트웨어 인터럽트 핸들러는 테이블 엔트리가 0x2e이다. 이것은 KiSystemService를 가리킨다.

메모리 관리자 
마이크로소프트 윈도우는 가상 주소 공간을 두 영역으로 나눈다. 낮은 부분은 0부터 시작하며, 각각의 프로세스 마다 독립적으로 초기화되고, 사용자 모드와 유저 모드 모두에서 접근할 수 있다. 프로세스에서 돌아가는 응용 프로그램은 사용자 모드에서 돌아가는 코드를 제공한다. 높은 부분은 몇몇 예외적인 경우를 제외하고는 커널 모드에서만 접근할 수 있으며 시스템 전체적으로 한 번만 초기화 된다. Ntoskrnl.exe는 다른 커널 모드 구성요소들과 같이 이 영역에 매핑된다. 이 영역은 또한 커널 모드 코드(커널 모드 힙과 파일 시스템 캐시)에서 사용되는 데이터도 포함한다.

물리 메모리(RAM) 주소 범위 전체는 수많은 작은(보통 4KB) 단위로 쪼개진다. 소수의 몇몇 블록들은 페이지 테이블 엔트리라고 불리는 구조체에 저장되는데, 이것은 OS에 의해 관리되며, 프로세서의 하드웨어에 의해 접근된다. 페이지 테이블들은 트리 구조로 조직되며 top-level 테이블의 물리 페이지 번호는 컨트롤 레지스터 3(CR3)에 저장된다.

레지스트리 
윈도우 레지스트리는 운영 체제와 응용 프로그램들의 설정 정보를 담고 있는 저장소이다. 이것은 작은 파일들로 최적화 된 파일시스템이라고 생각하면 된다. 그러나 의미론적으로 파일시스템 같이 접근할 수는 없고, 커널 모드에서 구현되며 사용자 모드에 노출된 전문화된 API들을 통해서 접근할 수 있다.

레지스트리는 "하이브"라고 불리는 여러 다른 파일들로서 디스크에 저장된다. 시스템 하이브의 경우 부팅 과정 때부터 로드되어 그 때 필요한 설정 정보를 제공한다. 소프트웨어와 사용자관련 정보를 제공하는 추가적인 레지스트리 하이브들은 시스템 초기화 이후, 그리고 사용자 로그인 이후에 각각 로드된다.

드라이버 
디스크에서 로드되는 드라이버들의 목록은 SYSTEM 레지스트리 하이브 내의 Serveices 키에서 검색된다. 이 키는 디바이스 드라이버와 커널 프로세스들 그리고 유저 프로세스들을 저장한다. 이것들은 전체적으로 "services"라고 불리며, 같은 공간에 저장되어 있다.

같이 보기 
 윈도우 NT 아키텍처
 윈도우 NT 시작 프로세스

각주

읽어보기 
 Tanenbaum, Andrew. Modern Operating Systems (3rd Edition). 978-0136006633
 Practical reverse engineering. 978-1118787311

외부 링크 
 Inside the Windows Vista Kernel (TechNet Magazine)
 struct LOADER_PARAMETER_BLOCK
 Driver Development Part 1: Introduction to Drivers

윈도우 구성 요소
윈도우 NT 커널