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), а также аварийные ветки обработки ошибок.
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):
SEC (Security):
- Процессор стартует по аппаратному вектору сброса 0xFFFFFFF0.
- Оперативная память (
DRAM) ещё отключена: SEC настраивает временную память (temporary RAM). На типичных x86-платформах для этого используется кэш процессора через механизм Cache-as-RAM (или встроенная SRAM/eDRAM на SoC). - Выполняется верификация криптографического корня доверия Root of Trust и ранняя инициализация микрокода CPU.
PEI (Pre-EFI Initialization):
- Модули PEIM опрашивают микросхемы SPD планок памяти по шине SMBus/I2C, калибруют тайминги и подают питание на контроллер системной DRAM.
- Топология памяти и статус платформы передаются диспетчеру следующей фазы через структуры HOB.
DXE (Driver Execution Environment):
- Формируются таблицы Boot Services (выделение пулов памяти, протоколы) и Runtime Services (доступ к переменным NVRAM, часы реального времени, управление питанием).
- Загружаются протоколы драйверов файловых систем (FAT32 / ESP), контроллеров шин PCIe и накопителей (AHCI / NVMe).
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).
- Диспетчер считывает параметры загрузки из энергонезависимой памяти NVRAM: порядок накопителей
1.3 Глубокое погружение: Аппаратный старт процессора и режимы x86
Почему процессор начинает с вектора сброса 0xFFFFFFF0?
Когда на материнскую плату подаётся питание:
- Блок питания формирует сигнал
POWER_GOOD(напряжение стабилизировалось). - Чипсет снимает сигнал аппаратного сброса
RESET#с ножки процессора. - В этот момент оперативная память (DRAM) полностью отключена (не настроены тайминги, нет тактирования). Процессор не может прочитать код из RAM.
- Процессор аппаратно инициализирует свои регистры в строго фиксированное состояние:
- Сегмент кода:
CS = 0xF000(при этом скрытый базовый адрес сегментаCS Base = 0xFFFF0000) - Указатель команд:
IP / EIP = 0xFFF0 - Итоговый физический адрес первой инструкции:
- Сегмент кода:
Почему именно 0xFFFFFFF0 (16 байт ниже границы 4 ГБ)?
0xFFFFFFFFэто верхний предел 32-битного адресного пространства (). - Адрес
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-битный реальный режим):
- Использует сегментную адресацию:
. - Максимальный адрес:
. - Нет привилегий: любая инструкция может выполнить
cli,hlt, писать в порты ввода-вывода или повредить стек.
2. Переключение процессора в Protected Mode (типичная реализация x86 PC):
Чтобы работать с адресами выше 1 МБ и выполнять безопасный C-код, прошивка инициализирует минимальную таблицу дескрипторов GDT и выставляет бит PE (Protection Enable, бит 0) в регистре управления CR0:
; [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 (кэш вместо памяти).
- Процессор через регистры
MTRR(Memory Type Range Registers) настраивает кэш L2/L3 процессора в специальный режим Write-Back / No-Eviction. - В этом режиме кэш-линии процессора отвечают на любые чтения и записи по заданному диапазону адресов, но никогда не пытаются сбросить данные в физическую шину RAM.
- Регистр указателя стека ESP / RSP указывает на этот кэшированный регион, позволяя прошивке безопасно исполнять сложный C/C++ код задолго до подачи питания на планки DRAM.
1.4 Legacy BIOS & MBR (Устаревший стек)
В устаревшем режиме Legacy BIOS:
- BIOS считывает первый физический сектор накопителя (LBA 0, 512 байт) - MBR по адресу
0x7C00и передаёт ему управление. - Код MBR сканирует записи таблицы разделов (смещение
0x01BE), определяя активный раздел с флагом0x80. - С активного раздела считывается загрузочный сектор 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 и стек).
NTSTATUS _ReadPartitionTable_SC_GPT(SC_GPT *this, SC_DISK_LAYOUT **Layout)EFI PART (0x5452415020494645), валидирует контрольную сумму CRC32 заголовка и парсит массив дескрипторов разделов GPT (GUID раздела, начальный LBA, конечный LBA, атрибуты). ULONG _CheckSum_MBR_HEADER(MBR_HEADER *this)0xAA55 и дисковой подписи NT Signature. 1.5 Переход к Windows Boot Manager
После обнаружения ESP раздела на диске прошивка UEFI загружает \EFI\Microsoft\Boot\bootmgfw.efi в память через gBS->LoadImage и передает управление в его точку входа EfiMain.