重定位ARM异常向量?

时间:2012-01-23 09:55:40

标签: arm interrupt-handling armv6

我如何重新定位 ARM异常载体

基本上,我需要能够以某种方式重新映射它们,所以当ARM内核尝试执行向量时,它应该执行存储在内核RAM位而不是 ROM中的自定义异常向量0x0。那可能吗?或者我是打算从 ROM 将中断路由到内核?

基本上,有没有办法告诉ARM内核,“这里是向量表的新地址”?我知道你可以启动CPU在高矢量模式下,但这不是我想要的。我需要能够动态地将矢量基数设置为自定义地址。

4 个答案:

答案 0 :(得分:5)

这在很大程度上取决于您正在使用的核心。

Cortex-M3芯片可以使用系统控制模块中的向量表偏移寄存器(VTOR)更改基址。某些实现可能会限制可能的地址。

在“传统”芯片(ARM7 / 9,Cortex-A / R)中,我认为没有一个允许你指定一个任意的基数,虽然它们中的大多数可以在00000000和FFFF0000之间切换,有些允许使用“开始RAM”地址。

但是,如果芯片有MMU,您通常可以在FFFF0000处映射RAM页面并在那里复制处理程序。我相信这就是Linux所做的。

答案 1 :(得分:1)

此外,如果您的处理器具有安全扩展,您可以使用VBAR(矢量基地址寄存器)

MCR p15, 0, <Rt>, c12, c0, 0

请参阅“ARM体系结构参考手册”中的B4.1.156。

答案 2 :(得分:1)

对于cortex-A9处理器,可以通过使用Cp15协处理器寄存器中的VBAR寄存器来完成。向量基址寄存器的目的是保存Monitor异常向量的基址。

 MRC p15, 0, <Rd>, c12, c0, 0    ; Read Secure or Non-secure Vector Base Address Register
 MCR p15, 0, <Rd>, c12, c0, 0    ; Write Secure or Non-secure Vector Base Address Register

答案 3 :(得分:0)

系统寄存器VBAR指定向量表的基址。 VBAR可以从PL1或更高版本更改。与大多数系统寄存器一样,VBAR也在实现安全扩展(TrustZone)时进行存储。