分类
ARM的工作模式分为普通模式、特权模式,其中特权模式又细分为六种模式。
普通模式 | |
---|---|
用户模式(User) | 大部分任务执行在这种模式 |
特权模式 | |
---|---|
快速中断模式FIQ | 当一个高优先级(fast) 中断产生时将会进入这种模式 |
普通中断模式IRQ | 当一个低优先级(normal) 中断产生时将会进入这种模式 |
超级用户模式(SVC) | 当复位或软中断指令执行时将会进入这种模式 |
中止模式(Abort) | 当存取异常时将会进入这种模式 |
未定义模式(Undef) | 当执行未定义指令时会进入这种模式 |
系统模式(System) | 使用和User模式相同寄存器集的特权模式 |
特权模式中除系统(system)模式之外的其他5种模式又统称为异常模式。
用户模式
用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常,通过内核获取资源。
系统模式
操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
用户模式与系统模式两者使用相同的寄存器,都没有SPSR,但系统模式比用户模式有更高的权限,可以访问所有系统资源。
一般中断模式
一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。
快速中断模式
快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。
管理模式
管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。
系统复位或开机、软中断时进入到SVC模式下。
终止模式:
中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。
未定义模式
未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。
不同模式对应的寄存器
ARM总共有37个寄存器,以User为基准来看,特权模式会复用到非特权模式的部分寄存器(浅灰色),System模式完全复用User模式寄存器,各个特权模式的私有寄存器用彩色表示。
有些寄存器虽然名字相同,但是在当前模式是不可见的。比如在ARM中一共有6个名叫r14的寄存器,但是在特定的处理器模式下,只有一个r13是当前可见的,其他的r13必须切换到对应的模式才能看到。这种设计叫影子寄存器。
寄存器的作用
程序控制寄存器(PC,Program Control Register)
r15,这就是常听说的pc指针,一个处理器核心只有一个,它只想哪里,程序就运行到哪里,
程序状态寄存器(CPSR,Current Program Status Register)
这个寄存器用来记录CPU的当前状态。整个CPU只有一个CPSR寄存器,程序员可以改变该寄存器改变cpu状态,cpu也可以自行改变cpu状态。
程序状态保存寄存器(SPSR,Saved Program Status Register)
r13:这个寄存器用来保存CPSR的,子程序返回时将SPSR赋给CPSR。
连接寄存器(LR,Link Register)
r14:一是用来保存子程序返回地址(子程序返回时返回到哪个地址)。当通过bl或blx指令调用子程序时,硬件会自动将子程序返回地址保存在LR寄存器中。在子程序返回时,把LR的值复制到PC即可实现子程序返回。比如可以使用mov pc,lr完成子程序返回。二是用于记录异常发生时的位置,当异常发生时,LR中保存的值等于异常发生时PC的值减4,因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。
通用寄存器
r0-r12:ARM处理器中的,它们用于存储临时数据、函数参数、返回值等。