Skip to content

1. Firmware & UEFI / MBR Stage ​

Этап аппаратной инициализации прошивки материнской платы и передачи управления первому загрузчику Windows.


1.1 Сквозная архитектурная карта cold-boot загрузки (UEFI x64) ​

Важно:

Карта описывает эталонный сквозной «холодный» старт (cold-boot) Windows 10 22H2 x64 (сборка 10.0.19045.2965) в режиме UEFI Native до интерактивной оболочки по умолчанию (explorer.exe). Схема намеренно не включает альтернативные сценарии (Legacy BIOS/MBR, ARM64, VHD Boot, Network PXE, Safe Mode, WinRE, Hyper-V VBS), а также аварийные ветки обработки ошибок.

100%

1.2 Архитектура фаз UEFI PI (Typical Platform Initialization Flow) ​

Современные x64 платформы стартуют под управлением прошивки, соответствующей спецификациям UEFI и UEFI Platform Initialization (PI). Стандартизированный конвейер инициализации платформы PI включает следующие фазы:

[ Питание / Reset Vector 0xFFFFFFF0 ]
               │
               ▼
   [ SEC ] Security Phase (Temporary Memory / Early Init, CAR на x86)
               │
               ▼
   [ PEI ] Pre-EFI Initialization (Инициализация DRAM, чипсета)
               │
               ▼
   [ DXE ] Driver Execution Environment (Загрузка драйверов шин PCI, NVMe, USB, FS)
               │
               ▼
   [ BDS ] Boot Device Selection (Чтение NVRAM BootOrder, Secure Boot, запуск EFI-файла)
               │
               ▼
   [ \EFI\Microsoft\Boot\bootmgfw.efi ] -> Windows Boot Manager

Фазы инициализации прошивки (PI Architecture): ​

  1. SEC (Security):

    • Процессор стартует по аппаратному вектору сброса 0xFFFFFFF0.
    • Оперативная память (DRAM) ещё отключена: SEC настраивает временную память (temporary RAM). На типичных x86-платформах для этого используется кэш процессора через механизм Cache-as-RAM (или встроенная SRAM/eDRAM на SoC).
    • Выполняется верификация криптографического корня доверия Root of Trust и ранняя инициализация микрокода CPU.
  2. PEI (Pre-EFI Initialization):

    • Модули PEIM опрашивают микросхемы SPD планок памяти по шине SMBus/I2C, калибруют тайминги и подают питание на контроллер системной DRAM.
    • Топология памяти и статус платформы передаются диспетчеру следующей фазы через структуры HOB.
  3. DXE (Driver Execution Environment):

    • Формируются таблицы Boot Services (выделение пулов памяти, протоколы) и Runtime Services (доступ к переменным NVRAM, часы реального времени, управление питанием).
    • Загружаются протоколы драйверов файловых систем (FAT32 / ESP), контроллеров шин PCIe и накопителей (AHCI / NVMe).
  4. BDS (Boot Device Selection):

    • Диспетчер считывает параметры загрузки из энергонезависимой памяти NVRAM: порядок накопителей BootOrder и пути Boot####.
    • При активном Secure Boot проверяется цифровая подпись PE/COFF-образа по ключам PK (Platform Key), KEK (Key Exchange Key) и белым спискам базы db.
    • При успешной валидации вызывается gBS->StartImage() для \EFI\Microsoft\Boot\bootmgfw.efi (или \EFI\BOOT\bootx64.efi).

1.3 Глубокое погружение: Аппаратный старт процессора и режимы x86 ​

Почему процессор начинает с вектора сброса 0xFFFFFFF0? ​

Когда на материнскую плату подаётся питание:

  1. Блок питания формирует сигнал POWER_GOOD (напряжение стабилизировалось).
  2. Чипсет снимает сигнал аппаратного сброса RESET# с ножки процессора.
  3. В этот момент оперативная память (DRAM) полностью отключена (не настроены тайминги, нет тактирования). Процессор не может прочитать код из RAM.
  4. Процессор аппаратно инициализирует свои регистры в строго фиксированное состояние:
    • Сегмент кода: CS = 0xF000 (при этом скрытый базовый адрес сегмента CS Base = 0xFFFF0000)
    • Указатель команд: IP / EIP = 0xFFF0
    • Итоговый физический адрес первой инструкции:Physical Address=0xFFFF0000+0x0000FFF0=0xFFFFFFF0

Почему именно 0xFFFFFFF0 (16 байт ниже границы 4 ГБ)?

  • 0xFFFFFFFF это верхний предел 32-битного адресного пространства (4 Гбайт−1 байт).
  • Адрес 0xFFFFFFF0 находится ровно за 16 байт до 4 ГБ.
  • В эти 16 байт помещается ровно одна инструкция дальнего перехода: JMP FAR к началу основного тела прошивки UEFI.
  • Куда ведёт этот адрес физически? Чипсет материнской платы перенаправляет обращения к верхнему диапазону адресов памяти не в оперативную память, а на аппаратную шину SPI к чипу энергонезависимой микросхемы SPI Flash ROM на плате.

