ARM的编程模式和7种工作模式
ARM采用32/64位架构
- Byte:8-bits(1B)
- HalfWord:16-bits(2B)
- Word:32-bit(4B)
- ARM指令集:32-bit
- Thumb:16-bit
- Thumb2:16-bit&32-bit
ARM 7种工作模式
操作系统有安全级别要求,CPU多种工作模式是为了方便操作系统的多种角色安全等级需要.
1个非特权模式(normal)
1.User:大部分程序运行在用户模式
6个特权模式(Privilege)
1个系统模式(sys)
2. System:和用户模式相同的寄存器集的特权模
5个异常模式
3. SVC(Supervisor):复位或软中断时进入
4. FIQ(fast interrupt):高优先级中断产生时进入
5. IRQ:低优先级中断产生时进入
6. Abort:存取(读写内存)异常时进入
7. Undef:执行了未定义指令时进入
ARM的37个通用寄存器:SFR通过地址操作,通用寄存器通过名字操作.
模式 USER FIQ IRQ SVC Undef abort r0 * * * * * * r1 * * * * * * r2 * * * * * * r3 * * * * * * r4 * * * * * * r5 * * * * * * r6 * * * * * * r7 * * * * * * r8 * R8 * * * * r9 * R9 * * * * r10 * R10 * * * * r11 * R11 * * * * r12 * R12 * * * * r13(sp) R13(SP) R13(SP) R13(SP) R13(SP) R13(SP) R13(SP) r14(lr) R14(LR) R14(LR) R14(LR) R14(LR) R14(LR) R14(LR) r15(pc) * * * * * * cpsr * * * * * * spsr X SPSR SPSR SPSR SPSR SPSR 注:(X 表示该模式下没有该寄存器,* 表示各模式下都是同一个寄存器,SYS模式和USER模式一样的寄存器)
每种模式下只能看到18个寄存器,R13-R14:影子寄存器(banked register)
- sp: 栈指针.
- lr: 模式切换时存放返回地址.
- pc: 程序计数器,当前程序执行到哪里.
- cpsr: 程序状态寄存器,记录当前CPU的运行状态.
- spsr: 模式切换时保存上个CPSR,以便返回后恢复原来状态
ARM异常处理方式:
什么是异常?
异常:正常工作状态之外的流程都叫异常,中断是异常中的一种.
- user/sys:模式属于正常态.
- fiq/irq/svc:可以预知的异常(中断).
- abort/undef:不可预知的异常(真正的异常).
异常向量表: CPU设计时就设定好了的,硬件决定的,硬件向软件提供了处理异常的支持.当异常发生时,CPU自动动作(pc跳转到异常向量处处理异常)
arm的异常处理机制:
异常发生时:
1. 拷贝CPSR到SPSR_<mode> //user态时的CPSR保存到对应态mode下的SPSR
2. 设置适当的CPSR位 //CPU自动设置CPSR到mode态的CPSR值
2. 1. 改变处理状态进入ARM态 //设置CPSR T位为0 (0 ARM态,1 thumb态)
2. 2. 改变处理器模式进入相应的异常模式 //设置CPSR mode位为对应模式
2. 3. 设置中断禁止位禁止相应中断(系统自动) //设置CPSR IF位到对应(I 禁止IRQ F 禁止FIQ )
3. 保存返回地址到lr_<mode> //保存当前态的返回地址到lr中
4. 设置PC为相应的异常向量地址 //跳转到异常处理地址处理异常
异常处理后返回时:
1. 从SPSR_<mode>恢复CPSR //从异常态的SPSR中恢复到之前的状态中
2. 从lr_<mode>恢复PC //从异常态的lr中恢复到之前的PC值(中断之前执行的地方)