我正尝试在我的ARMv6裸机应用程序中使用用户模式和SVC,但为此,我需要设置ARMv6中断向量表的SVC条目以分支到我的中断处理程序。但是,我找不到一个很好的例子来说明如何做到这一点(即:我到底需要设置什么内存地址,以及设置到什么地址)。我以前也做过类似的事情,但总是使用一个更全面的引导加载程序(RedBoot)来为我设置其中的一些内容。任何帮助都将不胜感激。
我正在使用以下命令测试我的应用程序:
qemu-system-arm -M versatilepb -cpu arm1176发布于 2012-01-20 11:00:19
你是在说SWI中断吗?或其他(FIQ,IRQ)之一。不管是哪种情况,我想我知道问题出在哪里了。Qemu用于运行linux,您的二进制文件不会加载到地址0x00000,因此qemu不会使用您的入口点来处理异常。
我有一个使用qemu并实现解决方案的示例。转到http://github.com/dwelch67/yagbat的qemu目录。qemu示例实际上与yagbat代码库中的gba并不相关,gba是一个32位ARM的东西,所以很容易从那里借用代码,所以我把它放在了那里。
这个示例是专门为您的问题编写的,因为我试图弄清楚如何以这种方式使用qemu。似乎地址0x00000000空间被模拟为ram,因此您可以重写qemu异常表,并让异常调用二进制文件加载的0x10000地址空间中的代码。
一种快速而粗糙的解决方案是使二进制文件( qemu加载到0x10000)的入口点类似于地址0x00000处的一个向量表。ldr pc指令是相对于程序计数器的,反汇编可能会显示它加载的地址是0x10000,但它实际上是相对于pc的,反汇编程序使用的是pc,假设使用的是链接地址。
.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的足够多的代码,以包含例外表和加载到pc中的地址列表。通过将您的程序链接到0x10000,这些地址在0x10000范围内。当中断发生时,您现在修改的异常处理程序会将基于0x10000的地址加载到pc中,并且将调用0x10000范围内的处理程序。
在我的示例中,使用以下命令行运行二进制文件
qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin然后ctrl-alt-3 (不是qemu,而是3)将切换到串行控制台,您可以看到输出,然后关闭该窗口以关闭F3并停止模拟。
https://stackoverflow.com/questions/8936022
复制相似问题