本文所有资料来至互联网,笔者加以整理和归纳,仅供以后复习
处理器模式 |
处理器模式描述 |
用户模式(User,usr) |
正常程序执行的模式 |
快速中断模式(FIQ,fiq) |
用于高速数据传输和通道处理 |
普通中断模式(IRQ,irq) |
用于通常的中断处理 |
监管模式(Supervisor,svc) |
供操作系统使用的一种保护模式 |
数据访问中止模式(Abort,abt) |
用于虚拟存储及存储保护 |
未定义指令中止模式(Undefined,und) |
用于支持通过软件方针硬件的协处理器 |
系统模式(System,sys) |
用于运行特权级的操作系统任务 |
除了用户模式之外的其他6种处理器模式称为特权模式(PrivilegedModes)。在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。其中,除系统模式外,其他5种特权模式又称为异常模式。
处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下,这时,应用程序不能够访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式的切换。当需要进行处理器模式的切换时,应用程序可以产生异常处理,在异常处理过程中进行模式的切换。这种体系结构可以使操作系统控制整个系统的资源。
当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式中都有一组寄存器,供相应的异常处理程序使用,这样就可以保证在进入异常模式时,用户模式下的寄存器(保证了程序运行状态)不被破坏。
系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器。但是系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式的切换。它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式下的寄存器组,而不是使用异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。
ARM共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器. 都是32位寄存器,但目前状态寄存器只使用了其中12位
任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。
a、寄存器R14又被称为连接寄存器(Link Register,LR),在ARM体系中具有下面两种殊的作用:
i. 每一种处理器模式自己的物理R14中存放当前子程序的返回地址。当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。
ii. 当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与子程序返回方式基本相同。
b、每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。
c、程序计数器R15又被记作PC。由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。由于ARM指令是字对齐的,PC值的第0位和第1位总为0。
CPSR(CurrentProgram StatusRegister,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。
每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program StatusRegister,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。由于用户模式和系统模式不属于异常模式,它们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。
N:当两个补码表示的有符号整数运算时,N=1表示运算的结果为负数;N=0表示运算结果为正数或零;
Z:Z=1表示运算结果为零;Z=0表示运算的结果不为零;
C:在加法指令中,当结果产生了进位,则C=1;其他情况下C=0;
在减法指令中,当运算中发生借位,则C=0;其他情况下C=0;
V:对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
CPSR的低8位称为控制位,当异常中断发生时这些位发生改变。在特权模式下,软件可以修改这些控制位:
I:普通中断禁止位;I=1时禁止IRQ中断。
F:快速中断禁止位;F=1时禁止FIQ中断。
T:对于ARMv4以及更高的版本的T系列的ARM处理器
T=0表示执行ARM指令
T=1表示执行Thumb指令
对于ARMv5以及更高版本的非T系列的ARM处理器
T= 0表示执行ARM指令
T=1表示强制下一条执行的指令产生为定义指令中断
ARM的地址空间也可以看作是230个32位的字单元(4字节)。这些字单元的地址可以被4整除,也就是说该地址的低两位为0b00。地址为A的字数包括地址A、A+1、A+2、A+3这4个字节单元的内容。但是在字单元中,4个字节哪一个是高位字节,哪一个是低位字节,则有两种不同的格式:big-endian格式和little-endian格式。
ARM指令系统属于RISC指令系统。标准的ARM指令每条都是32位,有些ARM核还可以执行16位的Thumb指令集。一般地,ARM指令具有以下特点[9]:
a、指令的条件执行
ARM指令都是条件执行,条件标志位位于程序代码字节的cond位(位28-31,下文会介绍)。根据cond的不同编码,可以选择根据条件码标志决定指令的执行。
b、 灵活的第二操作数
ARM指令的另一个重要的特点是数据处理类指令有灵活的第二操作数operand2(位与程序代码的位0-11)。它既可以是立即数,也可以是逻辑运算数,使得ARM指令可以在读取数值的同时进行算术和移位操作。
c、协处理器的作用
ARM内核可提供协处理接口,通过扩展协处理器完成更加复杂的功能。因此ARM
指令中还包括了多条协处理器指令,使用多达16个协处理器,允许将其他处理器通过协处理器接口进行紧耦合;ARM还包括几种内存管理单元的变种,包括简单的内存保护到复杂的页面层次。
d、Thumb指令
ARM在有的版本支持16位Thumb指令。Thumb指令集的整体执行速度比ARM
32位指令集快,而且提高了代码密度。
e、具有RISC指令的特点
由于ARM指令属于RISC指令,所以多具有RISC指令的特点,指令少,且等长,便于充分利用流水线技术,使用多寄存器,且为简单的Load和Store指令。
ARM指令按功能大致可以分为跳转指令、数据处理指令、乘法类指令、数据传送指令、协处理器类指令以及杂项指令(包括状态寄存器传送指令、乘法类指令、软件中断指令和断点指令)。 ARM指令包括60多个指令,并且支持多种寻址方式:寄存器寻址、立即数寻址、寄存器间接寻址、寄存器变址寻址、多寄存器寻址、堆栈寻址、块拷贝寻址以及相对寻址等。对于具体的指令集,可以参考相关文档。
ARM体系中中断向量表中指定了各异常中断及处理程序的对应关系。它可以放在存储地址的低端,也可以放在存储地址的高端。异常中断向量表的大小位32字节,其中每个异常中断占据4个字节大小,保留了4个字节空间。
每个异常中断对应的中断向量表中的4个字节的空间中放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。通过这两种指令,程序将跳转到相应的异常中断处理程序处执行。
下表为中断向量表 :
中断向量偏移地址 异常中断类型 异常中断模式 优先级(6最低) |
0x00 复位 监管模式 1 0x04 未定义的指令 未定义指令中止模式 6 0x08 软件中断 监管模式 6 0x0c 指令预取中止 中止模式 5 0x10 数据访问中止 中止模式 2 0x14 保留 未使用 未使用 0x18 普通中断请求 外部中断模式 4 0x1c 快速中断请求 快速中断模式 3 |
参考资料来源:图片http://www.cnblogs.com/armlinux/archive/2011/03/23/2396833.html
文档:Bootloard的研究与实现.doc