我如何重新定位 ARM异常载体?
基本上,我需要能够以某种方式重新映射它们,所以当ARM内核尝试执行向量时,它应该执行存储在内核RAM位而不是 ROM中的自定义异常向量即0x0
。那可能吗?或者我是打算从 ROM 将中断路由到内核?
基本上,有没有办法告诉ARM内核,“这里是向量表的新地址”?我知道你可以启动CPU在高矢量模式下,但这不是我想要的。我需要能够动态地将矢量基数设置为自定义地址。
答案 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)时进行存储。