Настройка таблицы векторов прерываний, ARMv6 - PullRequest
2 голосов
/ 20 января 2012

Я пытаюсь использовать usermode и SVC в моем приложении ARMv6, но для этого мне нужно настроить запись SVC таблицы векторов прерываний ARMv6 для перехода к моему обработчику прерываний. Но я не могу найти хороший пример того, как это сделать (то есть: какой именно адрес памяти мне нужно установить и для чего). В прошлом я делал подобные вещи, но всегда с более полным загрузчиком (RedBoot), который настраивал некоторые из них для меня. Любая помощь будет оценена.

Я тестирую свое приложение, используя:

 qemu-system-arm -M versatilepb -cpu arm1176

1 Ответ

3 голосов
/ 20 января 2012

Вы говорите о прерывании 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 и остановить симуляцию.

...