ARM微处理器支持如下数据类型:类型
| 长度
| 说明
| 字节(Byte)
| 8位
| 有符号和无符号字节数据
| 半字(HalfWord)
| 16位
| 有符号和无符号的半字数据
| 字(Word)
| 32位
| 有符号和无符号的字数据
|
需要指出的是:字节类型数据是最小的数据存储单位,其可以存储子存储器的任何位置;半字类型数据存储边界必须是两个字节对齐的;字类型数据的存储边界必须是4个字节对齐的。如图3.1所示。
图3.1
字、半字、字节存储格式
另外,采用RISC设计思想的ARM微处理器提供了32位的ARM指令集和16位的Thumb指令集,带有J变种的ARM微处理器还支持执行8位Java字节码的指令集(Jazelle)。ARM指令在存储器中必须按4字节对齐;Thumb指令必须按2字节对齐;Java字节码指令按字节对齐。
当执行ARM指令时ARM微处理器处于ARM状态,当执行Thumb指令时ARM微处理器处于Thumb状态,执行8位的java指令码时微处理器处于Jazelle状态。
3.1 ARM 微处理器的工作模式ARM微处理器有7种工作模式:如表3.1所示。
表3.1 ARM微处理器支持的工作模式
处理器工作模式
| 特权模式
| 异常模式
| 描述
| 用户模式(User)
| 否
| 否
| 普通程序执行模式,大部分任务执行在这种模式下。
| 系统模式(System)
| 是
| 否
| 使用和User模式相同寄存器集的特权模式。
| 快速中断模式(FIQ)
| 是
| 是
| 当一个高优先级(fast)中断产生时将会进入这种模式。
| 外部中断模式(IRQ)
| 是
| 是
| 当一个低优先级(normal)中断产生时将会进入这种模式。
| 管理模式(Supervisor)
| 是
| 是
| 当复位或软中断指令执行时进入这种模式。
| 数据访问中止模式(Abort)
| 是
| 是
| 当存取异常时将会进入这种模式,用于虚拟存储或存储保护。
| 未定义指令模式(Undef)
| 是
| 是
| 当执行未定义指令时进入这种模式,有时用于通过软件仿真协处理器硬件的工作方式。
|
如上表所示,除了用户模式和系统模式以外的其它5种模式又称之为异常模式当特定的异常发生时,微处理器就会进入到相应的异常模式中。除了用户模式以外的其它6种处理器模式称为特权模式,在特权模式下程序可以访问所有的系统资源。非特权模式和特权模式之间的区别在于有些操作只能在特权模式下才被允许,如直接改变模式和中断使能等。ARM核中有一个专门的输出信号来表明当前模式是特权模式还是非特权模式。ARM core有一个输出信号(nTRANS on ARM7TDMI, InTRANS, DnTRANS on ARM9, 或被编码成HPROT或BPROT in AMBA)来表明当前模式是特权模式和非特权模式,外设可以使用这些信号。例如,存储器控制器使用这些信号来控制IO操作,使其只能在特权模式下完成等。
处理器模式可以通过软件进行切换,也可以通过外部中断或异常处理过程进行切换。
大多数的用户程序运行在用户模式下。当处理器工作在用户模式时,应用程序不能够访问受操作系统保护的一些系统资源,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式切换。这种体系结构可以使操作系统控制整个系统资源的使用。
当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式中都有一组专用寄存器供相应的异常处理程序使用,这样就可以保证在进入异常模式时用户模式下的寄存器(保存程序运行状态)不被破坏。
在ARM体系结构v4及以上版本中开始有系统模式,没有任何异常能进入到系统模式。系统模式实际上相当于用户模式的特权模式。它和用户模式使用完全相同的寄存器,但是系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换,它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式的寄存器组而不是异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。在后面的异常处理程序一节中我们会看到,可重入异常的处理程序可以通过切换到系统模式来避免重入异常发生时某些寄存器无法保存带来的问题。
3.2.1
寄存器概述ARM微处理器有37个32位长的寄存器,其中包括30个通用寄存器,6个状态寄存器和一个程序计数器寄存器(PC)。如图3.2所示,ARM微处理器中将这37个寄存器分成不同的组,在ARM微处理器的每种工作模式下只能使用其中一组寄存器。我们知道,ARM微处理器共有7种模式,其中用户模式和系统模式拥有物理空间上完全相同的寄存器,而其它5种异常模式都有一些自己独立的寄存器。从图上可以看出,在用户和系统模式下可以使用R0-R15和CPSR共17个寄存器;在FIQ模式下可以使用R0-R15,CPSR,CPSR共18个寄存器,其中R8-R14以及SPSR寄存器是FIQ模式专有寄存器,其它寄存器和用户模式共用相同的物理寄存器;在IRQ、SVC、Undef、Abort模式下可以使用的寄存器都是18个(R0-R15,CPSR,SPSR),其中R13,R14,CPSR是各个模式专有的,其它和用户模式共用相同的物理寄存器。可见,ARM内核中一共有37个物理上独立的寄存器,在每一种处理器模式中只能访问一组相应的寄存器。在每组寄存器中:R13通常用作栈指针寄存器(SP),每一种模式有自己的R13,所以允许每一种异常都有自己的栈指针。R14用作连接或返回地址寄存器(LR),每一种模式有自己的 R14。R15用作程序计数器(PC),用来保存读取指令的地址。CPSR (Current Program Status Register) 存储ARM微处理器当前的状态和模式标志。SPSR (Saved Program Status Register)异常模式下的CPSR的备份寄存器,当一个异常发生时保存当前的CPSR值。结合连接寄存器可使处理器返回先前的状态。
ARM微处理器这样组织寄存器的好处在于当各种异常发生的时候,每种异常模式都可以保存一些重要的数据,使异常处理程序完成之后返回异常前的程序时不会破坏原有的寄存器或状态。 |