Эволюция режимов процессора: Real Mode ➔ Protected Mode ➔ Long Mode ​

Каждый современный 64-битный процессор (Intel Core, AMD Ryzen) ради обратной совместимости с первыми ПК 1978 года при включении питания просыпается в 16-битном режиме.

РежимРазрядностьЛимит памятиМодель защитыГде используется
Real Mode (Реальный)16 бит1 МбайтНет защиты, любая программа может писать в память BIOS/DOS.Первые такты после сброса CPU, Legacy BIOS (MBR).
Protected Mode (Защищённый)32 бит4 ГбайтКольца Ring 0–3, дескрипторы GDT, страничная изоляция CR3.Фаза SEC/PEI в UEFI, 32-битные драйверы.
Long Mode (64-битный x64)64 битДо 256 Тбайт (48/57 бит)Кольца Ring 0/3, NX-бит (No Execute), плоская память.Основной режим работы 64-битной Windows NT, DXE/BDS фазы UEFI.

1. Real Mode (16-битный реальный режим): ​

  • Использует сегментную адресацию: Физический адрес=(Сегментный регистр×16)+Смещение.
  • Максимальный адрес: 0xFFFF×16+0xFFFF=0x10FFEF≈1 Мбайт.
  • Нет привилегий: любая инструкция может выполнить cli, hlt, писать в порты ввода-вывода или повредить стек.

2. Переключение процессора в Protected Mode (типичная реализация x86 PC): ​

Чтобы работать с адресами выше 1 МБ и выполнять безопасный C-код, прошивка инициализирует минимальную таблицу дескрипторов GDT и выставляет бит PE (Protection Enable, бит 0) в регистре управления CR0:

asm
; [1] Загрузка временной плоской таблицы дескрипторов (GDT)
lgdt    [TempGdtDescriptor]

; [2] Включение бита защиты PE (Protection Enable) в CR0
mov     eax, cr0
or      eax, 1                  ; CR0.PE = 1
mov     cr0, eax

; [3] Дальний переход (JMP FAR) для очистки конвейера инструкций и перезагрузки регистра CS
jmp     0x08:ProtectedModeEntry

[BITS 32]
ProtectedModeEntry:
    ; Процессор теперь в 32-битном защищённом режиме с доступом ко всем 4 ГБ памяти

Механизм Cache-as-RAM (CAR): Как работать без оперативной памяти? ​

В фазе SEC прошивке требуется вызывать функции, передавать параметры и хранить локальные переменные, то есть необходим стек (Stack). Однако контроллер оперативной памяти (DRAM) ещё не инициализирован.

Решение: Cache-as-RAM (кэш вместо памяти).

  1. Процессор через регистры MTRR (Memory Type Range Registers) настраивает кэш L2/L3 процессора в специальный режим Write-Back / No-Eviction.
  2. В этом режиме кэш-линии процессора отвечают на любые чтения и записи по заданному диапазону адресов, но никогда не пытаются сбросить данные в физическую шину RAM.
  3. Регистр указателя стека ESP / RSP указывает на этот кэшированный регион, позволяя прошивке безопасно исполнять сложный C/C++ код задолго до подачи питания на планки DRAM.

1.4 Legacy BIOS & MBR (Устаревший стек) ​

В устаревшем режиме Legacy BIOS:

  1. BIOS считывает первый физический сектор накопителя (LBA 0, 512 байт) - MBR по адресу 0x7C00 и передаёт ему управление.
  2. Код MBR сканирует записи таблицы разделов (смещение 0x01BE), определяя активный раздел с флагом 0x80.
  3. С активного раздела считывается загрузочный сектор VBR, инициирующий исполнение bootmgr.

1.5 Декомпилированный C-код парсинга разделов (GPT / MBR) ​

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

_ReadPartitionTable_SC_GPTntoskrnl.exe
IRQL: PASSIVE_LEVELInternal
NTSTATUS _ReadPartitionTable_SC_GPT(SC_GPT *this, SC_DISK_LAYOUT **Layout)
Функция считывает заголовок GPT (LBA 1), проверяет сигнатуру EFI PART (0x5452415020494645), валидирует контрольную сумму CRC32 заголовка и парсит массив дескрипторов разделов GPT (GUID раздела, начальный LBA, конечный LBA, атрибуты).
_CheckSum_MBR_HEADERntoskrnl.exe
IRQL: PASSIVE_LEVELInternal
ULONG _CheckSum_MBR_HEADER(MBR_HEADER *this)
Вычисляет 32-битную контрольную сумму сектора MBR для верификации сигнатуры 0xAA55 и дисковой подписи NT Signature.

1.5 Переход к Windows Boot Manager ​

После обнаружения ESP раздела на диске прошивка UEFI загружает \EFI\Microsoft\Boot\bootmgfw.efi в память через gBS->LoadImage и передает управление в его точку входа EfiMain.

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