Разработка и отладка UEFI-драйверов на Intel Galileo, часть первая, вводная



    Здравствуйте, уважаемые хабрачитатели.

    Многим из вас может быть интересна тема разработки и отладки кода 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.

    Но прежде чем писать продолжение, меня интересует ваше мнение, уважаемые хабрачитатели. Спасибо заранее за ваш голос.

    Only registered users can participate in poll. Log in, please.

    Стоит ли продолжать, будет ли продолжение кому-то интересным, кроме двух с половиной UEFI-энтузиастов?

    • +27
    • 16.9k
    • 3
    Share post

    Comments 3

      +1
      практически полностью (за исключением микрокода) открытая реализация UEFI BIOS

      Memory Init вроде ж тоже закрыт?
        0
        Я пока настолько глубоко не копал, но на первый взгляд код MemoryInit тоже открыт (BSP/Quark_EDKII_v1.0.1/QuarkSocPkg/QuarkNorthCluster/MemoryInit/Pei).
        0
        Простите за оффтоп. На голосование нажал на «Я бэтман!», потому что Бэтман рулет !). А вообще очень интересно, продолжайте дальше.

        Only users with full accounts can post comments. Log in, please.