Страница 1 из 1

QEMU-2

Добавлено: 03.11.21 12:15
БудДен

Re: QEMU-2

Добавлено: 03.11.21 12:48
БудДен

Код: Выделить всё

/y/qemu/arm-softmmu/qemu-system-arm -M raspi2 -kernel /y/vb_share/jaos/coop-rpi-works-again/kernel7.img -dtb /y/vb_share/rpif/bcm2709-rpi-2-b.dtb -serial null -serial stdio
- всё ещё не работает, вроде уж всё сделал как надо. Видимо, нужно опять прогонять по одному простые примеры.

Re: QEMU-2

Добавлено: 03.11.21 12:52
БудДен
Теперь попробую это: https://stackoverflow.com/questions/288 ... -2-on-qemu - "Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2016-05-27, vanilla kernel" - правда, вызывает сомнение то, что другая дата распбиана.

Re: QEMU-2

Добавлено: 03.11.21 15:48
БудДен
Действовал по этому ответу, дошёл до

Код: Выделить всё

/y/qemu/build/arm-softmmu/qemu-system-arm -M raspi2 -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" -cpu arm1176 -dtb bcm2709-rpi-2-b.dtb -m 1G -smp 4 -serial stdio -kernel kernel7.img -sd /y/vb_share/2016-05-27-raspbian-jessie/2016-05-27-raspbian-jessie.img 
Говорит Ok, booting the kernel и на этом всё. То же для 2015-02-16-raspbian-wheezy

Re: QEMU-2

Добавлено: 03.11.21 16:12
БудДен
Нашёл ещё это

https://github.com/eggman/raspberrypi - не пробовал пока

И это - буду проверять.

https://blog.3mdeb.com/2015/2015-12-30- ... 2-in-qemu/

Re: QEMU-2

Добавлено: 03.11.21 16:50
БудДен
Сработало для нашего ядра, во всяком случае, начало загружаться, в консоль пишет лог загрузки, и на экране рисует малинки.

Код: Выделить всё

/y/qemu0/arm-softmmu/qemu-system-arm -M raspi2 -kernel kernel7.img -sd 2015-02-16-raspbian-wheezy.img -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" -dtb bcm2709-rpi-2-b.dtb -serial stdio
Репозиторий в архиве (надо бы его сохранить, ибо обычная Qemu не работает в этой ситуации):

6bacb6e49a22469ac5ab516ecae9c5476b95da9c

(напоминаю, ОС - debian 9.4, на виртуалке под управлением Virtual Box 5.22.44 r139111)

Re: QEMU-2

Добавлено: 03.11.21 17:06
БудДен
Но наши примеры не работают (dw/uart03)

Re: QEMU-2

Добавлено: 03.11.21 17:46
БудДен
Здесь нашёл подсказку: https://stackoverflow.com/questions/605 ... art-output

Конечно, это какой-то мартышкин труд, надо бы системно учить все эти вещи. Но пока примеры так работают:

Код: Выделить всё

den73@deb8:/y/vb_share/2015-02-16-raspbian-wheezy$ /y/qemu0/arm-softmmu/qemu-system-arm -M raspi2 -kernel /y/dw/uart03/uart03.elf -dtb bcm2709-rpi-2-b.dtb -m 1024 -serial mon:stdio
den73@deb8:/y/vb_share/2015-02-16-raspbian-wheezy$ /y/qemu0/arm-softmmu/qemu-system-arm -M raspi2 -kernel /y/dw/uart03/uart03.elf -dtb bcm2709-rpi-2-b.dtb -m 1024 -serial null -serial mon:stdio

Re: QEMU-2

Добавлено: 03.11.21 17:49
БудДен
А при этом если вместо elf подаём bin, то не работает.

Re: QEMU-2

Добавлено: 03.11.21 18:35
БудДен
Поскольку раньше были эксперименты с попытками создавать elf из A2 были неудачны, попробуем превратить
наш bin обратно в elf

Код: Выделить всё

arm-none-eabi-objcopy --input-target=binary --output-target=elf32-little /y/dw/uart03/uart03.bin /y/dw/uart03/uart03.elf2

Re: QEMU-2

Добавлено: 03.11.21 19:05
БудДен
Нихера. Примеры работают, наше не работает.

Re: QEMU-2

Добавлено: 03.11.21 21:03
БудДен
Пробовал также elf32-big, elf32-bigarm - всё пофигу. Пытался напустить на него objdump, но ничего непонятно. Те elf-ы, которые получаются из примеров, тоже странные.

Re: QEMU-2

Добавлено: 03.11.21 21:45
БудДен
Примерно так: запускаем qemu с доп. ключами -s -S

Создаём файл скрипта commands.gdb:

Код: Выделить всё

target remote localhost:1234
file uartx01.elf
layout asm
sudo apt install gdb-arm-none-eabi

