Как загрузить Linux aarch64 с U-Boot с помощью Buildroot на QEMU? - PullRequest
0 голосов

Я пробовал:

git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2019.08
make qemu_aarch64_virt_defconfig
make menuconfig

В menuconfig, я установил:

  • Загрузчики
    • Конфигурация U-Boot (с использованием встроенной платыфайл defconfig)
      • qemu_arm64
  • Ядро
    • Установить образ ядра в / boot в целевой папке

и наконец:

make BR2_JLEVEL="$nproc"

Теперь я могу нормально загружаться без U-Boot с помощью командной строки, указанной в: Как загрузить мастер ядра Linux Torvalds, (пере) скомпилируйте и загрузите его с QEMU?

./output/host/usr/bin/qemu-system-aarch64 -M virt -cpu cortex-a57 -nographic -smp 1 -kernel output/images/Image -append "root=/dev/vda console=ttyAMA0" -netdev user,id=eth0 -device virtio-net-device,netdev=eth0 -drive file=output/images/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0

, но это не использует U-Boot.

Когда я делаю:

ls -l output/images/

он содержит:

-rw-r--r-- 1 ciro ciro 6.5M 2019-09-20_13:36:23 Image
-rw-r--r-- 1 ciro ciro  60M 2019-09-20_13:39:02 rootfs.ext2
lrwxrwxrwx 1 ciro ciro   11 2019-09-20_13:36:25 rootfs.ext4 -> rootfs.ext2
-rw-r--r-- 1 ciro ciro 583K 2019-09-20_13:34:15 u-boot.bin

, поэтому там есть бинарный файл U-Boot: u-boot.bin, но как мне использовать его с QEMU?

Я пытался, как упоминалось в: Может ли системный эмулятор ARM qemu загружаться с образа карты без параметров ядра? для удаления -kernel и -append и добавления -bios u-boot.bin:

./output/host/usr/bin/qemu-system-aarch64 -M virt -cpu cortex-a57 -nographic -smp 1 -bios output/images/u-boot.bin -netdev user,id=eth0 -device virtio-net-device,netdev=eth0 -drive file=output/images/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0

Теперь я получаю U-Загрузочная оболочка, но при загрузке происходит сбой и не появляется приглашение U-Boot:

U-Boot 2019.07 (Sep 20 2019 - 13:34:10 +0100)

DRAM:  128 MiB
Flash: 128 MiB
*** Warning - bad CRC, using default environment

In:    pl011@9000000
Out:   pl011@9000000
Err:   pl011@9000000
Net:   
Warning: virtio-net#31 using MAC address from ROM
eth0: virtio-net#31
Hit any key to stop autoboot:  0 
starting USB...
No working controllers found
USB is stopped. Please issue 'usb start' first.
scanning bus for devices...

Device 0: unknown device

Device 0: QEMU VirtIO Block Device
            Type: Hard Disk
            Capacity: 60.0 MB = 0.0 GB (122880 x 512)
... is now current device
** No partition table - virtio 0 **
starting USB...
No working controllers found
BOOTP broadcast 1
DHCP client bound to address 10.0.2.15 (2 ms)
Using virtio-net#31 device
TFTP from server 10.0.2.2; our IP address is 10.0.2.15
Filename 'boot.scr.uimg'.
Load address: 0x40200000
Loading: *
TFTP error: 'Access violation' (2)
Not retrying...
BOOTP broadcast 1
DHCP client bound to address 10.0.2.15 (0 ms)
Using virtio-net#31 device
TFTP from server 10.0.2.2; our IP address is 10.0.2.15
Filename 'boot.scr.uimg'.
Load address: 0x40400000
Loading: *
TFTP error: 'Access violation' (2)
Not retrying...
=> 

, поэтому яПохоже, что U-Boot не может работать с устройством VirtIO?Или, по словам Питера, я должен создать таблицу разделов.Я не смог найти это автоматически в Buildroot, но я мог сделать это вручную, вот один из подходов: https://unix.stackexchange.com/questions/209566/how-to-format-a-partition-inside-of-an-img-file/527132#527132

Другой подход - сохранить -kernel -append и позволить QEMU поместить ядро ​​в память, как это было сделано.без U-Boot, а затем используйте команду booti U-Boot, которую я нашел в help:

booti     - boot Linux kernel 'Image' format from memory

, поэтому мне просто нужно узнать ее адрес.Но это своего рода обман, так как я хочу, чтобы U-boot выполнял тяжелую работу, а не чит с QEMU.

Моя цель - создать хорошую настройку для разработки U-Boot и ранней загрузки QEMU.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Учитывая, что u-boot правильно обнаруживает блокировочное устройство virtio, я думаю, что вряд ли он справится с этим.Выводится сообщение об ошибке: «** Нет таблицы разделов - virtio 0 **», и это правильно, поскольку вы настроили блочное устройство только на rootfs.ext4, который будет образом файловой системы.Это говорит о том, что вам повезет больше, если вы создадите образ диска с таблицей разделов и запишите rootfs в раздел в образе диска.

0 голосов

Я последовал совету Питера и поместил его в многораздельное изображение с помощью команды sfdisk-fs-to-img из https://unix.stackexchange.com/questions/209566/how-to-format-a-partition-inside-of-an-img-file/527132#527132

Теперь я могу читать корневую файловую систему с:

ls virtio 0 /boot

и он содержит Image файл.

Теперь я думаю, что есть только некоторые особенности U-Boot, которые я не очень хорошо знаю:

  • load /boot/Imageв память с чем-то вроде load virtio 0 0x100000 /boot/Image.ТОДО какой адрес действителен?Этот произвольный выбор дал ** Reading file would overwrite reserved memory **
  • возможность узнать, как загрузить аргументы DTB и CLI ядра.DTB должен был бы быть автоматически сгенерирован с QEMU с qemu-system-aarch64 -machine dumpdtb=dtb.dtb
  • загрузить его с чем-то вроде: booti 0x100000

Я надеялся, что Buildroot автоматизирует вещи немного большедля меня грустное лицо.

...