Запуск в 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.