ntoskrnl.exe (short for Windows NT operating system kernel executable), also known as the kernel image, contains the kernel and executive layers of the Microsoft Windows NT kernel, and is responsible for hardware abstraction, process handling, and memory management. In addition to the kernel and executive mentioned earlier, it contains the cache manager, security reference monitor, memory manager, scheduler (Dispatcher), and blue screen of death (the prose and portions of the code).

Overview 

x86 versions of ntoskrnl.exe depend on bootvid.dll, hal.dll and kdcom.dll (x64 variants of ntoskrnl.exe have these dlls embed into the kernel to increase performance). However, it is not a native application. In other words, it is not linked against ntdll.dll. Instead, ntoskrnl.exe containing a standard "start" entry point that calls the architecture-independent kernel initialization function. Because it requires a static copy of the C Runtime objects, the executable is usually about 10 MB in size.

In Windows XP and earlier, the Windows installation source ships four kernel image files to support uniprocessor systems, symmetric multiprocessor (SMP) systems, CPUs with PAE, and CPUs without PAE. Windows setup decides whether the system is uniprocessor or multiprocessor, then, installs both the PAE and non-PAE variants of the kernel image for the decided kind. On a multiprocessor system, Setup installs ntkrnlmp.exe and ntkrpamp.exe but renames them to ntoskrnl.exe and ntkrnlpa.exe respectively.

Starting with Windows Vista, Microsoft began unifying the kernel images as multi-core CPUs took to the market and PAE became mandatory.

Routines in ntoskrnl use prefixes on their names to indicate in which component of ntoskrnl they are defined.

Since not all functions are being exported by the kernel, function prefixes ending in i or p (such as Mi, Obp, Iop) are internal and not supposed to be accessed by the user. These functions contain the core code and implements important checks, such as for vulnerabilities, missing arguments and exception handling. 

The following table lists some of them.

Initialization 
When the kernel receives control, it gets a struct-type pointer from bootloader. The pointer's destination contains information about the hardware, the path to the Windows Registry file, kernel parameters containing boot preferences or options that change the behavior of the kernel, path of the files loaded by the bootloader (SYSTEM Registry hive, nls for character encoding conversion, and vga font). The definition of this structure can be retrieved by using the kernel debugger or downloading it from the Microsoft symbol database.

In the x86 architecture, the kernel receives the system already in protected mode, with the GDT, IDT and TSS ready. But since it does not know the address of each one, it has to load them one by one to fill the PCR structure.

The main entry point of ntoskrnl.exe performs some system dependent initialization then calls a system independent initialization then enters an idle loop.

Interrupt handling 

Modern operating systems use interrupts instead of I/O port polling to wait for information from devices.

In the x86 architecture, interrupts are handled through the Interrupt Dispatch Table (IDT). When a device triggers an interrupt and the interrupt flag (IF) in the FLAGS register is set, the processor's hardware looks for an interrupt handler in the table entry corresponding to the interrupt number to which in turn has been translated from IRQ by PIC chips, or in more modern hardwares, APIC. Interrupt handlers usually save some subset of the state of registers before handling it and restore them back to their original values when done.

The interrupt table contains handlers for hardware interrupts, software interrupts, and exceptions. For some IA-32 versions of the kernel, one example of such a software interrupt handler (of which there are many) is in its IDT table entry 2E16 (hexadecimal; 46 in decimal), used in assembly language as INT 2EH for system calls. In the real implementation the entry points to an internal subroutine named (as per symbol information published by Microsoft) KiSystemService. For newer versions, different mechanisms making use of SYSENTER instruction and in x86-64 SYSCALL instruction are used instead.

One notable feature of NT's interrupt handling is that interrupts are usually conditionally masked based on their priority (called "IRQL"), instead of disabling all IRQs via the interrupt flag. This permits various kernel components to carry on critical operations without necessarily blocking services of peripherals and other devices.

Memory manager 

The entire physical memory (RAM) address range is broken into many small blocks also called pages, 4KB in size each, and mapped to virtual addresses. A few of the properties of each block are stored in structures called page table entries, which are managed by the OS and accessed by the processor's hardware. Page tables are organized into a tree structure, and the physical page number of the top-level table is stored in control register 3 (CR3).

Microsoft Windows divides virtual address space into two regions. The lower part, starting at zero, is instantiated separately for each process and is accessible from both user and kernel mode. Application programs run in processes and supply code that runs in user mode. 
The upper part is accessible only from kernel mode, and with some exceptions, is instantiated just once, system-wide. Ntoskrnl.exe is mapped into this region, as are several other kernel mode components. This region also contains data used by kernel mode code, such as the kernel mode heaps and the file system cache.

Registry 

Windows Registry is a repository for configuration and settings information for the operating system and for other software, such as applications. It can be thought of as a filesystem optimized for small files. However, it is not accessed through file system-like semantics, but rather through a specialized set of APIs, implemented in kernel mode and exposed to user mode.

The registry is stored on disk as several different files called "hives." One, the System hive, is loaded early in the boot sequence and provides configuration information required at that time. Additional registry hives, providing software-specific and user-specific data, are loaded during later phases of system initialization and during user login, respectively.

Drivers 

The list of drivers to be loaded from the disk are retrieved from the Services key of the current control set's key in the SYSTEM registry hive. That key stores device drivers, kernel processes and user processes. They are all collectively called "services" and are all stored mixed on the same place.

During initialization or upon driver load request, the kernel traverses that tree looking for services tagged as kernel services.

See also 
 Architecture of Windows NT
 Windows NT Startup Process

Notes

References

Further reading

External links
 Inside the Windows Vista Kernel (TechNet Magazine)
 struct LOADER_PARAMETER_BLOCK
 Driver Development Part 1: Introduction to Drivers

Windows NT kernel
Windows files
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 커널