上一篇介绍了关于学习ARM的开发环境以及工程文件编译过程,今天,学习了关于ARM的CPU工作模式以及ARM寄存器部分,现整理一下笔记。
一、ARM指令集与Thumb指令集
ARM指令集的指令是32位的,但为了兼容16位数据总线的应用系统和解决代码密度问题而提出了16位的Thumb指令集。代码密度就是单位存储空间中包含的指令的个数。就例如1k的存储空间能装32条ARM指令,但能装64条Thumb指令。所以,Thumb指令集可以大大节省了系统的存储空间。
但Thumb不是一个完整的体系结构,它不能实现ARM指令的全部功能,它必须要借助于ARM指令集。因此,运行程序时,需要ARM工作状态与Thumb 工作状态之间进行切换。后来,推出了Thumb-2指令集,改善了Thumb的性能,添加了一些32位的Thumb指令用来解决Thumb功能不全的问题。现Thumb-2已经可以实现ARM指令集的所有功能,不必再进行ARM与Thumb工作状态的切换。所有Cortex-A 系列都支持Thumb-2技术。
二、ARM CPU处理器模式
ARM架构有9种处理器模式,其中有8种特权模式与1种非特权模式的用户模式。(见下图)
(1)用户模式下只能执行一般的指令,不能访问受操作系统保护的资源。例如不能访问硬件,不能访问受保护的内存,不能访问受保护的数据等等。而特权模式下,可以访问所有系统资源而且可以进行直接模式切换。所有应用程序都只能在用户模式进行,而且不能直接进行模式切换。如果应用程序需要进行特殊访问,则这时应用程序需产生异常处理,请求操作系统替它完成任务,这时,操作系统把用户模式切换成特权模式,进行任务,完成后切换回用户模式继续执行应用程序。这样的体系结构能使操作系统能控制整个系统的资源。
(2) 处理器模式可以通过软件控制切换,外部中断或异常处理过程切换。
(3)下面简单介绍一下几个常见的模式:
FIQ模式:快速中断模式,当一个高优先级中断产生时进入该模式,一般用于高速数据传输以及通道处理。
IRQ模式:外部中断模式,当一个低优先级中断产生时进入该模式,一般用于通常中断处理。
Svc模式:特权模式,当处理器复位引脚有效时,进入该模式,程序跳转到复位异常中断处理程序处执行。复位异常中断通常 用于系统上电和系统复位两种情况。还有软中断指令执行时,也进入该模式。软中断是通过一条具体指令SWI,引发中断操作,实现从用户模式切换到特权模式并执行特权程序。
SYS模式:系统模式,该模式不是异常处理进入,并且与用户模式具有完全一样的寄存器,用于运行操作系统的特权任务,这样可以保证在异常发生时,维持操作系统的运行的特权任务能够正常运行。
ABT模式:数据访问终止模式,当数据访问的目标地址不存在或不允许时, 存储器就发出数据中止信号,处理器接收到信号进入该模式。
Undef模式:未定义指令中止模式:未定义异常就是内存中的程序指令处理器识别不了,这时进入该模式。未定义指令异常可用于在没有物理协处理器的系统上,对协处理器进行软件仿真,或通过软件仿真实现指令集扩展。为了更好的理解这个模式,先简单引入协处理器的这个概念。协处理器是一种芯片,用于减轻系统微处理器的特定处理任务。最常使用的协处理器是用于控制片上功能的系统协处理器,例如高速缓存存储器管理单元等。举个例子,在有浮点运算系统中,程序要进行浮点运算,ARM向协处理器发出指令,浮点协处理器收到指令会返回一个应答信号,ARM收到应答信号,继续执行程序。如果在没有浮点运算系统中,ARM没有收到应答信号,那就认为没有相应的物理协处理器,就产生未定义指令异常,可通过软件模拟硬件操作,可用浮点运算软件模拟包来支持浮点运算。
三、各个cpu模式的寄存器
ARM 处理器共有37个寄存器,其中包括31个通用寄存器,6个状态寄存器。(都是32位寄存器)
每一种异常模式都有一组专用寄存器。当应用程序发生异常中断时,可以保证在进入异常模式时用户模式的寄存器不被破坏。
1.R0~R12 是通用寄存器,放通用数据,各个模式的R0~R12是与USR模式共享(除了FIQ,R8-R12)。注意:Thumb指令集下只能访问R0~R7低寄存器。
2.R13(SP):堆栈指针寄存器,每一种异常模式都有其自己独立的r13,指向各模式所对应的专用堆栈,这表明ARM处理器允许用户程序有6个堆栈空间。
3.R14(LP):连接寄存器,存储子程序返回地址,跳转指令会自动把返回地址放入R14,子程序把R14复制到PC实现返回。将r14入栈可以处理嵌套中断。
4.R15(PC):程序计数器,指令分为三个阶段执行(取指,译码,执行)。PC计数器总是指向取指的指令,不是译码不是执行的指令。ARM每条指令4个字节(32位),所以PC的值=当前程序执行位置+8字节。
5.APSR/CPSR:应用程序状态寄存器(用户模式下)/当前程序状态寄存器(特权模式下),该寄存器就是用来存储一些关于运算的信息,包括,条件标志位、中断禁止位、当前处理器模式标志和控制状态位等。
N - ALU负数 Z - ALU零位 C - ALU进位操作 V - ALU操作溢出 Q - 指示增强的DSP运算指令是否发生了溢出
J - 是否Jazelle状态 GE[3:0] - SIMD指令使用 IT[7:2] - Thumb-2指令的if...then...条件执行
E - 操作存储的字节顺序(大端模式、小端模式) A - 是否禁止异步abort I - 是否禁止IRQ
F - 是否禁止FRQ T - 是否使用Thumb指令集 M[4:0] - 当前cpu模式编码
6.SPSR:已存储程序状态寄存器。这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。由于用户模式和系统模式不是异常中断模式,所以USR没有SPSR。
以上是我学习后整理的一些笔记,如果有任何错误,请各位大神指教。