UEFI, виртуальные машины и отладка

17 Фев 2015

Обзор отладчика программного обеспечения FDBG

Сегодня мы изучим процесс отладки приложений в среде UEFI x64 с помощью отладочного инструмента FDBG от автора Feryno. Чтобы такая работа не превратилась в банальную и монотонную, параллельно будем решать еще одну задачу – запустив FDBG на виртуальной машине в среде Oracle VirtualBox, проанализируем системные объекты, находящиеся в адресном пространстве виртуальной машины. Акцент сделаем на низкоуровневых аппаратных различиях между виртуальной и реальной платформами.

Ожидаемым фактом является то, что в отличие от Windows-версии рассматриваемого отладчика, снабженной оконным интерфейсом, UEFI-реализация использует консольный интерфейс и напоминает debug.exe времен MS-DOS.

Отладчик FDBG в среде Windows 64-bit
Рис. 1. Отладчик FDBG в среде Windows 64-bit

Создание инструментальной и целевой виртуальных машин в среде Oracle VirtualBox

Полное описание процесса создания и запуска виртуальных машин в среде Oracle VirtualBox приводить не будем, продукт снабжен довольно удобным и интуитивным интерфейсом. Остановимся на особенностях этого процесса, важных для нашей задачи.

Первая виртуальная машина будет инструментальной, на нее установим произвольную ОС, например Windows. Она потребуется для того, чтобы стандартными средствами операционной системы выполнить подготовку образа загрузочного диска UEFI для второй машины. Необходимость в инструментальной машине связана с тем, что набор инструментов, доступных в среде UEFI, пока еще недостаточно широк.

Вторая машина будет целевой платформой для загрузки в режиме UEFI. Операционную систему на нее устанавливать не нужно. При ее создании следует обратить внимание на следующие опции:

Задание версии операционной системы для целевой машины
Рис. 2. Задание версии операционной системы для целевой машины

Так как предстоят эксперименты с 64-битной реализацией UEFI, требуется выбрать 64-битную систему в разделе Общие.

Установка опции UEFI-загрузки для целевой машины
Рис. 3. Установка опции UEFI-загрузки для целевой машины

Для выполнения UEFI-загрузки, необходимо установить флажок Включить EFI в разделе Система.

Итак, у нас есть инструментальная машина, на виртуальном жестком диске которой установлена операционная система и целевая машина, виртуальный жесткий диск которой на данный момент пуст. Для того чтобы инструментальную машину можно было использовать для подготовки содержимого загрузочного диска целевой машины, нужно подключить жесткий диск целевой машины к инструментальной машине. Заметим, что наличие общего диска делает одновременный запуск машин невозможным.

Подключение жесткого диска к инструментальной виртуальной машине
Рис. 4. Подключение жесткого диска к инструментальной виртуальной машине

Для подключения жесткого диска к инструментальной виртуальной машине используем кнопку Добавить диск. В результате, подключено два диска:

  • WinXP32.vdi – это загрузочный диск инструментальной машины с операционной системой.
  • UEFI.vdi - диск целевой машины.

Подготовка диска для UEFI-загрузки

Загружаем операционную систему на инструментальной машине. Так как диск целевой машины исходно не инициализирован, он не будет доступен на уровне файловой системы. Используя штатные инструменты, необходимо создать раздел с файловой системой FAT32. Напомним, в среде UEFI не поддерживается файловая система NTFS.

Инструментарий для работы с дисками в среде Windows XP
Рис. 5. Инструментарий для работы с дисками в среде Windows XP

Согласно спецификации, UEFI-загрузка подразумевает запуск с диска приложения (загрузчика) по определенному пути и имени. Для UEFI x64 путь и имя должны быть такими:

\EFI\BOOT\bootx64.efi

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

Отладчик и тестовый пример доступны на сайте http://fdbg.x86asm.net/ выбираем UEFI x64 version. Загружаем и распаковываем архив, файлы fdbg.efi и test.efi размещаем в корневом каталоге диска. Было замечено, что при размещении файла примера в каталоге, отличном от корневого, отладчик отказывался его загружать.

UEFI загрузка, запуск отладчика в среде UEFI Shell

Пользуясь инструментальной машиной, мы подготовили диск для загрузки целевой машины. Теперь надо выключить инструментальную машину и  включить целевую. Так как эти машины используют общий виртуальный жесткий диск, их одновременная работа невозможна. Запустив целевую машину, мы должны увидеть примерно следующее:

Запуск UEFI Shell
Рис. 6. Запуск UEFI Shell

Практика использования реальных и виртуальных платформ показывает, что возможность UEFI загрузки может зависеть от типа загрузочного устройства (IDE или SATA). Поэтому, если загрузка не выполняется, рекомендуем обратиться к вкладке Носители в меню настроек VirtualBox.

Выбираем устройство fs0: <enter> вводим имя приложения FDBG <enter>, запускаем отладчик. В ответ на приглашение, вводим имя отлаживаемого приложения - test.efi <enter>. Видим первую инструкцию приложения.

Запуск FDBG, загрузка и запуск примера
Рис. 7. Запуск FDBG, загрузка и запуск примера

Изучаем основные функции отладчика FDBG

h - вывод справочной информации
Рис. 8. h - вывод справочной информации

c - дизассемблирование инструкций
Рис. 9. c - дизассемблирование инструкций

t - трассировка, или покомандное выполнение инструкций
Рис. 10. t - трассировка, или покомандное выполнение инструкций

Отладчик не только дизассемблирует инструкции процессора, но и комментирует обращения к системным объектам и таблицам UEFI.

 r - просмотр содержимого регистров общего назначения
Рис. 11. r - просмотр содержимого регистров общего назначения

Задавая параметры, можно также просматривать регистры SSE, MMX, x87. Например:

r xmm0
r mm0
r st0

В рамках другого эксперимента, мы убедились, что отладчик FDBG поддерживает 256-битные регистры AVX (YMM0-YMM15). Но сейчас не сможем это увидеть, поскольку функциональность виртуальной машины несколько уступает функциональности хост-машины, в частности, виртуальная машина не поддерживает AVX.

d - дамп памяти
Рис. 12. d - дамп памяти

Некоторое неудобство доставляет вывод дампа без интервалов между байтами. Задав d ffffff80, просматриваем последние 128 байт 4-гигабайтного диапазона. Напомним, что последние 16 байт этого диапазона (адрес fffffff0h) начинаются с первой процессорной инструкции, выполняемой после сброса. Последовательность 90h, 90h, EBh, ACh, это две инструкции NOP и внутрисегментный относительный переход (JMP) с 8-битным смещением.

Резюме

Вызывает ли интерфейс UEFI энтузиазм у разработчиков системного программного обеспечения или остается «вещью в себе»? Ниже приведем три аргумента в пользу первого варианта.

  1. Один из основных инструментов для создания виртуальных машин, Oracle VirtualBox, поддерживает UEFI. Исследовательская работа, описанная в статье, выполнялась в 64-битном режиме, вместе с тем, реализация IA32 UEFI также доступна в этом продукте. Причем, в обоих режимах (x64 и IA32), UEFI firmware виртуальной машины способно загружать и выполнять приложения, написанные в системе команд EBC (EFI Byte Code).
  2. В семействе отладчиков FDBG, имеется UEFI x64 реализация отладчика. Продукт можно считать несколько «сырым», но уже пригодным для практического применения. На сайте разработчика также доступен исходный код программы.
  3. Ранее мы уже знакомили наших читателей с отладчиком Intel EBC Debugger
Теги: