ARM内核工作模式及其切换条件
用户模式(User Mode, usr)
权限最低,运行普通应用程序。只能通过异常被动切换到其他模式。
快速中断模式(FIQ Mode, fiq)
处理高速外设中断,专用寄存器减少上下文保存时间,响应周期约4个时钟周期。触发条件为FIQ中断源激活。
外部中断模式(IRQ Mode, irq)
处理通用外设中断,共享寄存器,响应周期约12个时钟周期。触发条件为IRQ中断且未被FIQ抢占。
管理模式(SVC Mode, svc)
系统初始化和内核关键操作模式。上电默认进入,或通过SWI指令触发。
数据访问终止模式(Abort Mode, abt)
处理非法内存访问异常。触发条件为数据指令访问无效地址。
未定义指令模式(Undefined Mode, und)
执行未定义指令时自动切换。
系统模式(System Mode, sys)
特权级系统任务,与用户模式共享寄存器但权限更高。需手动修改CPSR切换。
ARMv7-A/ARMv8-A新增模式
- 监控模式(Monitor Mode, mon):用于TrustZone安全扩展。
- Hyp模式:支持虚拟化扩展。
模式切换机制
- 异常触发时,硬件自动修改CPSR的M[4:0]位。
- 保存PC到对应LR寄存器,CPSR到SPSR。
- 跳转至异常处理程序,完成后恢复现场。
异常向量表详解
布局(ARMv7-A)
偏移地址 | 异常类型 | 描述 |
---|---|---|
0x00 | Reset | 上电或复位 |
0x04 | Undefined Instruction | 未定义指令异常 |
0x08 | SWI (SVC) | 软件中断(系统调用) |
0x0C | Prefetch Abort | 取指异常 |
0x10 | Data Abort | 数据访问异常 |
0x18 | IRQ | 普通中断 |
0x1C | FIQ | 快速中断 |
作用
- 提供固定入口点,减少响应延迟。
- 自动保存PC和CPSR,提升权限至特权模式。
响应流程
- 切换到对应异常模式。
- 保存返回地址到LR,CPSR到SPSR。
- 跳转至向量表入口执行处理程序。
立即数合法性判断
编码规则
- 12位字段:低8位为基值(
immed_8
),高4位为循环右移位数(rotate_imm4
)。 - 生成公式:
immediate = immed_8 ROR (2 × rotate_imm4)
快速判断方法
- 统计二进制中1的个数,若>8则非法。
- 通过循环左移使高位为0,检查剩余有效位数≤8即为合法。
示例
- 合法:
0x234
(0010_0011_0100
→ 处理后8位) - 非法:
0x4FF
(1的个数为9)
设计原因
- 指令长度限制(32位中占12位)。
- 桶形移位器高效实现循环移位。
B、BL、BX指令对比
指令 | 保存返回地址 | 状态切换 | 跳转范围 | 用途 |
---|---|---|---|---|
B | 否 | 否 | ±32MB | 短跳转、循环 |
BL | 是(到LR) | 否 | ±32MB | 函数调用 |
BX | 否 | 是 | 寄存器指定地址 | ARM/Thumb状态切换 |
关键点
BL
用于子程序调用,自动保存PC+4
到LR
。BX
根据目标地址最低位切换指令集(0=ARM,1=Thumb)。
ARM栈类型与操作
栈特性
- 类型:满降栈(Full Descending, FD)。
- 增长方向:向低地址扩展。
栈帧结构
FP
(R11)指向栈帧起始,SP
(R13)指向栈顶。- 保存内容:局部变量、多余参数、返回地址(LR)。
操作示例
; 函数入口
stmdb sp!, {fp, lr} ; 压栈保存FP和LR
mov fp, sp ; 设置新FP
sub sp, sp, #8 ; 分配局部变量空间; 函数退出
mov sp, fp ; 恢复SP
ldmia sp!, {fp, pc} ; 弹出FP和PC(返回)
多栈类型(ARM64/Linux)
- 用户栈(8MB)、内核栈(16KB)、中断栈(32KB/CPU)。
总结
ARM工作模式、异常向量表、立即数编码、跳转指令和栈管理是底层开发的核心内容。理解这些机制有助于优化代码性能和调试系统异常。实际应用中需结合具体架构手册(如Cortex-M/A系列)进行细节调整。