Не стартует qemu с ARM Versatilepb baseboard
В системе Ubuntu 18.04 установлен ARM Toolchain и qemu-system-arm. Задача - поднять ARM Versatilepb baseboard. Затем зайти в qemu-monitor, посмотреть регистры и тд.
Есть такой скрипт для сборки и запуска:
ARM=arm-none-eabi
QEMU=qemu-system-arm
$ARM-as -o ts.o ts.s
$ARM-ld -T t.ld -o t.elf ts.o
$ARM-nm t.elf
$ARM-objcopy -O binary t.elf t.bin
dd if=t.bin of=flash.bin bs=4096 conv=notrunc
rm *.o *.elf
$QEMU -M realview-pbx-a9 -kernel t.bin -nographic -serial /dev/null
И сопутствующие скрипту файлы:
ts.s
.text
.global start
start:
mov r0, #1 @ r0 = 1
MOV R1, #2 @ r1 = 2
ADD R1, R1, R0 // r1 = r1 + r0
ldr r2, =result /* result = r1 */
str r1, [r2]
stop: b stop
.data
result: .word 0 /* a word location */
t.ld
ENTRY(start)
SECTIONS
{
. = 0x10000;
.text : { ts.o }
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
. = ALIGN(8);
. = . + 0x1000; /* 4kB of stack memory */
stack_top = .;
}
После запуска скрипта ./mk он отрабатывает, но qemu подвисает на этапе запуска t.bin. Не пойму, где затык. Буду рад помощи.
В консоли вижу:
./mk
0001001c t result
00011038 T stack_top
00010000 T start
00010014 t stop
0+1 records in
0+1 records out
50 bytes copied, 0,000467519 s, 107 kB/s
QEMU 4.2.1 monitor - type 'help' for more information
(qemu) pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
Ответы (1 шт):
Я попробовал ваш пример. Сообщения от pulseaudio - это warning, их можно проигнорировать.
QEMU не подвисает, а исправно выполняет ваше приложение. Обратите внимание, что у вас написано в девятой строке:
stop: b stop
Это бесконечный цикл. Инструкция b означает безусловный переход. Сама строка означает бесконечный переход на одну и ту же инструкцию.
QEMU запускается с активным монитором в консоли, то есть можно печатать команды для проверки состояния qemu
$QEMU -M realview-pbx-a9 -kernel t.bin -nographic -serial /dev/null
QEMU 6.2.0 monitor - type 'help' for more information
(qemu) pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
-- нажать Enter --
(qemu) info registers
R00=00000001 R01=00000003 R02=0001001c R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=00010014
-- ... --
Регистр r0 = 1, регистр r1 = 1 + 2, как и написано в вашей программе.