ARM体系结构

发布于:2024-04-06 ⋅ 阅读:(119) ⋅ 点赞:(0)

阅读引言: arm架构处理器的基本知识已在上一篇文章中描述过了, 本文将会从arm的存储模型、异常机制、工作模式、指令集、流水线、arm的寄存器组织方面去描述。

目录

一、ARM处理器概论

1.指令集概述

2.指令分类

3.编译流程

二、ARM的存储模型

1.ARM数据类型

2.字节序

三、ARM工作模式

1.arm有8个基本工作模式

2.不同工作模式的理解

3.ARM工作模式分类

四、ARM寄存器组织

1.寄存器概念

2.ARM寄存器

3.专用寄存器

五、ARM的异常处理

1.异常的概念

2.异常处理机制的概念

3.ARM异常源

4.异常模式

5.ARM异常处理流程

6.异常优先级

7.为什么FIQ比IRQ块

六、ARM微架构和指令流水线


一、ARM处理器概论

1.指令集概述

指令:

    能够指示处理器执行某种运算的命令称为指令(如加、减、乘 ...)

    指令在内存中以机器码(二进制)的方式存在

    每一条指令都对应一条汇编

    程序是指令的有序集合

指令集:

    处理器能识别的指令的集合称为指令集

    不同架构的处理器指令集不同

指令是cpu提供给开发人员的一个接口。

2.指令分类

arm指令:

    所有指令(机器码)都占用32bit存储空间                              

    代码灵活度高、简化了解码复杂度

    执行ARM指令集时PC值每次自增4

thumb指令:

    所有指令(机器码)都占用16bit存储空间

    代码密度高、节省存储空间

    执行Thumb指令集时PC值每次自增2

 Thumb-2指令集:

M3/M4使用的就是该指令集, 集成了Thumb指令集的存储空间小, ARM指令集合的强大, 基于arm指令的拓展。

3.编译流程

机器码(二进制)是处理器能直接识别的语言,不同的机器码代表不同的运算指令,处理器能够识别哪些机器码是由处理器的硬件设计所决定的,不同的处理器机器码不同,所以机器码不可移植

 汇编语言是机器码的符号化,即汇编就是用一个符号来代替一条机器码,所以不同的处理器汇编也不一样,即汇编语言也不可移植

 C语言在编译时我们可以使用不同的编译器将C源码编译成不同架构处理器的汇编,所以C语言可以移植

不同的编译器将c语言编译成对应类型的cpu的指令

二、ARM的存储模型

1.ARM数据类型

基本数据类型:

    Byte               

              

             

 8bits
    Halfword   16bits
  Word      32bits

数据存储:

    Word型数据在内存的起始地址必须是4的整数倍

    Halfword型数据在内存的起始地址必须是2的整数倍

注:即数据本身是多少位在内存存储时就应该多少位对齐

字节对齐目的是高效的访问内存

2.字节序

 大端:低地址存放高位,高地址存放低位,  

小端: 低地址存放低位,高地址存放高位,

注:ARM一般使用小端对齐, 网络中使用大端字节序, 小端方便计算, 大端方便速识别

三、ARM工作模式

1.arm有8个基本工作模式

User      非特权模式,一般在执行上层的应用程序时ARM处于该模式

FIQ          当一个高优先级中断产生后ARM将进入这种模式

IRQ         当一个低优先级中断产生后ARM将进入这种模式

SVC         当复位或执行软中断指令后ARM将进入这种模式

Abort          当产生存取异常时ARM将进入这种模式

Undef         当执行未定义的指令时ARM将进入这种模式

System         使用和User模式相同寄存器集的特权模式, 权限更高

Monitor 为了安全而扩展出的用于执行安全监控代码的模式

2.不同工作模式的理解

不同模式拥有不同权限 、不同模式执行不同代码、 不同模式完成不同的功能

3.ARM工作模式分类

按照权限分类:

    User为非特权模式(权限较低),其余模式均为特权模式(权限较高)

权限低:防止我们修改操作系统, 破环操作系统的运行

按照状态: 

    FIQ、IRQ、SVC、Abort、Undef属于异常模式,即当处理器遇到异常后

会进入对应的模式

四、ARM寄存器组织

1.寄存器概念

概念:

    寄存器是处理器内部的存储器,没有地址, 在C语言中的一种存储类型, 在cpu内部存储, 不能取地址

作用:

    一般用于暂时存放参与运算的数据和运算结果

分类:

    包括通用寄存器、专用寄存器、控制寄存器

2.ARM寄存器

不同的处理器内部的寄存器的数量不同, 40个cortex A9

注:在某个特定模式下只能使用当前模式下的寄存器,一个模式下特有的寄存器其他模式下不可使用

3.专用寄存器

pc寄存器:

    程序计数器,用于存储当前取址指令的地址

lr链接寄存器:

    链接寄存器,一般有以下两种用途:

    > 执行跳转指令(BL/BLX)时,LR会自动保存跳转指令下一条指令的地址

      程序需要返回时将LR的值复制到PC即可实现

    > 产生异常时,对应异常模式下的LR会自动保存被异常打断的指令的下

      一条指令的地址,异常处理结束后将LR的值复制到PC可实现程序返回

