Про MinnowBoard Max
MinnowBoard Max платка с процессором Intel Atom. При включении питания и при условии что прошит рабочий uefi на экране монитора, подключенного по hdmi увидим командную строку uefi.
Инструкция по сборке UEFI располагается в Release Notes по адресу http://firmware.intel.com/projects/minnowboard-max.
Так например для сборки версии 0.78 открываем соответствующий Release Notes и выполняем последовательность действий.
1. Получаем ревизию 16867 для UDK2014.SP1
svn checkout -r 16867 https://svn.code.sf.net/p/edk2/code/branches/UDK2014.SP1
2. Получаем ревизию 17039 в другую директорию
svn checkout -r 17039 https://svn.code.sf.net/p/edk2/code/branches/UDK2014.SP1
и из этой директории берем только две папочки Vlv2DeviceRefCodePkg и Vlv2TbltDevicePkg и подменяем ими в ревизии 16867
3. Получаем FatPkg ревизии 92 и затем помещаем в корень дерева ривизии 16867
svn checkout -r 92 https://svn.code.sf.net/p/edk2-fatdriver2/code/trunk/FatPkg
4. Получаем архив MinnowBoard_MAX-0.78-Binary.Objects.zip. Распаковываем и копируем три директории (IA32FamilyCpuPkg, Vlv2BinaryPkg, Vlv2MiscBinariesPkg) в корень дерева ревизии 16867.
5. Рабочей директорией будет папочка с ревизией 16867, поэтому остальные полученные файлы можно смело удалить. Всё дальнейше описание действий будет относится к папочке с ревизией 16867.
Выполняем следующую последовательность действий.
$ make -C ./BaseTools $ export EDK_TOOLS_PATH=/home/user1/MyWork/Minnow/UDK2014.SP1/BaseTools $ . edksetup.sh BaseTools
6. Выполняем то что написано в этом файле CryptoPkg\Library\OpensslLib\Patch-HOWTO.txt, а именно- скачиваем архив openssl-0.9.8ze.tar.gz, и распаковываем его в CryptoPkg\Library\OpensslLib, затем применяем патч
$ patch -p0 -i ../EDKII_openssl-0.9.8ze.patch
и выполняем скрипт:
$ ./Install.sh
7. Переходим в директорию Vlv2TbltDevicePkg и запускаем сборку:
$ cd ./Vlv2TbltDevicePkg $ . Build_IFWI.sh MNW2 Release
Первая сборка у меня почему то заканчивается ошибкой. Повторяю действия:
$ cd ./Vlv2TbltDevicePkg $ . Build_IFWI.sh MNW2 Release
Опять ошибка. Снова повторяю действия:
$ cd ./Vlv2TbltDevicePkg $ . Build_IFWI.sh MNW2 Release
И собралось. Что за муть не понятно (возможно из-за многопотоковости, разбираться в лом).
При этом важно чтобы совпадали версии компилятора и сборка происходила на x64 если выбрана данная конфигурация. К примеру если gcc -v показывает что версия 4.8, то значит и при сборке переменная должна иметь соответствующее значение Toolchain = GCC48. (Переменная может быть установлена в файле bld_vlv.sh)
Сборка buildroot для minnowboard max.
1. качаем дистрибутив buildroot с официального сайта любым из доступных способов.
2. выполняем конфигурацию дистрибутива под платку minnowboard max:
$ make minnowboard_max_defconfig
3. добавляем в ядро поддержку файловой системы efi для возможности получения доступа к переменным efi через /sys/firmware/efi/vars:
$ make linux-menuconfig
отметить звездочкой опции:
CONFIG_EFI_VARS
CONFIG_EFIVAR_FS
Добавляем в buildroot утилиту efibootmgr.
1. создаем папочку buildroot/package/efibootmgr
2. в этой папочке создаём файл Config.in следующего содержания:
config BR2_PACKAGE_EFIBOOTMGR bool "efibootmgr" select BR2_PACKAGE_PCIUTILS help efibootmgr
3. в этой папочке создаём файл efibootmgr.mk
EFIBOOTMGR_VERSION = 0.6.0 EFIBOOTMGR_SOURCE = efibootmgr-$(EFIBOOTMGR_VERSION).tar.gz EFIBOOTMGR_SITE = http://linux.dell.com/efibootmgr/efibootmgr-0.6.0/ EFIBOOTMGR_INSTALL_STAGING = YES $(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION): $(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION)/.unpacked cd $(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION); make define EFIBOOTMGR_INSTALL_STAGING_CMDS cd $(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION); make $(INSTALL) -D -m 0755 $(@D)/src/efibootmgr/efibootmgr $(STAGING_DIR)/usr/sbin/efibootmgr endef define EFIBOOTMGR_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/src/efibootmgr/efibootmgr $(TARGET_DIR)/usr/sbin/efibootmgr endef $(eval $(generic-package))
4. В файл buildroot/package/Config.in добавляем строчку:
source "package/efibootmgr/Config.in"
Утилита efibootmgr позволяет изменять переменные uefi при загруженном ядре из пространства пользователя.
Если сборка выполняется стандартным образом через запуск make из корня efibootmgr(т.е. вне дистрибутива buildroot или yocto), то возможно появление вот такой ошибки:
src/lib/efi.c:38:21: фатальная ошибка: pci/pci.h: Нет такого файла или каталога
Самый простой способ её преодоления это использовать компилятора из yocto или из buildroot (в buildroot компилятор должен быть собран с поддержкой соответствующих опций). Для использования стороннего компилятора следует изменить Makefile как то так:
RELEASE_DATE := "03-Jan-2008" RELEASE_MAJOR := 0 RELEASE_MINOR := 5 RELEASE_SUBLEVEL := 4 RELEASE_EXTRALEVEL := RELEASE_NAME := efibootmgr RELEASE_STRING := $(RELEASE_NAME)-$(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_SUBLEVEL)$(RELEASE_EXTRALEVEL) CFLAGS = $(EXTRA_CFLAGS) -DEFIBOOTMGR_VERSION=\"$(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_SUBLEVEL)$(RELEASE_EXTRAL EVEL)\" \ -Wall -g -D_FILE_OFFSET_BITS=64 LDFLAGS += -lz CC = /home/user1/MyWork/MB/poky/build/tmp/sysroots/x86_64-linux/usr/bin/x86_64-poky-linux/x86_64-poky-linux-gcc MODULES := src
Сборка yocto для Minnowboard Max.
1. Качаем дистрибутив yocto:
$ git clone -b dizzy git://git.yoctoproject.org/poky
2. Качаем рецепты интел
$ cd poky $ git clone -b dizzy git://git.yoctoproject.org/meta-intel
3. Настраиваем переменные окружения и создаём директорию в которой будет осуществляться сборка проекта с помощью не затейливой команды:
$ source oe-init-build-env
4. В файл conf/bblayers.conf добавляем путь до директории meta-intel
$ echo "BBLAYERS += \"/home/user1/MyWork/MB/poky/meta-intel\"" >> conf/bblayers.conf
5. Прописываем цель сборки:
echo "MACHINE = \"intel-corei7-64\"" >> conf/local.conf
6. Запускаем сборку.
Можно через вызов утилиты hob:
$ hob
или с помощью bitbake:
$ bitbake core-image-minimal
Запуск uefi в Qemu
Для отладки uefi имеет смысл использовать qemu. Как запустить uefi в qemu:
1. переходим в папочку OvmfPkg и запускаем build.sh
2. после удачной сборки должна появиться папочка с файлами:
Build/OvmfX64/DEBUG_GCC48/FV
в этой папочке нас интересует файл OVMF.fd это и есть файл биоса для qemu.
3. для запуска нужно выполнить:
$ qemu-system-x86_64 -bios ./OVMF.fd Could not open option rom 'vapic.bin': No such file or directory qemu-system-x86_64: pci_add_option_rom: failed to find romfile "vgabios-cirrus.bin" qemu-system-x86_64: pci_add_option_rom: failed to find romfile "pxe-rtl8139.rom"
После чего появится окно в котором будет происходить запуск uefi. После старта появиться возможность работы в shell uefi.
4. Для запуска ядра линукс через qemu можно использовать ФС и образ ядра полученных после сборки yocto.
Команда для запуска ядра через uefi в qemu выглядит так:
qemu-system-x86_64 -bios ./OVMF.fd -cdrom ./fs.iso
где fs.iso это iso образ полученный в результате сборки цели core-image-minimal в yocto.
Если необходимо чтобы при запуске qemu была возможность сохранения лога в файл то запуск qemu будет выглядеть так:
qemu-system-x86_64 -bios ./OVMF.fd -cdrom ./fs.iso -serial stdio
При этом используется следующая команда для получения данного iso образа:
#!/bin/sh ./mkisofs -A boot -V boot \ -o /home/user1/MyWork/MB/tmp/qemu/fs.iso \ -b isolinux/isolinux.bin \ -c isolinux/boot.cat \ -r -no-emul-boot -boot-load-size 4 -boot-info-table \ -eltorito-alt-boot -eltorito-platform efi -b efi.img -no-emul-boot \ -no-emul-boot /home/user1/MyWork/MB/tmp/qemu/iso/iso_dir
Хотя утилита mkisofs является стандартной и присутствует в юбунте, но в данном случае mkisofs тоже взята из дистрибутива yocto ( её можно найти через поиск в poky/build/tmp/work). Запуск стандартной утилиты почему-то заканчивается вот такой ошибкой:
Invalid node — 'efi'.