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
VOID __noreturn KiSystemStartup(PLOADER_PARAMETER_BLOCK LoaderBlock)2. Главный координатор Phase 0: InitBootProcessor
NTSTATUS __fastcall InitBootProcessor(PLOADER_PARAMETER_BLOCK LoaderBlock)4.3 Ключевые структуры данных Phase 0
| Структура | Описание | Расположение в памяти |
|---|---|---|
_KPCR | Kernel Processor Control Region | gs:[0x0] (через MSR 0xC0000101) |
_KPRCB | Processor Control Block (планировщик, DPC, прерывания) | gs:[0x180] / KPCR.Prcb |
KIDTENTRY64[256] | Таблица дескрипторов прерываний | Загружается через __sidt / LIDT |
KGDTENTRY64 | Таблица дескрипторов сегментов | Загружается через __sgdt / LGDT |
KTSS64 | Task State Segment (стек ядра RSP0, IST-стеки) | Загружается через LTR |
_LOADER_PARAMETER_BLOCK | Блок параметров от winload.efi | Передается через регистр RCX в KiSystemStartup |