ARM指令集
Thumb指令集
其是ARM指令集的一个子集,16位的代码宽度
哈佛架构与冯诺依曼架构
CPU寄存器
通用寄存器:R0-R15
- R0-R3:在函数调用时,用于传递前四个参数;函数调用结束后,R0通常用于存储函数返回值
- R4-R11:通用寄存器,主要用于存储局部变量。触发OS PendSV/SVC 异常时,Cortex-M内核并不会自动压栈弹栈此部分寄存器值,须由用户RTOS程序手动压栈弹栈
- R12:通用寄存器,
- R13(SP):用作堆栈指针,Cortex-M3/4 内核在物理上存在两个堆栈指针
- R14(LR):存储函数返回地址,当函数被调用时,LR保存调用函数的返回地址。函数返回时,R14会将返回地址写入程序计数器,使程序返回到调用函数
- R15(PC):指向下一条要执行指令的地址
特殊寄存器:
- 程序状态字寄存器组(PSRs):
- 中断屏蔽寄存器组(PRIMASK、FAULTMASK、BASEPRI)
- 控制寄存器(CONTROL):
- 浮点寄存器
帧指针(FP):取决于编译器和编译选择,选择一个通用寄存器,在函数调用栈中跟踪堆栈帧的位置
ARM不同内核架构的CPU寄存器组异同
如:Cortex-M系列只有两种运行模式:特权模式和非特权模式,其中通用寄存器组是共用的,但堆栈指针 R13(PSP、MSP)是各模式独有的
如:Cortex-A7 有 9 种运行模式,每一种运行模式都有一组与之对应的寄存器组。
- 每一种模式可见的寄存器包括 15 个通用寄存器(R0~R14)、一两个程序状态寄存器和一个程序计数器 PC
- 在这些寄存器中,有些是所有模式所共用的同一个物理寄存器,有一些是各模式自己所独立拥有的
- Cortex-A系列内核的各模式下的所有CPU寄存器总计:34个通用寄存器、8个状态寄存器、Hyp 模式下独有一个 ELR_Hyp 寄存器
Cortex-M内核
在 Cortex-M 内核中,中断和异常都由 NVIC(Nested Vectored Interrupt Controller)来管理。NVIC 是一个硬件模块,负责处理来自外部或内部的所有中断和异常
中断是指来自外部或内部事件的请求,如定时器超时、外部引脚中断
异常是CPU执行程序发生的错误处理(如:内存访问非法、除零)或者主动软件触发异常,包括PendSV、HardFault等异常
杂项
glue_7、glue_7t 和 eh_frame
glue_7 和 glue_7t 是 ARM 架构中用于将 ARM 代码和 Thumb 代码粘合在一起的代码。
ARM 架构支持两种指令集:ARM 指令集和 Thumb 指令集。ARM 指令集是 32 位指令集,而 Thumb 指令集是 16 位指令集。为了兼容两种指令集,ARM 架构中引入了一种称为 Thumb 嵌入 的机制。
Thumb 嵌入允许 ARM 代码中嵌入 Thumb 指令,反之亦然。当 ARM 代码中嵌入 Thumb 指令时,连接器会生成 glue_7 或 glue_7t section 来将 ARM 代码和 Thumb 代码粘合在一起。
eh_frame 是异常处理框架(Exception Handling Frame)的缩写。异常处理框架是用于支持异常处理的一种结构。当程序发生异常时,异常处理框架会保存程序的运行状态,并将程序转到异常处理程序。
异常处理框架通常包含以下信息:
程序的堆栈指针(SP)
程序的返回地址(LR)
异常发生时的寄存器值eh_frame section 包含了异常处理框架的信息。当程序发生异常时,连接器会将 eh_frame section 加载到内存中,以便异常处理程序可以访问异常处理框架的信息