ARM的编程模式和7种模式
ARM的基本设定
采用32位架构,并提供了多种指令集。
ARM架构的基本约定如下:
- Byte(字节):8位(bits)
- Halfword(半字):16位(2字节)
- Word(字):32位(4字节)
在ARM架构中,数据以字节为基本单位进行存储和处理,而不同大小的数据可以用不同数量的字节表示。例如,一个字节可以存储8个二进制位的数据,一个半字可以存储16个二进制位的数据,而一个字可以存储32个二进制位的数据。
大部分ARM核心提供以下指令集:
ARM指令集(32位):这是最基本和最常用的指令集,用于处理32位数据和指令。它提供了丰富的指令和功能,适用于各种应用场景。
Thumb指令集(16位):为了提高代码密度和节省存储空间,ARM引入了Thumb指令集。这个16位的指令集可以与ARM指令集混合使用,适用于对存储空间和功耗要求较高的应用。
Thumb2指令集(16位和32位):为了更好地平衡代码密度和性能,ARM推出了Thumb2指令集。这个指令集可以同时支持16位和32位的指令,根据需求选择最适合的指令长度。它在代码密度和性能之间提供了更好的平衡。
Jazelle cores 支持 Java bytecode
一些ARM核心支持Jazelle技术,这意味着它们能够直接执行Java字节码,而无需先将其转换为机器码。这样的核心被称为Jazelle核心。Jazelle技术可以提高在ARM处理器上运行Java应用程序的性能和效率。它通过将Java字节码解释为原生指令来实现,在某些情况下可以达到与原生指令相当的执行速度。这一特性使得ARM处理器成为一种适合于低功耗、嵌入式Java应用的选择。
ARM处理器工作模式
- ARM 有7个基本工作模式:
- User Mode(用户模式) : 非特权模式,大部分任务执行在这种模式
- FIQ Mode (快速中断模式): 当一个高优先级(fast) 中断产生时将会进入这种模式
- IRQ Mode(普通中断模式) : 当一个低优先级(normal) 中断产生时将会进入这种模式
- Supervisor Mode(监管模式) :当复位或软中断指令执行时将会进入这种模式
- Abort Mode (异常模式): 当存取异常时将会进入这种模式
- Undefined Mode(未定义模式) : 当执行未定义指令时会进入这种模式
- System Mode(系统模式) : 使用和User模式相同寄存器集的特权模式
注意:
- 除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)。
- Privilege中除Sys模式外,其余5种为异常模式。
- 各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。
各种模式下权限和可以访问的寄存器不同
CPU为什么设计这些模式?
- CPU是硬件,OS是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。
- 操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。
- 此外,多工作模式的设计还能提高系统的效率。不同模式下,CPU可以采用不同的处理方式和优化策略,以适应不同类型的任务和场景。
ARM的37个寄存器详解
ARM 寄存器
- ARM 总共有 37 个寄存器,但是每种模式下最多只能看到 18 个寄存器,其他寄存器虽然名字相同,但是在当前模式不可见。
- 普通用户和系统用户模式可见的寄存器是完全一样的,寄存器的权限可能会不一样。例如,在系统模式下,可以访问特权寄存器和某些特殊用途寄存器,而在普通模式下可能无法直接访问这些寄存器。
- 当进行模式切换时,对应的备用寄存器会替换相对应的寄存器。虽然替换的寄存器名称一样,但是寄存器的地址是不一样的。
- 对 r13 这个名字来说,在 ARM 中共有 6 个名叫 r13(又叫 sp)的寄存器,但是在每种特定处理器模式下,只有一个 r13 是当前可见的,其他的 r13 必须切换到它们的对应模式下才能看到。这种设计叫影子寄存器(banked register)。
ARM架构中共有37个寄存器,每个寄存器的长度为32位。这些寄存器可以分为以下几类:
通用寄存器:共有30个通用寄存器,用于存储数据和执行计算操作。这些寄存器被编号为R0到R14。其中,R13寄存器被称为堆栈指针寄存器(Stack Pointer,SP),用于存储当前堆栈的地址;R14寄存器被称为链接寄存器(Link Register,LR),用于存储函数调用的返回地址。
程序计数器(Program Counter,PC):这是一个特殊的寄存器,用于存储即将执行的指令的地址。
程序状态寄存器(Current Program Status Register,CPSR):也是一个特殊的寄存器,用于存储当前的程序状态信息,如条件码、中断屏蔽标志等。
异常模式下的保存状态寄存器(Saved Program Status Register,SPSR):每种异常模式(如中断模式、中止模式等)都有一个对应的SPSR寄存器,用于保存在进入异常处理程序之前的CPSR的值。
CPSR程序状态寄存器
- CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和CPSR中的Z标志位有关)
- CPSR中的I、F位和开中断、关中断有关
- CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置。
PC(r15)程序控制寄存器
•PC(Program control register)为程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)
•整个CPU中只有一个PC(CPSR也只有一个,但SPSR有5个)。
ARM的异常处理方式简单介绍
什么是异常
•正常工作之外的流程都叫异常
•异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作
•中断是异常的一种
异常向量表
- 所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。
- 当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作)
- 异常向量表是硬件向软件提供的处理异常的支持。
异常向量表是ARM处理器中的一个重要概念,用于存储不同异常的入口地址。当异常发生时,处理器会根据异常类型查找对应的入口地址,并跳转到对应的异常处理程序。
异常向量表是一块特殊的内存区域,其大小通常是固定的,每个异常向量占据一个固定大小的位置。每个异常向量都包含了异常处理程序的入口地址。
ARM的异常处理机制
-
当处理器遇到异常情况时,它会暂停当前正在执行的指令,并跳转到异常处理例程。异常处理例程是一段代码,用来处理特定类型的异常。
-
处理器会保存当前的上下文信息,包括程序计数器(PC)、寄存器和标志位等重要状态信息。这些信息将在异常处理完成后恢复。
-
处理器会根据异常的类型和级别,选择相应的优先级,并进行相应的异常处理。ARM架构定义了三个级别的异常:异常、中断和软件中断。
-
异常处理例程会执行相应的处理代码,对异常进行处理。处理过程可能包括一系列操作,如保存现场、处理中断请求、执行异常处理代码等。
-
在异常处理完成后,处理器会根据异常发生时保存的上下文信息,恢复原来的状态,包括恢复程序计数器、寄存器和标志位等。
-
处理器会从中断处继续执行指令,继续正常的程序执行流程。
ARM的异常处理方式简单介绍
ARM的异常处理方式简单介绍