Здравствуйте, уважаемые хабрачитатели.
Многим из вас может быть интересна тема разработки и отладки кода UEFI-драйверов и приложений, которая пока еще недостаточно широко освещена в сети, но к которой мне посчастливилось иметь непосредственное отношение.
В связи с этим я планирую написать цикл статей о разработке и отладке UEFI-драйверов на аппаратной платформе Intel Galileo Gen 1, т.к. эта платформа обладает, на мой взгляд, наилучшим соотношением цена/ качество для вышеуказанной задачи.
Первая часть статьи является вводной, в ней я расскажу о стандарте UEFI, проекте TianoCore и его недостатках, o внезапном решении Intel и их плате Galileo, о причинах выбора именно этой аппаратной платформы в качестве базовой и о планах на следующие части.
Unified Extensible Firmware Interface
Как вам уже известно, UEFI — это разработанный Intel в сотрудничестве с Microsoft и другими членами UEFI Forum стандарт на компоненты и интерфейсы прошивок для различного компьютерного оборудования. Стандарт описывает структуру файлов прошивок, интерфейс между прошивкой и ОС (который собственно и называется UEFI) и между компонентами прошивки (имя которому поскромнее — PI ). Хорошее введение в структуру и механизмы работы UEFI имеется в книге Beyond BIOS, написанной непосредственными участниками разработки и внедрения стандарта, а лучше них я все равно не расскажу, поэтому повторяться не стану, тем более, что процесс UEFI-загрузки уже был описан в одной из моих прошлых статей. Если для вас термины вроде "PEI-фаза" или "DXE-драйвер" пока еще звучат незнакомо — прочтите её и возвращайтесь.
TianoCore и его недостатки
Если есть открытый стандарт, то должна быть и его открытая реализация, иначе такому «открытому» стандарту грош-цена (граждане, проходим, не задерживаемся, нечего тут на Office OpenXML смотреть, нечего). Чтобы такая цена не настигла UEFI, Intel совместно с другими членами UEFI Forum и сообществом занялись развитием открытой реализации «верхней» части стандарта UEFI, т.е. кода фаз DXE и BDS, общего для всех поддерживаемых систем и процессорных архитектур. На нем же основан UEFI Development Kit, который недавно был обновлен до версии 2014 SR1. Любителям ночных сборок и кода из trunk предлагается репозиторий EDK2, «стабильным» срезом которого и являются все версии UDK. «Нижняя» часть стандарта (т.е. фазы SEC и PEI, зависимые от аппаратной части и занятые этой самой аппаратной части инициализацией) была до недавнего времени закрытой для всех систем с архитектурой x86 и предоставлялась либо в виде BLOBов всем желающим (как это и сейчас сделано на Minnowboard V1 и серверных платах из состава Intel UEFI Development Kit), либо в виде исходного кода в комплекте с CRB, NDA, и контрактом с IBV тысяч примерно на 30-40 долларов за годовую лицензию на код, IDE и средства отладки, поэтому энтузиастам практически ничего не оставалось делать, кроме как использовать для отладки UEFI-драйверов собственной разработки виртуальные машины (отладка через QEMU — один из штатных способов для EDK2) или заниматься грязным хакингом, поиском утекших исходных кодов и средств разработки и тому подобным.
Intel спешит на помощь
Спасение из этой непростой ситуации пришло с неожиданной стороны — внезапно Intel выпустила Arduino-совместимую плату Galileo, на которой, кроме запускаемой из SPI-чипа сборки Yocto Linux с эмулятором Arduino для запуска скетчей, оказалась еще и практически полностью (за исключением микрокода) открытая реализация UEFI BIOS, пригодная для сборки в Debug-режиме, добавления в нее компонентов собственной разработки и их отладки как через UART (что раньше уже встречалось на вышеупомянутой Minnowboard V1 и других отладочных платах), так и при помощи интерфейса JTAG, дешевого отладчика на базе FT232H и утилит OpenOCD и GDB (а вот эту возможность пользователи х86-процессоров получили на моей памяти впервые). Теперь для аппаратной отладки кода прошивки не нужны ни Intel BlueBox (~$3000 за штуку), ни Intel System Studio (~$2000 за лицензию на год), а практически весь код прошивки доступен под лицензией BSD.
Сейчас к выходу готовится второе поколение плат Minnowboard — MAX (уже доступен предзаказ), для которых в сентябре этого года тоже обещают представить открытую реализацию UEFI, но в данный момент её еще нет, и Galileo остается единственной платой на x86 с открытым кодом UEFI, доступной простым смертным. Вот её то мы и возьмем в качестве базовой платформы для наших опытов.
Galileo
Когда Intel выпустила этот неоднозначный продукт, многие вполне искренне недоумевали, зачем нужна отладочная плата на SoC с «новой» (на самом деле креативно вспомненной старой) архитектурой i586+, без GPU, без Audio, зато с miniPCIe, USB host'ом, JTAG-портом, UEFI и Linux'ом, которая при этом ограниченно совместима с Arduino (т.к. использует собственную версию Arduino IDE), ограниченно совместима с x86 (т.к. «взрослые» дистрибутивы Linux ставятся на нее с немалым бубном, а после обнаружения бага в работе инструкции lock еще и нуждаются в дополнительной доводке напильником для его обхода, а большинство программ давно уже собраны для i686 и потому работать на Galileo без пересборки не будут), при всем этом проигрывающая по производительности CPU Raspberry Pi, будучи минимум вдвое дороже неё. Надо сказать, в тот момент недоумевал вместе с ними.
Ребята из Intel, конечно, рассказывали нам про светлое будущее Интернета Вещей, и предрекали десятикратный рост продаж Quark'ов, при этом тактично уклоняясь от ответа на простой вопрос «чем этот Quark лучше ARM'ов или MIPS'ов за те же деньги».
И теперь, наконец-то, применение этой странной плате нашлось, и $70 за нее уже не кажутся совсем уж необоснованной тратой.
Планы и опрос
Во второй части я планирую освятить подготовку к платы к работе: скачивание и сборку BSP, подключение программатора к разъему ISP на плате, сборку и прошивку Debug-версии UEFI.
В третьей части планируется осветить отладку кода DXE-драйвера при помощи Debug-сообщений через UART, а также отладку через JTAG с помощь OpenOCD, GDB и, возможно, trial-версии Intel System Studio.
Но прежде чем писать продолжение, меня интересует ваше мнение, уважаемые хабрачитатели. Спасибо заранее за ваш голос.
Автор: CodeRush