Bog BOS: hardware: EFI, UEFI и PI
Unified Extensible Firmware Interface (UEFI) - спецификация интерфейса между ОС и прошивкой вычислительной платформы, пришедшая на смену интерфейсу BIOS (16-bit Real Mode (в реальности даптированный 32-bit Protected Mode), 1MB на всех и 192 КиБ на ROM карт расширения). Большинство реализаций поддерживают интерфейсы BIOS для совместимости. Первоначально называлась EFI (1999) и предназначалась для Intel/HP Itanium, затем права EFI 1.10 были переданы Unified EFI Forum и в 2006 году появилась UEFI 2.0 (слово EFI осталась в именах файлов, библиотек и утилит).
Спецификация UEFI описывает состояние после завершения инициализации платформы и определяет интерфейс между прошивкой и приложениями UEFI - внешними программами, используемыми, в частности, для загрузки ОС. Кроме приложений UEFI определяются драйверы UEFI - вспомогательные программы, реализующие до загрузки ОС определённые в спецификации протоколы. Центральной частью UEFI является менеджер загрузки, который (после инициализации платформы) загружает в определённом порядке драйверы и приложения до тех пор, пока не окажется запущенной ОС. Предоставляемые UEFI сервисы делятся на сервисы периода загрузки (недоступны после запуска ОС) и очень небольшой набор сервисов периода выполнения (доступны всегда). В комплекте с UEFI разработаны спецификации инициализации платформы PI (Platform Initialization Specification), ранее называлась Intel Framework, формат пакетов UEFI/PI и UEFI Shell. Имеется открытая реализация верхней части PI/UEFI - Tianocore (EDK - EFI Development Kit, далее EDK2, UDK2010 и т.д.).
В настоящий момент поддерживает следующие платформы (только little-endian, 32 или 64-битные): IA-32, IA-64, x64, AArch32, AArch64, RISC-V; существуют проекты для добавления POWERPC64, OpenPOWER и MIPS. Разрядность UEFI прошивки должна соответствовать разрядности UEFI приложений (загрузчики и пр.). На практике прошивка платформы x86-64 будет 64-битной (кроме старых Atom-ов), проверить можно в /sys/firmware/efi/fw_platform_size. Дополнительно определяется архитектура виртуальной машины EBC (EFI Byte Code), которая может быть использована для написания драйверов и приложений. Предполагается возможность написания драйверов и приложений на языках высокого уровня, интерфейсы описываются в стиле языка C.
Декларируется совместимость со "старой жизнью" - возможность загрузки ОС, совместимых с BIOS или UEFI, на одной и той же платформе с одного и того же носителя, а также возможность для разработчиков карт расширения поддерживать одновременно UEFI драйвера и BIOS-совместимые ROM. Intel планировала отказаться от режима совместимости к 2020 году. Класс UEFI:
- 0 - BIOS есть, интерфейсов UEFI и UEFI PI нет
- 1 - интерфейс UEFI имеется, но для ОС предоставляется только BIOS
- 2 - интерфейс UEFI имеется, для ОС предоставляется BIOS и UEFI
- 3 - интерфейс UEFI имеется, для ОС предоставляется только UEFI
- 3+ - интерфейс UEFI имеется, для ОС предоставляется только UEFI, включена безопасная загрузка
В качестве кодировки символов используется UCS-2 (конец строки - 0x0000). Для нумерации объектов (протокол, драйвер, пространство имён переменных, раздел и т.д.) повсеместно используется GUID (Globally Unique IDentifier, RFC 4122) длиной 128-бит, предполагается, что даже случайный выбор GUID в пространстве такой мощности обеспечит уникальность без согласования между разработчиками в центральной конторе. Структура EFI GUID определяется как сочетание 60-битной отметки времени (100-наносекундные отсчёты от 15 октября 1582 года по Грегорианскому календарю), 4 бита на версию, 16 бит на ClockSeq (?) и 48 бит на идентификатор узла (например, MAC адрес). Текстовое представление из шестнадцатеричных цифр (ещё надо байты перемешать в словах): "tttttttt-tttt-tvtv-cscs-nnnnnnnnnnnn".
Принципиальное наличие поддержки UEFI в прошивке можно узнать в SMBIOS: BIOS Information: BIOS Characteristics Extension Byte 2 ("dmidecode -t 0"). Включена ли она сейчас можно узнать по наличию /sys/firmware/efi/fw_platform_size.
Текущая (2017 год) версия 2.7, но в самой свежей прошивке от Intel стоит UEFI версии 2.4, поэтому для ориентировки в возможностях реализации важно знать, что было добавлено в очередной версии:
- 2.1 - HII (интерфейс пользователя)
- 2.2 - IPv6, PXE+, IPSec
- 2.3 - поддержка ARM, управление прошивками, Secure Boot
- 2.4 (апрель 2013) - переменные KeyXXXX (горячие клавиши)
- 2.5 (февраль 2015) - NVDIMM, смарт-карты, BMC, SD-карты, загрузка по HTTP и из ISO-образов и с виртуальных дисков, поддержка VLAN, Bluetooth и Wi-Fi/EAP2, обновление частей прошивки
- 2.6 (ноябрь 2015) - eMMC, шрифты, RAM диск
- 2.7 (апрель 2017) - регулярные выражения, RISC-V, BluetoothLE, HII Popup, NVDIMM (таблица трансляции блоков и метки)
http://bog.pp.ru/hard/UEFI.html
|