ARM体系的CPU有以下7种工作模式
- 用户模式(usr):ARM处理器正常的程序执行状态
- 快速中断模式(fiq):用于高速数据传输或通道处理
- 中断模式(irq):用于通用的中断处理
- 管理模式(svc):操作系统使用的保护模式
- 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及储存保护
- 系统模式(sys):运行具有特权的操作系统任务
- 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
快速中断模式有7个备份寄存器R8~R14
异常发生(CPU自动完成)
- 在异常工作模式的连接寄存器R14中保存前一个工作模式的下一条,即将执行的指令的地址。对于ARM状态,这个值是当前PC值加4或加8
- 将CPSR的值复制到异常模式的SPSR
- 将CPSR的工作模式位设为这个异常对应的工作模式
- 令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行向量表中的响应指令
异常退出(CPU自动完成)
- 前面进入异常工作模式时,连接寄存器中保存了前一工作模式的一个指令地址,将它减去一个适当的值后赋给PC寄存器
- 将SPSR的值复制回CPSR
异常模式 | 退出异常模式时PC的计算方法 | 进入异常模式时R14中保存的值 |
---|---|---|
管理模式(通过SWI指令进入) | movs pc, r14 | PC + 4 (1) |
未定义指令终止模式 | movs pc, r14 | PC + 4 (1) |
快速中断模式 | subs pc, r14, #4 | PC + 4 (2) |
中断模式 | subs pc, r14, #4 | PC + 4 (2) |
数据访问终止模式 | 异常原因:指令预取终止 subs pc, #4 异常原因:数据访问终止 subs pc, r14, #8 | PC + 8 (3) |
1. PC值是这些指令的地址:SWI、未定义的指令、在预取指时就失败的指令
2. PC值是这些指令的地址:进入快速中断模式、中断模式前,被打断而未执行的指令
3. PC值是这些指令的地址:导致数据访问终止的加载/存储指令
中断控制器
- 查询方式:程序循环地查询各设备的状态并作出相应反应
- 中断方式:当某时间发生时,硬件会设置某个寄存器
中断处理流程
- 中断控制器汇集各类外设发出的中断信号,然后告诉CPU
- CPU保存当前程序的运行环境(各个寄存器等),调用中断服务程序(ISR,Interrupt Service Routine)来处理这些中断
- 在ISR中通过读取中断控制器、外设的相关寄存器来识别这是哪个中断,并进行相应的处理
- 清除中断,通过读写中断控制器和外设的相关寄存器来实现
- 最后恢复被中断程序的运行环境(即上面保存的各个寄存器等),继续执行