重新定位ARM异常向量?

重新定位ARM异常向量?,arm,interrupt-handling,armv6,Arm,Interrupt Handling,Armv6,如何重新定位ARM异常向量 基本上,我需要能够以某种方式重新映射它们,因此当ARM内核尝试执行向量时,它应该执行存储在内核RAM位中的自定义异常向量,而不是存储在0x0处的ROM。可能吗?或者我是要将中断从ROM路由到内核 那么本质上,有没有一种方法可以告诉ARM内核,“这是向量表的新地址”我知道可以在高向量模式下启动CPU,但这不是我想要的。我需要能够动态地将向量基设置为自定义地址 这在很大程度上取决于您使用的核心 Cortex-M3芯片可以使用系统控制块中的向量表偏移寄存器(VTOR)更改基

如何重新定位ARM异常向量

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


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

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

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

在“传统”芯片(ARM7/9,Cortex-A/R)中,我认为没有一种芯片允许您指定任意基,尽管大多数芯片可以在00000000和FFFF0000之间切换,少数芯片允许使用“RAM起始”地址


但是,如果芯片有MMU,通常可以将RAM页映射到FFFF0000,并将处理程序复制到FFFF0000。我相信Linux就是这么做的。

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

MCR p15,0,c12,c0,0


请参阅ARM体系结构参考手册中的B4.1.156。系统寄存器VBAR指定向量表的基址。VBAR可以从PL1或更高版本更改。与大多数系统寄存器一样,在实现安全扩展(TrustZone)时,VBAR也会被存入银行

对于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
MRC p15,0,c12,c0,0;读取安全或非安全矢量基址寄存器
MCR p15,0,c12,c0,0;写入安全或非安全矢量基址寄存器
对于armv7(Cortex-A7、-A8等),在移动异常表的架构参考手册中搜索VBAR、MVBAR和HVBAR。