Эмуляция в QEMU (ARM)
Загрузчик операционной системы, предназначенный для встраиваемых систем на MIPS, ARM, PowerPC и т.д.
- Версия: 2023.10
- Домашняя страница: https://source.denx.de/u-boot/u-boot
- Время сборки: 10 ОВС
Настройка U-Boot
Установите имя аргумента qemu_*_defconfig
в зависимости от архитектуры, для которой вы собираете:
if [ $LFA_TGT == "aarch64-linux-musleabihf" ]
then
QEMU_ARCH="arm64"
else
QEMU_ARCH="arm"
fi
Сконфигурируйте пакет U-Boot:
make CROSS_COMPILE=$LFA_TGT- \
qemu_${QEMU_ARCH}_defconfig
ACPI в QEMU
QEMU (начиная с версии v8.0.0) может предоставлять таблицы ACPI для ARM. Для их поддержки нужны следующие настройки U-Boot:
CONFIG_CMD_QFW=y
CONFIG_ACPI=y
CONFIG_GENERATE_ACPI_TABLE=y
Вместо того, чтобы обновлять файл .config
вручную, вы можете добавить опцию acpi.config
в команду make
. Например:
make orangepi-3_defconfig acpi.config
Сборка
make CROSS_COMPILE=$LFA_TGT-
Запуск U-Boot
Минимальная команда для запуска эмулятора QEMU с загрузчиком U-Boot выглядит так:
- для AArch64:
qemu-system-aarch64 -machine virt \
-nographic \
-cpu cortex-a57 \
-bios u-boot.bin
- для других архитектур семейства ARM:
qemu-system-arm -machine virt \
-nographic \
-bios u-boot.bin
Объяснение новых значений:
-nographic
— обеспечивает вывод данных в терминал;
-cpu cortex-a57
— по какой-то странной причине программеqemu-system-aarch64
необходимо явно указать использование 64-битного процессора, иначе эмулятор запустится в 32-битном режиме.
Эмуляция блочных устройств
QEMU может эмулировать обычные блочные устройства. Добавьте следующие параметры в команду qemu-system-aarch64
(или qemu-system-arm
):
- MMC:
-device sdhci-pci,sd-spec-version=3 \
-drive if=none,file=disk.img,format=raw,id=MMC1 \
-device sd-card,drive=MMC1
- NVMe:
-drive if=none,file=disk.img,format=raw,id=NVME1 \
-device nvme,drive=NVME1,serial=nvme-1
- SATA:
-device ahci,id=ahci0 \
-drive if=none,file=disk.img,format=raw,id=SATA1 \
-device ide-hd,bus=ahci0.0,drive=SATA1
- USB:
-device qemu-xhci \
-drive if=none,file=disk.img,format=raw,id=USB1 \
-device usb-storage,drive=USB1
Ещё немного про виртуализацию
QEMU для ARM поддерживает специальную виртуальную машину virt
, предоставляющую следующие базовые функции:
- Свободно настраиваемое количество ядер процессора;
- U-Boot, который загружается и выполняется по адресу
0x0
; - Сгенерированный блоб дерева устройств, помещённый в начало оперативной памяти;
- Свободно конфигурируемый объём ОЗУ, описываемый в
*.dtb
; - Последовательный порт PL011, обнаруживаемый в
*.dtb
; - Таймер (для архитектуры ARMv7/ARMv8);
- PSCI для перезагрузки системы;
- Общий хост-контроллер PCI на базе ECAM, обнаруживаемый в
*.dtb
;
Кроме того, к PCI шине можно подключить ряд дополнительных периферийных устройств.
См. раздел Devicetree in QEMU в документации U-Boot для получения информации о том, как увидеть дерево устройств, фактически сгенерированное QEMU.
Смотрите также: