ARM体系结构
1 ARM微处理器概述
1.1 ARM(Advanced RISC Machines)
特点:
- 体积小,功耗低,成本低,高性能
- 支持Thumb(16 bit)和ARM(32 bit)双指令集
- 使用寄存器,大多数数据操作都在寄存器中完成,指令执行速度快
- 寻址方式灵活简单,执行效率高
- 指令长度固定
处理器系列
- 基于指令集体系结构版本分类:v1,v2,v5,v6,v7,v8等
- 基于处理器系列分类:ARM7,ARM9,ARM10,ARM11,StrongARM,XScale
PPT有个指令集版本对应处理器系列的图,以及各指令集版本特点。我估计不考(考了也太丧心病狂了)
但有几点:
- v4引入Thumb指令集
PPT上有对于处理器核的介绍,我觉得更多的像是产品介绍,有需要再去看吧
1.2 ARM的流水线模式
PC指向正被取指的指令,而非正在执行的指令
ARM7采用三级流水线的冯诺依曼结构
取指令(Fetch) -----> 译码(Decode) -----> 执行(Execute)
ARM9采用五级流水线的哈佛结构
取指令(Fetch) -----> 译码(Decode) -----> 执行(Execute) -----> 访存(Memory) -----> 写入(Write)
ARM9的五级流水线将存储器的访问和寄存器的写操作分别单独处理,
解决了三级流水线的LDR/STR指令执行的延迟,提升效率
如果ARM9指令不是对存储器的访问,本级流水线为空时钟周期
1.3 RISC体系结构
CISC缺点:随着指令集不断引入新的指令,计算机体系结构会越来越复杂。在各种指令中使用频率差距比较大 。
特点:
- 指令小于100条
- 指令长度一致,单拍完成便于流水操作
- 寄存器数量多,不少于32个。数据处理的指令只对寄存器的内容操作,只有LDM/STM访问存储器
CISC对比RISC
类别 | CISC | RISC |
---|---|---|
指令系统 | 数量多 | 数量少,通常少于100 |
执行时间 | 有些指令执行时间长,如整块存储器内容拷贝 | 没有较长执行时间的指令 |
编码长度 | 编码长度不定,1-15 Byte | 编码长度固定,通常为4 Byte |
寻址方式 | 寻址方式多样 | 简单寻址 |
操作 | 可对寄存器,存储器进行算数逻辑操作 | 只能对寄存器进行算术操作和逻辑操作,只有Load/Store操作存储器 |
编译 | 难以用优化编译器生成高效目标代码程序 | 采用优化编译技术,生成高效的目标代码程序 |
1.4 寄存器
ARM处理器有37个物理寄存器:31个通用寄存器和6个状态寄存器。寄存器被安排成部分重叠的组,每种处理器模式有不同的寄存器组,以便得到快速的上下文切换
1.5 ARM指令集概述
ARM指令集可分为5大类:
- 数据处理指令:MOV,AND,SUB,ADD
- 加载和存储指令:LDR,STR,LDM,STM
- 分支指令:B,BX
- 协处理器指令:LDC,STC
- 杂项指令:SWI,MRS,MSR
- MRS:读状态寄存器指令,将状态寄存器值保存在通用寄存器上
- MSR:写状态寄存器指令,将通用寄存器值写回状态寄存器
1.6 Thumb指令集概述
16 bit Thumb指令集,是ARM指令集的子集
可分为四大类指令
- 分支指令
- 数据处理指令
- 寄存器加载和存储指令
- 异常产生指令
2 ARM微处理器体系结构
2.1 数据类型
- 字节Byte:长度均为8 bit
- 字Word:在ARM体系结构中为32 bit,在8 bit /16 bit 处理器体系结构中,字的长度为16 bit
- 半字Half-Word:在ARM体系结构中为16 bit,在8 bit /16 bit 处理器体系结构中,字的长度也为16 bit
2.2 ARM微处理器工作状态
分为ARM状态和Thumb状态,当操作数寄存器状态位(位[0])为1进去Thumb状态,状态位为0时进入ARM状态。
;从ARM状态切换到Thumb状态
LDR R0, =Lable+1
BX R0
;从Thumb状态切换到ARM状态
LDR R0, =Lable
BX R0
2.3 ARM体系结构的存储器格式
- 大端存储:高字节存储在低地址,类似字符串读取数字读一个存一个
- 小端存储:高字节存储在高地址,
ARM默认采用小端格式
2.4 处理器模式
ARM体系结构支持7种处理器模式:
处理器模式 | 说明 | 备注 |
---|---|---|
用户usr | 正常程序工作模式 | 不能直接切换到其他模式 |
系统sys | 用于支持操作系统的特权任务 | 与用户模式使用完全相同的寄存器组,但可以直接切换到其他模式 |
快中断fiq | 支持高速数据传输及通道处理 | FIQ异常响应时进入此模式 |
中断irq | 用于通用中断处理 | IRQ异常响应时进入此模式 |
管理svc | 操作系统保护代码 | 系统复位和软件中断响应时进入此模式 |
中止abt | 用于支持虚拟内存和存储器保护 | 预取中止和数据中止 |
未定义und | 支持硬件协处理器的软件仿真 | 未定义指令异常响应时进入此模式 |
特权模式:除了用户模式其他都属于特权模式,可以自由切换处理器模式,ARM内部寄存器和一些片内外设只允许特权模式访问。
异常模式:特权模式中除了系统模式都是异常模式,通过程序切换或由特定异常进入
启动时模式转换
- 管理模式
- 多种特权模式变化:完成各模式的堆栈设置,初始化每种模式的R13指向该运行模式的栈空间
- 用户模式:用户程序的运行模式
2.5 寄存器组织
R0~R13:通用寄存器,可用于任何使用通用寄存器的指令
R0~R7:未分组寄存器,对于任意处理器模式,对应相同的32位物理寄存器
R8~R14:分组寄存器,对应的物理寄存器取决于当前的处理器模式
R13堆栈指针
SP,指向各状态模式的专用堆栈,ARM中没有特殊方式使用,但Thumb有
R14寄存器与子程序调用
R14是链接寄存器,一个功能是在每种模式下,保存子程序的返回地址,另一个功能是当发生异常的时候,该模式下的R14设置成异常模式将要返回的地址
下面是子程序调用的过程:
- 程序A调用程序B
- 程序跳转至Lable,执行B,同时硬件将BL Lable指令的下一条指令地址存入R14
- 程序B执行完毕,将R14的值存入PC,实现子程序返回
异常发生时,程序跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成,区别在于有些异常由一个小常量的偏移。
R15寄存器
R15寄存器是程序计数器PC,指向正在取指的地址
使用STR或STM指令保存R15时,将会在当前指令加上8字节或12字节的偏移,对于不同芯片有不同的偏移量
计算偏移汇编程序:
Thumb状态下寄存器
可以直接访问的寄存器有:
- R0~R7
- R13~R15
- CPSR
发生异常时,处理器自动进入ARM状态
程序状态寄存器CPSR
N、Z、C、V,最高4位称为条件码标志。ARM的大多数指令可以条件执行的,即通过检测这些条件码标志来决定程序指令如何执行。
各个条件码的含义如下:
-
N:在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0。
-
Z:如果结果为0,则Z=1;如果结果为非零,则Z=0。
-
C:其设置分一下几种情况:
- 对于加法指令(包含比较指令CMN),如果产生进位,则C=1;否则C=0。
- 对于减法指令(包括比较指令CMP),如果产生借位,则C=0;否则C=1。
- 对于有移位操作的非法指令,C为移位操作中最后移出位的值。
- 对于其他指令,C通常不变。
-
V:对于加减法指令,在操作数和结果是有符号的整数时,如果发生溢出,则V=1;如果无溢出发生,则V=0;对于其他指令,V通常不发生变化。
SPSR:备份程序状态字,保存异常事件发生之前的CPSR
CPSR/SPSR的读写指令
MRS:读状态寄存器到通用寄存器MRS R1, CPSR
MSR:写通用寄存器到状态寄存器MSR CPSR, R1
2.6 异常
正常的程序流被暂时中止,处理器就进入异常模式