Как приступить к программированию для UEFI? Лучше всего начать с разбора ассемблерного кода простейшего 64-битного приложения, которое, пользуясь стандартными EFI-средст­ва­ми, обслуживает ввод и вывод информации. Предлагаемая вашему вниманию демон­стра­ци­он­ная версия HELLO.ASM именно для этого и предназначена. Исходный текст написан для дальнейшей компиляции в среде FASM в предположении, что пакет размещается в одноименном каталоге. Файл ASM.BAT призван по возможности облегчить эту процедуру.

Как работает UEFI-приложение HELLO.EFI?

Запуск приложения

Результатом компиляции ассемблерной программы HELLO.ASM является простейшее x64 UEFI-приложение HELLO.EFI, знакомство с которым может приблизить понимание работы рас­ши­ря­е­мо­го интерфейса фирменного программного обеспечения. Запустив это приложение из оболочки UEFI, мы вправе ожидать вывод на экран дисплея следующего сообщения:

UEFI x64 programming demo. (C) IC Book Labs.
http://jelezo.com.ua/
Press any key...

Работа UEFI-приложения завершается после нажатия любой клавиши.

Сохранение контекста

Изменение состояния некоторых регистров в UEFI-приложении может привести к нарушению контекста окаймляющей среды (UEFI Shell или UEFI BIOS). Во избежание этого мы сохраняем все регистры процессора при запуске (инструкции PUSH) и восстанавливает при выходе (инструкции POP). Обязательный для сохранения список приведен в спецификации UEFI. Заметим, что 64-битный режим не поддерживает инструкции PUSHA/POPA, позволяющие сохранять и восстанавливать все регистры одной инструкцией.

Входные параметры

Параметры, полученные от родительской задачи сохраняются в ячейках памяти для последующего использования:

  • EFI_Handle: идентификатор нашего приложения;
  • EFI_Table: указатель на корневую таблицу EFI, адресующую все системные объекты UEFI.

Обслуживание вывода

Выводим текстовое сообщение с помощью подпрограммы Output_String. Эта подпрограмма использует EFI Simple Text Output Protocol.

Обработка ввода

Ожидаем нажатия клавиши, вызвав подпрограмму Input_Check_Key, которая использует EFI Simple Text Input Protocol.

Возврат управления

Дождавшись нажатия клавиши, восстанавливаем регистры, обнуляем EFI_STATUS (регистр RAX=0) и возвращаем управление родительской задаче. Таковой может быть UEFI Shell или UEFI firmware.

Особенности реализации

Внутренние подпрограммы

В целях экономии размера кода, вызов заданной функции заданного UEFI протокола, с сохранением-восстановлением регистров и обработкой статуса реализован подпрограммой EFI_API.

Вызовы процедур

UEFI x64 использует плоскую 64-битную модель адресации памяти, поэтому все подпрограммы в нашем приложении, а также используемые функции UEFI-протоколов, вызываются как внутрисегментные процедуры с 64-битным адресом (NEAR 64).


20.01.2018