sp:

    栈指针,用于存储当前模式下的栈顶地址, 每存储一个变量, 栈指针自动移动到下一个位置, 为存储下一个变量做好准备

当前程序状态寄存器(cpsr):

CPSR寄存器分为四个域,[31:24]为条件域用F表示、[23:16]为状态域用S表示、[15:8]为预留域用X表示、[8:0]为控制域用C表示

Bit[4:0]

    [10000]User    [10001]FIQ     [10010]IRQ     [10011]SVC

    [10111]Abort   [11011]Undef   [11111]System  [10110]Monitor

ARM有两个状态:arm状态和thumb状态

 Bit[5]

    [0]ARM状态     [1]Thumb状态

 Bit[6]

    [0]开启FIQ     [1]禁止FIQ                   //两种不同等级的中断优先级

 Bit[7]

    [0]开启IRQ     [1]禁止IRQ

Bit[28]

    > 当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0                 //借位和进位影响到了符号位

    > 当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1

 Bit[29]

    > 当运算器中进行加法运算且产生进位时该位自动置1,否则为0

    > 当运算器中进行减法运算且产生借位时该位自动置0,否则为1

 Bit[30]

    当运算器中产生了0的结果该位自动置1,否则为0

 Bit[31]

    当运算器中产生了负数的结果该位自动置1,否则为0

五、ARM的异常处理

1.异常的概念

 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生,  这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件,异常事件处理完成之后再返回到被异常打断的点继续执行程序

2.异常处理机制的概念

    不同的处理器对异常的处理的流程大体相似,但是不同的处理器在具体实现的机制上有所不同;比如处理器遇到哪些事件认为是异常事件遇到异常事件之后处理器有哪些动作、处理器如何跳转到异常处理程序如何处理异常、处理完异常之后又如何返回到被打断的程序继续执行等我们将这些细节的实现称为处理器的异常处理机制

3.ARM异常源

概念:  导致异常产生的事件称为异常源

| 中断类型                   | 描述                           |
|--------------------------|------------------------------  -|
| FIQ                        | 快速中断请求引脚有效           |
| IRQ                        | 外部中断请求引脚有效           |
| Reset                      | 复位电平有效                  |
| Software Interrupt         | 执行swi指令                   |
| Data Abort                 | 数据终止                      |
| Prefetch Abort             | 指令预取终止                  |
| Undefined Instruction      | 遇到不能处理的指令            |

4.异常模式

异常模式:在ARM的基本工作模式中有5个属于异常模式,即ARM遇到异常后会切换成对应的异常模式

5.ARM异常处理流程

ARM产生异常后的动作(自动完成)

    1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>                #备份

    2.修改CPSR的值                                                                          #修改成对应的异常模式

2.1.修改中断禁止位禁止相应的中断

2.2.修改模式位进入相应的异常模式产生异常

        2.3.修改状态位进入ARM状态

    3.保存返回地址到对应异常模式下的LR_<mode>

    4.设置PC为相应的异常向量(异常向量表对应的地址)

异常向量表: 

异常向量表

    > 异常向量表的本质是内存中的一段代码

    > 表中为每个异常源分配了四个字节的存储空间

    > 遇到异常后处理器自动将PC修改为对应的地址

    > 因为异常向量表空间有限一般我们不会再这里

      写异常处理程序,而是在对应的位置写一条跳

      转指令使其跳转到指定的异常处理程序的入口

    注:ARM的异常向量表的基地址默认在0x00地址

        但可以通过配置协处理器来修改其地址

异常返回: 

 ARM异常返回的动作(自己编写)

    1.将SPSR_<mode>的值复制给CPSR

      使处理器恢复之前的状态

    2.将LR_<mode>的值复制给PC

      使程序跳转回被打断的地址继续执行

6.异常优先级

多个异常同时产生时的服务顺序

7.为什么FIQ比IRQ块

六、ARM微架构和指令流水线

取指、译码、执行。

ARM指令流水线

    ARM7采用3级流水线

    ARM9采用5级流水线

    Cortex-A9采用8级流水线

    注1:虽然流水线级数越来越多,但都是在三级流水线的基础上进行了细分

PC的作用(取指)

    不管几级流水线,PC指向的永远是当前正在取指的指令,而当前正在执行 的指令的地址为PC-8, 译码器这里减4 执行这里也是4

指令流水线机制的引入确实能够大大的提升指令执行的速度但在实际执行程序的过程中很多情况下流水线时是无法形成的比如芯片刚上电的前两个周期、执行跳转指令后的两个周期等所以指令流水线的引入以及优化只能使平均指令周期不断的接近1而不可能真正的达到1,且流水线级数越多芯片设计的复杂程度就越高,芯片的功耗就越高

多核处理器:

    即一个SOC(system on chip)中集成了多个CPU核

 作用:

    不同的线程可以运行在不同的核心中  做到真正的并发运行,

 资源:

    多核处理器共用外设与接口资源


网站公告

今日签到

点亮在社区的每一天
去签到