И запускаем

Код: Выделить всё

arm-none-eabi-gdb -tui --command=commands.gdb

Re: QEMU-2

Добавлено: 03.11.21 22:16
БудДен
Синтетический elf из примера сначала начинает как попало скакать по адресам, но в конце концов как-то попадает на стартовый адрес. Я не понимаю, что это...

Выяснилось, что исходный elf содержит почти пустоту прямо до адреса 0x8000, за которым идёт последовательность 02 D9 A0 E3, соответствующая первой команде нашей программы.

Код: Выделить всё

$ arm-none-eabi-objdump -b binary -m arm_any -D /y/dw/uartx01/uartx01.bin
00000000 <.data>:
   0:	e3a0d902 	mov	sp, #32768	; 0x8000
В bin-файле, полученном с помощью objdump с урезанием символов, эта последовательность идёт прямо с начала файла (но QEMU это и не понимает)

В синтетическом elf-файле, полученном с помощью повторного

Код: Выделить всё

arm-none-eabi-objcopy --input-target binary --output-target elf32-big uartx01.bin uartx01.elf3
,
команды идут сразу после заголовка elf-файла. Видимо, в консерватории надо что-то поменять? Хотя странно, почему же оно работает?

Re: QEMU-2

Добавлено: 03.11.21 23:55
БудДен
Нашёл скрипт, к-рый якобы ставит адрес куда надо.

Код: Выделить всё

#!/bin/sh
# Convert a raw binary image into an ELF file suitable for loading into a disassembler
#
# Usage: bin2elf input_binary_file output_elf_file base_address

set -xe
cat > raw$$.ld <<EOF
SECTIONS
{
EOF

echo " . = $3;" >> raw$$.ld

cat >> raw$$.ld <<EOF
  .text : { *(.text) }
}
EOF

CROSS_PREFIX=arm-none-eabi-

${CROSS_PREFIX}ld -b binary -r -o raw$$.elf $1
${CROSS_PREFIX}objcopy  --rename-section .data=.text \
                        --set-section-flags .data=alloc,code,load raw$$.elf
${CROSS_PREFIX}ld raw$$.elf -T raw$$.ld -o $2
${CROSS_PREFIX}strip -s $2

rm -rf raw$$.elf raw$$.ld

Re: QEMU-2

Добавлено: 04.11.21 01:24
БудДен

Код: Выделить всё

/y/bin2elf.sh /y/vb_share/jaos/coop-rpi-works-again/kernel7.img /y/vb_share/jaos/coop-rpi-works-again/kernel7.elf3 0x8000 && /y/qemu0/arm-softmmu/qemu-system-arm -M raspi2 -dtb /y/vb_share/2015-02-16-raspbian-wheezy/bcm2709-rpi-2-b.dtb -serial mon:stdio -kernel /y/vb_share/jaos/coop-rpi-works-again/kernel7.elf3

Re: QEMU-2

Добавлено: 04.11.21 12:40
БудДен
Просмотр стека - x/8 $sp

Re: QEMU-2

Добавлено: 04.11.21 13:29
БудДен
Обнаружилось отсутствие ATAGS. Здесь у mrvn написано:
At boot the Raspberry Pi firmware follows the old Linux boot protocol for ARM systems called ATAG. Optionally the boot-loader can use the newer device tree but that is not the default so lets ignore that for now.
А раньше уже выяснилось, что QEMU считает, что если ему дали бинарный файл - то это линукс, а если elf - то нет. Мы раньше давали elf и ATAG-ов не было (не знаю уж, почему). Пробуем дать снова бинарный образ и обнаруживаем, что он грузится по адресу 0x10000, а не 0x8000. Видимо, самое простое здесь - это поправить QEMU, хотя сначала надо почитать вот это:

https://forums.raspberrypi.com/viewtopic.php?t=195565

Re: QEMU-2

Добавлено: 04.11.21 13:56
БудДен
Поправил QEMU, теперь нужно брать исходники QEMU отсюда:

https://github.com/budden/qemu/commit/4 ... dc15c84840

Строчка для запуска теперь выглядит так:

Код: Выделить всё

/y/qemu0/arm-softmmu/qemu-system-arm -M raspi2 -serial mon:stdio -kernel /y/vb_share/jaos/coop-rpi-works-again/kernel7.img 
Из неё ушёл параметр -dtb , и тогда QEMU создала ATAGS, A2 их подцепила и сумела инициализировать память. Однако дальше дело пока ничего не печатается - что-то где-то дальше идёт не так.

Re: QEMU-2

Добавлено: 04.11.21 15:37
БудДен
А также нужно добавить -smp 4

Re: QEMU-2

Добавлено: 27.03.22 15:41
БудДен
Данная сказка закончилась в итоге хорошо, см. https://tvoygit.ru/budden/ja-o-s/src/br ... erry-pi.md