UEFI
UEFI (Unified Extensible Firmware Interface) — спецификация современной прошивки, пришедшая на смену BIOS. Её разрабатывает консорциум UEFI Forum; в основе — EFI, созданный Intel в конце 1990-х.
UEFI — это не «экран настроек» и не «этап после POST». Это вся среда прошивки: набор сервисов и драйверов, который инициализирует железо, а затем загружает загрузчик и передаёт ему управление, оставаясь доступным до момента запуска ядра. POST — лишь первая часть её работы, а Setup — один из интерфейсов.
Чем UEFI отличается от BIOS
| BIOS | UEFI | |
|---|---|---|
| Разрядность кода | 16 бит, реальный режим | 32/64 бита, защищённый режим |
| Разметка диска | MBR, до 2 ТиБ | GPT, диски любого размера |
| Загрузка | сектор MBR, «слепое» выполнение кода | файл загрузчика на разделе FAT32 |
| Драйверы до ОС | нет | есть: диски, USB, сеть, видео |
| Проверка подписей | нет | Secure Boot |
| Сервисы для ОС | исчезают после старта ОС | часть остаётся (runtime) |
| Сетевая загрузка | только через Option ROM | встроенная (PXE/HTTP) |
| Интерфейс настроек | текстовый, 16-битный | графический, с мышью |
Из чего состоит UEFI
Прошивка в микросхеме
Прошивка лежит в SPI-флеше на плате и собрана в тома прошивки (firmware volumes) — контейнеры с модулями: драйверами, приложениями (включая Setup и оболочку UEFI Shell), таблицами. Отдельно в той же микросхеме хранится NVRAM — энергонезависимая память с настройками и переменными UEFI.
Стадии загрузки
Порядок работы прошивки описан в спецификации PI (Platform Initialization):
- SEC (Security) — самый первый код, с точки входа процессора;
- PEI (Pre-EFI Initialization) — минимальная инициализация железа и памяти;
- DXE (Driver Execution Environment) — драйверы и сервисы;
- BDS (Boot Device Selection) — выбор и запуск загрузчика;
- TSL (Transient System Load) — загрузчик и ядро работают, используя сервисы прошивки;
- RT (Runtime) — ОС работает, от прошивки остались только runtime-сервисы.
Два вида сервисов
Это ключевое понятие UEFI — то, чего у BIOS не было:
- Boot Services — живут до тех пор, пока ядро не вызовет
ExitBootServices():- работа с памятью, события и таймеры;
- протоколы устройств:
Block I/O,Simple File System,Device Path,Graphics Output,Simple Text Input; - загрузка и запуск образов:
LoadImage/StartImage.
- Runtime Services — остаются доступными операционной системе:
- переменные UEFI (
GetVariable/SetVariable) — ими пользуютсяefibootmgrи загрузчики; - время и будильник, сброс машины, обновление прошивки (capsule), аварийные дампы.
- переменные UEFI (
Именно поэтому загрузчик в UEFI — обычное приложение, работающее на сервисах прошивки, а не кусок кода, которому «передали управление и ушли».
ESP — раздел EFI
Загрузчик — это файл на диске, поэтому UEFI нужен раздел, который она умеет читать: EFI System Partition (ESP) — раздел с файловой системой FAT32.
/boot/efi/EFI/BOOT/BOOTX64.EFI # запасной путь, если записей нет
/boot/efi/EFI/<дистрибутив>/grubx64.efi
/boot/efi/EFI/<производитель>/…
Secure Boot
Цепочка доверия: прошивка проверяет подпись загрузчика, загрузчик — подпись ядра. Ключи хранятся в переменных UEFI: PK (platform key), KEK, db (разрешённые) и dbx (запрещённые). Если подпись не сходится, загрузка останавливается.
Как UEFI доходит до GRUB
- SEC → PEI → DXE инициализируют железо и поднимают сервисы (см. POST).
- BDS берёт из NVRAM список загрузочных записей и их порядок (
BootOrder). - Прошивка находит на ESP файл загрузчика, указанный в записи, — обычно
EFI/<дистрибутив>/grubx64.efi. LoadImageзагружает его в память,StartImageзапускает. GRUB — это UEFI-приложение, работающее на Boot Services прошивки.- GRUB читает
grub.cfg, загружает ядро и initramfs и передаёт управление ядру. - Ядро готовит свои драйверы и вызывает
ExitBootServices()— с этого момента прошивка больше не предоставляет Boot Services, остаются только Runtime Services.
Передача загрузки: где на самом деле граница
В отличие от BIOS, в UEFI нет резкой границы «прошивка закончилась — началась ОС». Загрузчик и ядро какое-то время работают внутри прошивки, пользуясь её сервисами. Управление переходит в тот момент, когда ядро вызывает ExitBootServices(). Вот почему прошивка может, например, показать логотип, а затем её же сервисы используются для чтения файлов загрузчиком.
Как проверить режим и настройки
# система загружена в режиме UEFI (каталог существует)
ls /sys/firmware/efi
# загрузочные записи UEFI и их порядок
efibootmgr -v
# состояние Secure Boot
mokutil --sb-state
# сведения о прошивке и загрузчике
bootctl status
Ссылки
- Официальный сайт UEFI Forum — спецификации UEFI и PI
- UEFI и Linux
- Обзор UEFI
- Открытые реализации: EDK II / TianoCore, coreboot, LinuxBoot, Libreboot
Комментарии
Пока комментариев нет.