Новости

02.10.2017

RU.efi, утилита Джеймса Ванга, сотрудника тайваньского ...

  • Все новости (38)
  • Разделы новостей

    Публикации

    Майнеру на заметку

    Утилиты

    Реклама

    Обзоры компьютерных гаджетов, которые должны быть всегда под рукой

        Яндекс.Метрика
    Главная » Статьи » Как работать с EFI Byte Code

    Как работать с EFI Byte Code

    Сегодня сфера применения шин PCI и PCI Express не ограничивается системами на основе архитектуры x86. Это обстоятельство является проблемой для разработчиков встроенного программного обеспечения, находящегося в постоянном запоминающем устройстве (ПЗУ) плат расширения. Будь то устаревший Legacy ROM, или современный UEFI драйвер, процедуры поддержки устройства, находящиеся в ПЗУ написаны в системе команд центрального процессора, чаще всего x86. В результате видео адаптер или дисковый контроллер невозможно использовать в платформах с другим типом процессора, несмотря на полную аппаратную совместимость. В ряде устройств можно встретить реализацию firmware в виде нескольких блоков, предназначенных для разных типов платформ, но в силу своей неэффективности и громоздкости, такой подход не получил распространения. Спецификация UEFI предложила другое решение — EFI Byte Code.

    Запускаем собственную EBC-подпрограмму

    Знакомство с EFI Byte Code стоит начать со статьи «Теория и практика EFI Byte Code», в которой изложены азы программирования для регистровой виртуальной машины. На примере программы «Hello, EBC!» можно открыть для себя волшебный мир UEFI :)

    Рассмотрим небольшое UEFI-приложение, демонстрирующее выполнение простейшей EBC-подпрограммы. Назовем его CheckEBC и вменим ему в обязанности найти и инициализировать интерпретатор EFI Byte Code из firmware системной платы. После этого — проинформировать нас о свойствах EBC-интерпретатора и запустить с его помощью собственную EBC-программу, являющуюся частью нашего приложения, которая выведет текстовую строку «This string show by EBC code».

    Таким образом, программа моделирует действия UEFI Shell, выполняемые при запуске UEFI-приложения, написанного в системе команд EBC. С той лишь разницей, что приложение не загружается с диска, а является частью нашей программы.

    Результирующую информацию выведем текстовыми строками посредством EFI Simple Text Output Protocol (см. Как работает UEFI-приложение HELLO.EFI?)

    Алгоритм CheckEBC

    Кратко опишем основные действия нашей программы (см. исходный файл CHECKEBC.ASM и подключаемые модули).

    1. Находим интерпретатор EFI Byte Code в составе firmware материнской платы. Для этого с помощью функции Locate Protocol, используя идентификатор GUID, детектируем EFI EBC Protocol.

    EFI EBC Protocol предоставляет набор сервисных функций для запуска интерпретатора EBC-подпрограмм
    Рис.1
    . EFI EBC Protocol предоставляет набор сервисных функций
    для запуска интерпретатора EBC-подпрограмм

    1. Запрашиваем и визуализируем версию виртуальной машины (EBC Interpreter Version).
    2. Определяем адрес точки входа в нашу процедуру (EfiByteCodeEntry). В файле CODE_EBC.INC подготовлена процедура вывода текстовой строки, написанная в инструкциях виртуальной машины EBC. Визуализируем адрес процедуры как EBC routine entry point.
    3. Запрашиваем и визуализируем адрес для вызова интерпретатора EBC, параметр EBC thunk entry point.
    4. Выполняем 64-битный вызов подпрограммы по адресу, полученному на шаге 4. В результате будет выполнена EBC-процедура, находящаяся в файле CODE_EBC.INC. На экране визуализируется строка: This string show by EBC code.

    Результат работы CheckEBC

    Поддержка EBC на указанной платформе успешно обнаружена, наша программа выдала следующий результат:

    EFI Byte Code execution demo. (C) IC Book Labs. http://jelezo.com.ua/
    EFI EBC Protocol GUID = 13AC6DD1-73D0-11D4-B0-6B-00-AA-00-BD-6D-E7
    Protocol detected, interface address = 00000000DC28C898h
    EBC interpreter version = 0000000000010000h
    EBC routine entry point = 00000000C9D7E000h
    EBC thunk entry point = 00000000D0021098h
    This string show by EBC code.

    Резюме

    Эксперименты проводились на платформе ASUS Z87-K, построенной на основе системной логики Intel Z87 для процессоров Socket 1150. Процессор Intel(R) Xeon(R) CPU E3-1270 v3 @ 3.50GHz. Видео адаптер Sapphire X1950PRO (ATI/AMD). Для трансляции программы и генерации 64-битного UEFI приложения используется FASM 1.69.50. Инструкции виртуальной машины EFI Byte Code заданы в виде 16-ричных констант



    17.11.2017