一文深入搞懂ARM处理器架构
一文深入搞懂ARM处理器架构
ARM处理器作为嵌入式系统领域的主流架构,其独特的设计和强大的功能使其在各种应用场景中占据重要地位。本文将深入探讨ARM处理器的基础架构、体系设计、工作模式以及内存管理机制,帮助读者全面理解这一重要技术。
1. 嵌入式处理器基础
典型的微处理器由控制单元、程序计数器(PC)、指令寄存器(IR)、数据通道、存储器等组成。指令执行过程一般分为以下几个阶段:
- 取指:从存储器中获得下一条执行的指令读入指令寄存器;PC(程序计数器)总是指向下一条将要执行的指令;IR(指令寄存器)用于保持已取得指令。
译码:解释指令,决定指令的执行意义。
执行:从存储器向数据通道寄存器移动数据;通过算术逻辑单元ALU进行数据操作。
存储:从寄存器向存储器写数据。
在一些微处理器上,如ARM系列处理器、DSP等,指令实现流水线作业,指令过程按流水线的数目来进行划分。如5级流水线的处理器将指令分5个阶段执行。
按存储结构分类
冯·诺依曼体系结构:也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。处理器经由同一个总线传输来访问程序和数据存储器,程序指令和数据的宽度相同。如X86系列、ARM7等。
哈佛体系结构:是一种将程序指令存储和数据存储分开的存储器结构,目的是为了减轻程序运行时的访存瓶颈。哈佛结构的微处理器通常具有较高的执行效率。如Microchip公司的PIC系列芯片,摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11等。
按指令类型分类
复杂指令集(CISC)处理器:具有大量的指令和寻址方式,那么就需要更多的解释器。8/2原则:80%的程序只使用20%的指令;大多数程序只使用少量的指令就能够运行。CISC具有如下显著特点:
指令格式不固定,指令长度不一致,操作数可多可少;
寻址方式复杂多样,以利于程序的编写;
采用微程序结构,执行每条指令均需完成一个微指令序列;
每条指令需要若干个机器周期才能完成,指令越复杂,花费的机器周期越多。
精简指令集(RISC)处理器:指令数目少,在通道中只包含最有用的指令;执行时间短,确保数据通道快速执行每一条指令;使CPU硬件结构设计变得更为简单;每条指令都采用标准字长。
2. ARM处理器体系架构
ARM即Advanced RISC Machines的缩写。1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生。1990年成立了Advanced RISC Machines Limited。20世纪90年代,ARM32位嵌入式RISC(Reduced Instruction Set Computer)处理器扩展到世界范围,占据了低功耗、低成本和高性能的嵌入式系统应用领域的领先地位。目前己经占有75%以上的32位嵌入式产品市场。
ARM处理器特点:
- ARM指令是32位定长的(除AArch64架构部分增加指令为64位外)
- 寄存器数量丰富(37个寄存器)
- 普通的Load/Store指令
- 多寄存器的Load/Store指令
- 指令的条件执行
- 单时钟周期中的单条指令完成数据移位操作和ALU操作
- 通过变种和协处理器来扩展ARM处理器的功能
- 扩展了16位的Thumb指令来提高代码密度
ARM的命名规则, 大致分成两类类:
- 基于ARM Architecture版本的“处理器系列”命名规则;
- 基于ARM Architecture版本的“处理器型号”命名规则。
ARMv6 架构,引进了包括单指令多数据(SIMD)运算在内的一系列新功能。ARMv6-M 架构,为低成本、高性能设备而设计,向以前由8位设备占主导地位的市场提供32位功能强大的解决方案。如Cortex-M0和Cortex-M1。ARMv7架构,所有ARMv7架构处理器都实现了Thumb-2 技术(一个经过优化的16/32位混合指令集),此架构分为3类处理器:Cortex-A -应用处理器、Cortex-R - 实时处理器、Cortex-M - 微控制器。ARMv8架构,ARMv8-A将64位体系结构支持引入ARM体系结构中,其中包括:64位通用寄存器、SP(堆栈指针)和 PC(程序计数器),64位数据处理和扩展的虚拟寻址,兼容32位处理。ARMv9架构,最重大的升级在于AI和安全,在兼容ARMv8的基础上,提升了安全性,增加了矢量计算、机器学习和数据信号处理等多方面能力,性能表现也将得到极大幅度的提升。
ARM数据类型
- 双字节(Double-Word):64位
- 字(Word):在ARM体系结构中,字的长度为32位。
- 半字(Half-Word):在ARM体系结构中,半字的长度为16位。
- 字节(Byte):在ARM体系结构中,字节的长度为8位。
ARM处理器存储格式
作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB。ARM体系结构可以用两种方法存储字数据,分别为大端模式和小端模式。
- 大端模式(高地高低):字的高字节存储在低地址字节单元中,字的低字节存储在高地址字节单元中。
ARM处理器工作状态
从编程的角度来看,ARM微处理器的工作状态一般ARM和Thumb有两种,并可在两种状态之间切换。
- ARM状态:此时处理器执行32位的字对齐ARM指令,绝大部分工作在此状态。
- Thumb状态:此时处理器执行16位的半字对齐的Thumb指令。
THUMB指令的特点:
- THUMB代码所需空间为ARM代码的70%;
- THUMB代码所使用的指令数比ARM代码多40%;
- 用32位存储器,ARM代码比THUMB代码快40%;
- 用16位存储器,THUMB代码比ARM代码快45%;
- 使用THUMB代码,外部存储器功耗比ARM代码少30%。
ARM处理器工作模式
ARM Cortex-A处理器工作模式
Cortex-A寄存器组
34个通用寄存器,包括各种模式下的R0-R14和共用的R15程序计数器(PC),这些寄存器都是32位的。8个状态寄存器,Hyp模式独有一个ELR_Hyp寄存器。
程序状态寄存器CPSR和SPSR
和其他处理器一样,ARM有程序状态存储器来配置处理器工作模式和显示工作状态。ARM处理器有两个程序状态寄存器CPSR (Current Program Status Register,当前程序状态寄存器)和SPSR (Saved Program Status Register,备份的程序状态寄存器)。
CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位以及其他一些相关的控制和状态位。
每一种运行模式下都有一个专用的物理状态寄存器,称为SPSR为状态寄存器。
N(Negative):当用两个补码表示的带符号数进行运算时,N=1表示结果为负,N=0表示结果为正数或零
Z(Zero):Z=1表示运算结果为0,Z=0表示运算结果非零
C(Carry):有4种方法可以设置C的值:
加法指令(包括比较指令CMP)
当运算产生进位时(无符号数溢出),C=1,否则C=0
减法运算(包括比较指令CMP)
当运算产生了借位(无符号数溢出),C=0,否则C=1
对于包含移位操作的非加/减运算指令,C为移出值的最后一位。对于其他的非加/减运算指令,C的值通常不变。V(Overflow):有2种方法设置V的值:
对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
对于其他的非加减法运算指令,V的值通常不变。
I(Interrupt Request):I=1表示禁止响应irq,I=0表示允许响应
F(Fast Interrupt Request):F=1表示禁止响应fiq,F=0表示允许响应
T(Thumb):T=0表示当前状态位ARM状态,T=1表示为Thumb状态
M4-M0:表示当前处理器的工作模式
工作模式的切换条件
- 执行软中断(SWI)或复位命令(Reset)指令。如果在用户模式下执行SWI指令,CPU就进入管理(Supervisor)模式。
- 有外部中断发生。如果发生了外部中断,CPU就会进入IRQ或FIQ模式。
- CPU执行过程中产生异常。最典型的异常是由于MMU保护所引起的内存访问异常,此时CPU会切换到Abort模式。如果是无效指令,则会进入Undefined模式。
- 有一种模式是CPU无法自动进入的,这种模式就是System模式,要进入System模式必须由程序员编写指令来实现。要进入System模式只需改变CPSR的模式位为System模式对应的模式位即可。
- 在任何特权模式下,都可以通过修改CPSR的MODE域来进入其他模式。不过需要注意的是由于修改的CPSR是该模式下的影子CPSR,即SPSR,因此并不是实际的CPSR,所以一般的做法是修改影子CPSR,然后执行一个MOVS指令来恢复执行某个断点并切换到新模式。
3. ARM处理器内存管理
什么是内存映射
内存映射指的是在ARM存储系统中,使用内存管理单元(MMU)实现虚拟地址到实际物理地址的映射。
为什么要内存映射
A32架构的ARM的地址总线为32位,故CPU可寻址范围为0x00000000~0xffffffff寻址空间为4GB,所有的内部和外部存储或者外设单元都需要通过对应的地址来操作,不同芯片外设的种类数量寻址空间都不一样,为了能让内核更方便的管理不同的芯片设计,ARM内核会先给出预定义的存储映射。芯片设计公司需要根据内核提供的预定义的存储器映射来定义芯片内部外设和外部的保留接口,这样做的好处是极大地减少了同一内核不同芯片间地址转化的麻烦(CPU操作统一的虚拟地址,实际物理地址交由MMU管理)。
位带操作
什么是位带操作
举个简单的例子,在使用51单片机操作P1.0为低电平时我们知道这背后实际上就是往某个寄存器某个比特位中写1或0的过程,但在CPU操作的过程中每一个地址所对应的都是一个8位字节,怎么实现对其中某一位的直接操作,这就需要位带操作的帮助。哪些地址可以进行位带操作
上图中有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围(Bit band region),第二个则是片内外设区的最低 1MB 范围。
寄存器的地址计算
在ARM中所有的外设地址基本都是挂载在AHB或者APBx总线上,因此我们往往采用基地址+偏移地址+结构体的方式,来快速明了计算某一外设具体寄存器的地址。