Skip to content

4. Kernel Phase 0 Initialization (ntoskrnl.exe) ​

Фаза 0 начинается при переданном загрузчиком уровне прерываний CR8 = 0 (PASSIVE_LEVEL); на раннем этапе KiSystemStartup повышает IRQL до HIGH_LEVEL (15) на главном процессоре (BSP).


4.1 Архитектура Phase 0 ​

На этапе Phase 0 ядро переходит из первичного окружения загрузчика в полноценное исполнительное окружение ядра NT (Ring 0 / Supervisor Mode):

[ winload.efi: OslArchTransferToKernel ]
                    │
                    ▼
[ KiSystemStartup (0x14098C010) ]
   ├── Сохранение CR0, CR2, CR3, CR4 в контекст процессора
   ├── Загрузка GDTR, IDTR, TR (Task Register), LDTR
   ├── Настройка MSR 0xC0000101 (GS_BASE) -> Указатель на KPCR
   └── Вызов KiInitializeBootStructures & KdInitSystem(0)
                    │
                    ▼
[ KiInitializeKernel (0x1409999E0) ]
   ├── Инициализация KPRCB (очереди DPC, таймеры, списки потоков)
   ├── Настройка поддержки XSave, NX, Speculation Control (Spectre/Meltdown)
   ├── Создание начального контекста процесса System (Idle Process / Idle Thread)
   └── Вызов InitBootProcessor
                    │
                    ▼
[ InitBootProcessor (0x140A36F64) ]
   ├── HalInitSystem(0, LoaderBlock) -> Базовая настройка контроллера прерываний HAL
   ├── KeInitSystem(0) & CmInitSystem0(LoaderBlock) -> Ранний куст реестра SYSTEM
   ├── ExInitSystem() -> Инициализация Executive (ExpInitSystemPhase0)
   ├── MmInitSystem(0, LoaderBlock) -> PFN-база, NonPagedPool, PagedPool, VAD
   ├── ObInitSystem(0) -> Корневой каталог объектов \ и типы объектов (Directory, Type)
   ├── SeInitSystem(0) -> Подсистема безопасности, дескрипторы и токены
   └── PsInitSystem(0, LoaderBlock) -> Создание первого системного процесса (System)

4.2 Декомпилированный C-код ядра (Phase 0) ​

Целевая сборка: Windows 10 22H2 x64 (Build 10.0.19045.2965). Имена внутренних функций и абсолютные RVA-адреса зависят от версии сборки.
Конвенция вызовов (x64 ABI): Аннотации конвенций вызовов (__fastcall, __stdcall, __noreturn) воспроизводят декораторы типов декомпилятора Hex-Rays / IDA Pro. В архитектуре Windows x64 действует единый системный Microsoft x64 ABI (передача параметров через RCX, RDX, R8, R9, выделение Shadow Space).

1. Точка входа ядра: KiSystemStartup ​

KiSystemStartupntoskrnl.exe
IRQL: Entry: CR8=0 ➔ HIGH_LEVEL (15) during early startupPhase 0 Core EntryInternal
VOID __noreturn KiSystemStartup(PLOADER_PARAMETER_BLOCK LoaderBlock)
Кем вызывается:winload.efi: OslArchTransferToKernel
Абсолютная точка входа ядра Windows NT. Получает указатель на `LOADER_PARAMETER_BLOCK`, сохраняет регистры управления ЦП (CR3, CR0, CR2, CR4), считывает GDT и IDT, программирует MSR 0xC0000101 (GS Base) для адресации KPCR и запускает `KiInitializeKernel`.

2. Главный координатор Phase 0: InitBootProcessor ​

InitBootProcessorntoskrnl.exe
IRQL: HIGH_LEVEL -> DISPATCH_LEVELPhase 0 Subsystem InitInternal
NTSTATUS __fastcall InitBootProcessor(PLOADER_PARAMETER_BLOCK LoaderBlock)
Кем вызывается:KiInitializeKernel
Главная координирующая функция фазы 0 ядра. Последовательно инициализирует HAL (`HalInitSystem(0)`), реестр (`CmInitSystem0`), планировщик (`KeInitSystem(0)`), исполнительную подсистему (`ExInitSystem`), память (`MmInitSystem(0)`), диспетчер объектов (`ObInitSystem(0)`), безопасность (`SeInitSystem(0)`) и процессы (`PsInitSystem(0)`).

4.3 Ключевые структуры данных Phase 0 ​

СтруктураОписаниеРасположение в памяти
_KPCRKernel Processor Control Regiongs:[0x0] (через MSR 0xC0000101)
_KPRCBProcessor Control Block (планировщик, DPC, прерывания)gs:[0x180] / KPCR.Prcb
KIDTENTRY64[256]Таблица дескрипторов прерыванийЗагружается через __sidt / LIDT
KGDTENTRY64Таблица дескрипторов сегментовЗагружается через __sgdt / LGDT
KTSS64Task State Segment (стек ядра RSP0, IST-стеки)Загружается через LTR
_LOADER_PARAMETER_BLOCKБлок параметров от winload.efiПередается через регистр RCX в KiSystemStartup

Interactive documentation of Windows NT (Build 10.0.19045.2965 x64) • Source Code