Я пробовал:
git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2019.08
make qemu_aarch64_virt_defconfig
make menuconfig
В menuconfig
, я установил:
- Загрузчики
- Конфигурация U-Boot (с использованием встроенной платыфайл defconfig)
- Ядро
- Установить образ ядра в / 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.