ARM Cortex-A8 的学习笔记(2)——ARM寄存器

ARM 182浏览

        上一篇介绍了关于学习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


以上是我学习后整理的一些笔记,如果有任何错误,请各位大神指教。