如何重新定位 arm异常向量

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

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

有帮助吗?

解决方案

这高度依赖于您使用的核心。

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

“传统”芯片(ARM7 / 9,Cortex-A / R),我认为无允许您指定任意基础,但大多数可以在00000000和FFFF0000之间切换,允许允许使用“开始RAM”地址。 但是,如果芯片有MMU,则通常可以在FFFF0000映射RAM页面并在那里复制您的处理程序。我相信这就是Linux所做的。

其他提示

更新,如果您的处理器具有安全扩展,则可以使用vbar(矢量基地址寄存器)

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

参见ARM架构参考手册中的B4.1.156。

对于Cortex-A9处理器,可以通过在CP15协处理器寄存器中使用VBAR寄存器来完成。矢量基础地址寄存器的目的是保存监视器异常矢量的基地址。

 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
.

系统寄存器vbar指定矢量表的基地址。VBAR可以从PL1或更高版本更改。与大多数系统寄存器一样,vbar也是在实施安全扩展名(TrustZone)时银行的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top