Запуск в QEMU
Ранее вы сохранили образ U-Boot в файле $LFA/bootloader.bin
. Вам потребуется сохранить этот файл и образ системы отдельно друг от друга для возможности запуска собранной системы LFA.
Минимальная команда для запуска эмулятора QEMU с загрузчиком U-Boot выглядит так:
- для AArch64:
qemu-system-aarch64 -machine virt \
-nographic \
-cpu cortex-a57 \
-bios $LFA/bootloader.bin
- для других архитектур семейства ARM:
qemu-system-arm -machine virt \
-nographic \
-bios $LFA/bootloader.bin
Объяснение новых значений:
-nographic
— обеспечивает вывод данных в терминал;
-cpu cortex-a57
— по какой-то странной причине программеqemu-system-aarch64
необходимо явно указать использование 64-битного процессора, иначе эмулятор запустится в 32-битном режиме.
-bios $LFA/bootloader.bin
— использовать скомпилированный загрузчик U-Boot.
Вы также можете создать образ, в котором будут храниться сохранённые переменные окружения U-Boot. Это можно сделать, выполнив следующие действия:
- Создать образ
envstore.img
с помощьюqemu-img
:
qemu-img create -f raw $LFA/envstore.img 64M
- Передать команде для запуска виртуальной машины параметр
pflash drive
:
-drive if=pflash,format=raw,index=1,file=$LFA/envstore.img
Эмуляция блочных устройств
Поскольку командой выше вы только запустили загрузчик. Однако помимо загрузчика нужно передать аргументы, указывающие на образ операционной системы (генерацию такого образа см. далее в руководстве).
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
Во всех вариантах аргументов командной строки из этого пункта замените имя
disk.img
на название сгенерированного образа с системой. Подробнее о сборке образа с системой см. в пункте №8.1 «Сборка образа для QEMU».
Дополнительные устройства
Возможно, для работы вашей системы понадобится эмуляция дополнительных устройств. Ниже представлены аргументы для команды запуска виртуальной машины QEMU, включающие эмуляцию некоторых из них.
- Чтобы добавить видеоконтроллер, удалите аргумент
-nographic
, заменив его, например, следующим:
-serial stdio -device VGA
- Для добавления генератора псевдослучайных чисел, добавьте аргумент:
-device virtio-rng-pci
Ещё немного про виртуализацию
QEMU для ARM поддерживает специальную виртуальную машину virt
, предоставляющую следующие базовые функции:
- Свободно настраиваемое количество ядер процессора;
- U-Boot, который загружается и выполняется по адресу
0x0
; - Сгенерированный блоб дерева устройств, помещённый в начало оперативной памяти;
- Свободно конфигурируемый объём ОЗУ, описываемый в
*.dtb
; - Последовательный порт PL011, описываемый в
*.dtb
; - Таймер (для архитектуры ARMv7/ARMv8);
- PSCI для перезагрузки системы;
- Общий хост-контроллер PCI на базе ECAM, описываемый в
*.dtb
;
Кроме того, к PCI шине можно подключить ряд дополнительных периферийных устройств.
См. раздел Devicetree in QEMU в документации U-Boot для получения информации о том, как увидеть дерево устройств, фактически сгенерированное QEMU.