一、内核的工作模式
Cortex-A9 基于 ARMv7-A 架构,共有8种工作模式:
- 用户模式(usr)
- 快速中断模式(fiq)
- 外部中断模式(irq)
- 特权模式(svc)
- 数据访问终止模式(abt)
- 未定义指令终止模式(und)
- 系统模式(sys)
- 监控模式(mon)
除用户模式以外,其它的7种处理器模式(2~8)称为特权模式(此处是 Privileged Modes 区别于上面的 svc ,svc特权模式是 Supervisor )。在特权模式下,程序可以访问所有系统资源,也可以任意的进行处理器模式切换。其中的2~6 、8(除了系统模式)又称为异常模式。
处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。
大多数用户运行在用户模式下。当处理器工作在用户模式时,应用程序不能访问受操作系统保护的一些系统资源,应用程序也不能直接进行处理器模式转换。所以可以先让应用程序产生异常处理,然后在异常处理过程中进行处理器模式切换。
当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式中都有一组专用寄存器以供相应的异常处理程序使用,这样就可以保证在进入异常模式时用户模式下的寄存器(保持程序运行状态)不被破坏。
二、寄存器
ARM处理器有40个32位长的寄存器
- 33个通用寄存器
- 6个状态寄存器
- 1个PC(Program Counter ,程序计数器)
未分组寄存器
把用户模式和系统模式合并成一组,ARM处理器共有7组相应的寄存器组。每一组R0~R7共用(指的都是同一个物理寄存器,然后在不同组里共用),称为未分组寄存器。也正是由于其通用性,在异常中断所引起的处理器模式切换时,很容易因使用相同物理寄存器而导致寄存器中的数据被破坏。
分组寄存器
剩下的R8~R14是分组寄存器(R15是PC),所访问的物理寄存器取决于其当前的处理器模式。
其中的R8~R12,每个寄存器对应两个不同物理寄存器:快速中断模式(FIQ)、非FIQ模式。相当于非FIQ的共用一个,FIQ独自用一个。因为这种特性,FIQ模式常用于处理一些时间紧急的任务,如DMA处理。
R13
R13寄存器常用做堆栈指针,称为SP(Stack Pointer,栈指向)(一种习惯用法,主要是因为在Thumb指令集中,有一些指令强制性将R13作为堆栈指针)。
每一种异常模式(前文介绍过,指的是模式2~6、8)都有属于自己的R13。异常处理程序负责初始化自己的R13,使其指向该异常模式专用的栈地址。 在异常处理程序入口处,将用到的其它寄存器的值保存在堆栈中,返回时重新将这些值加载到寄存器。通过这种保护程序现场的方法,异常不会破坏被其中断的程序现场。
R14
R14寄存器又称链路寄存器(Link Register,LR),每一种处理器模式都有属于自己的R14,都用自己的R14存放当前子程序返回的地址(R14被设置成子程序的返回地址)。此外,R14也可以被用作通用寄存器使用。
-
MOV PC,LR
BX LR
-
STMFD SP! , {, LR}
LDMFD SP! , {, PC}
注意:对于有些模式R14的值可能与返回地址有一个常数的偏移量(如数据异常,使用SUB PC,LR,#8返回)