Не стартует qemu с ARM Versatilepb baseboard

Рейтинг: 0Ответов: 1Опубликовано: 23.05.2023

В системе 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, как и написано в вашей программе.