Вы говорите о прерывании SWI?Или один из других (FIQ, IRQ).В любом случае я думаю, что знаю, в чем проблема.Qemu для запуска linux, ваш двоичный файл не загружен по адресу 0x00000, поэтому ваши точки входа не используются qemu для обработки исключений.
У меня есть пример, который использует qemu и реализует решение.Перейдите в каталог qemu с именем http://github.com/dwelch67/yagbat.. Пример qemu не имеет отношения к gba в репозитории yagbat, gba - это 32-битная ARM-вещь, поэтому было легко заимствовать код, поэтому я вставил его туда.
Пример был специально написан для вашего вопроса, когда я пытался выяснить, как использовать qemu таким образом.Похоже, что адресное пространство 0x00000000 моделируется как оперативная память, поэтому вы можете переписать таблицу исключений qemu и получить код вызова исключений в адресном пространстве 0x10000, который загружает ваш двоичный файл.
Быстрое и грязное решениечтобы точка входа двоичного файла (которую qemu загружает в 0x10000) напоминала таблицу векторов по адресу 0x00000.Инструкция ldr pc относится к счетчику программ, разборка может показать, что он загружает адрес по адресу 0x10000, но на самом деле он относится к компьютеру, и дизассемблер использовал компьютер, предполагая, что используется связанный адрес.
.globl _start
_start:
ldr pc,start_vector_add
ldr pc,undef_vector_add
ldr pc,swi_vector_add
start_vector_add: .word start_vector
undef_vector_add: .word undef_vector
swi_vector_add: .word swi_vector
Затем, прежде чем вы захотите вызвать какие-либо прерывания, в примере я использую инструкцию swi, чтобы вызвать прерывание swi.Вы копируете достаточно кода с 0x10000 на 0x00000, чтобы включить таблицу исключений и список адресов, которые он загружает в компьютер.связывая вашу программу с 0x10000, эти адреса находятся в диапазоне 0x10000.Когда происходит прерывание, обработчик исключений, который вы сейчас изменили, загрузит в ПК адрес на основе 0x10000, и ваш обработчик в диапазоне 0x10000 будет вызван.
Использование этой командной строки для запуска двоичного файла в моем примере
qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin
, а затем ctrl-alt-3 (не F3, а 3) переключится на последовательную консоль, и вы увидите вывод, закроете это окно, чтобы выйти из qemu и остановить симуляцию.