文章目录
前言
该文章是通过学习《ARM体系结构与编程》 杜春雷的书,这本书描述的是以ARM v6之前的体系架构为基础的,相对比较老,不过对于初学者还是有很多可以借鉴的地方,并结合网上资料所做的笔记,希望可以共同进步。
一、ARM内核与架构
1.1 ARM芯片的组成
任何一款arm芯片主要由两大部分组成:arm内核 、外设 。
- arm内核: arm内核主要由:寄存器 、指令集 、总线 、存储器映射规则 、中断逻辑 和调试组件等。内核是由ARM公司设计并以销售方式授权给个芯片厂商使用的(ARM公司本身不做芯片)。比如为高速度设计的Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(就 是内核) ,后者是指令集的架构(也简称架构)。
- 外设: 包括计时器、A/D转换器、存储器、I2C、UART、SPI、ROM等等。由各个芯片厂商自己设计并与ARM内核衔接配套。不同的芯片厂商就有不同的外设,因此构成了数量和规格庞大的ARM芯片产业。
1.2 ARM处理器命名规则(arm v6之前)
1.3 ARM指令集与架构
-
ARM指令集介绍
指令集的设计是处理器结构中最重要的部分,用arm的术语称之为ISA(Instruction Set Architecture)。
指令集可以说是cpu设计的灵魂,是打开CPU这个潘多拉魔盒的咒语,要想使用cpu,我们只能通过这些指令来操作cpu。
对于32位的cpu,这些指令就是一个个32位的01的序列,不同的值就代表了不同的机器指令 ,cpu的硬件能完美的解析并执行这些指令,比如寻址、运算、异常处理等等。 -
ARM处理器架构
Cortex-A32/35/53/57/72/73/77/78采用的都是ARMv8 架构,这是ARM公司的首款支持64位指令集的处理器架构 。
(1)ARM11之前的处理器和指令集架构对应关系如下:体系架构 处理器家族 ARMv1 ARM1 ARMv2 ARM2、ARM3 ARMv3 ARM6、ARM600、ARM610、ARM7、ARM700、ARM710 ARMv4 StrongARM、ARM8、ARM810、ARM7-TDMI、ARM9-TDMI ARMv5 ARM7EJ、ARM9E、ARM10E、XScale ARMv6 ARM11 ARMv7 Cortex-A、Cortex-R、Cortex-M ARMv8 Cortex-A35、Cortex-R52+、Cortex-A50系列、Cortex-A72、Cortex-A73
(2)ARM11之后处理器和指令集架构
从1995年开始,《ARM体系结构参考手册》是ARM文档的主要来源,提供了关于ARM处理器架构和指令集,区分接口,所有的ARM处理器的支持(如指令语义)的实现细节可能会有所不同。
ARM公司自2004年推出ARMv7内核架构时(ARM11之前的处理器统称经典处理器系列),ARM的命名方式有所改变,摒弃了以往"ARM+数字"这种处理器命名方法。
新的处理器家族,改以Cortex命名,并分为三个系列,分别是Cortex-A,Cortex-R,Cortex-M。
1)Cortex-A系列(A:Application 应用)
面向性能密集型系统的应用处理器内核。*针对日益增长的消费娱乐和无线产品设计,用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域 ,如智能手机、平板电脑、汽车娱乐系统、数字电视,智能本、电子阅读器、家用网络、家用网关和其他各种产品。
2)Cortex-R系列 (R:Real-time 实时)
面向实时应用的高性能内核。*针对需要运行实时操作的系统应用,面向如汽车制动系统 、动力传动解决方案 、大容量存储控制器 等深层嵌入式实时应用。
3)Cortex-M系列(M:MCU & FPGA)
面向各类嵌入式应用的微控制器内核。
4)Cortex-SC系列(SC:SecurCore)
其实,除了上述三大系列之外,还有一个主打安全的Cortex-SC系列(SC:SecurCore),主要用于政府安全芯片 。
Cortex-A系列是用于移动领域的CPU,Cortex-R和Cortex-M系列是用于实时控制领域的MCU。Cortex-M系列主要是用来取代经典处理器ARM7系列(比如基于ARMv4架构的ARM7TDMI),Cortex-M比ARM7的架构高了3代,性能也有较大提升,所以新的设计推荐使用Cortex-M,关于从ARM7到Cortex-M的移植详见ARM官网指导 ARM7处理器系列。此外,Cortex-M系列还细分为M0、M3、M4和超低功耗的M0+,用户依据成本、性能、功耗等因素来选择芯片。
1.4 ARM授权方式
ARM公司本身并不靠自有的设计来制造或出售CPU,而是将处理器架构授权给有兴趣的厂家。
STM32就是属于ARM公司授权Cortex-M内核给ST公司生产的一款处理器。
ARM提供了多样的授权条款,包括售价与散播性等项目。对于授权方来说,ARM提供了ARM内核的集成硬件叙述,包含完整的软件开发工具(编译器、debugger、SDK),以及针对内含ARM CPU硅芯片的销售权。
许多半导体公司持有ARM授权:Atmel、 ST、NXP、 TI、 IBM等。
在知识产权工业,ARM是广为人知最昂贵的CPU内核之一。单一的客户产品包含一个基本的ARM内核可能就需索取一次高达美金20万的授权费用。而若是牵涉到大量架构上修改,则费用就可能超过千万美元。
1.5 ARM核心时间线
早在1993年,经典的ARM7就问世了,直到现在大家看到的Cortex-A系列处理器。
二、ARM处理器模式与寄存器
2.1 ARM处理器模式
ARM处理器共有7种运行模式,分别为用户(usr)、快速中断(fiq)、外部中断(irq)、特权(svc)、中止(abt)、未定义指令中止(und)和系统模式(sys)。
在特权模式下程序可以访问所有的系统资源。非特权模式和特权模式之间的区别在于有些操作只能在特权模式下才被允许,例如直接改变模式和中断使能等。而且为了保证数据安全,一般MMU会对地址空间进行划分,只有特权模式才能访问所有的地址空间。而用户模式如果需要访问硬件,必须切换到特权模式下,才允许访问硬件。
2.2 ARM寄存器
-
ARM共有37个寄存器,都是32位长度的
1)31个通用寄存器,包括程序计数器(PC)在内;
2)6个状态寄存器,包括1个当前状态寄存器和5个备份状态寄存器(影子寄存器)。目前只使用了其中12位。 -
ARM各工作模式下的寄存器
-
Thumb状态下的寄存器
-
ARM各寄存器介绍
-
未分组寄存器 R0 ~ R7,共 8 个。在所有的运行模式下都使用同一个物理寄存器,它们未被系统用作特殊的用途。
-
分组寄存器 R8 ~ R12,R13 ~ R14
(1)R8 ~ R12:( 总共10个 )
每次所访问的物理寄存器与处理器当前的运行模式有关,R8~R12:每个寄存器对应两个不同的物理寄存器当使用fiq模式时,访问寄存器R8_fiq~R12_fiq,当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。其中 FIQ 模式有单独的一组 R8 ~ R12,共5个;( FIQ ( 快速中断模式 ) 时访问寄存器 R8_fiq ~ R12_fiq )另外 6 种模式共用一组 R8 ~ R12,共5个;(当使用除 FIQ 模式以外的其他模式时,访问寄存器 R8 ~ R12)
(2) R13 ~ R14:( 总共12个 )
其中 USR 和 SYS 模式(表格的第一列)共用一组 R13 ~ R14 共2个,
另外 5 种模式下各有独自的一组 R13 ~ R14,并采用以下记号来区分不同的物理寄存器,分别为 fiq、irq、svc、abt、und。共10个。( mode为以下几种之一:usr、fiq、irq、svc、abt、und)
1)R13 在 ARM 指令中常用作堆栈指针 SP。由于每一种模式都有自己的 R13,所以我们在自己初始化的时候一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。
2)R14 称为子程序链接寄存器 LR (Link Register),即在调用子程序的时候,可以将当前的程序地址存入LR寄存器,这样就方便了函数的返回。它有两个特殊功能,一种是每一种模式下都可以用于保存函数的返回地址,通常LR会配合BL和BLX来使用;另外就是异常处理后的返回地址,如中断。 -
PC 指针( R15 )
R15 用作程序计数器 ( PC ),对应一个物理寄存器,由于 ARM 体系结构采用了多级流水线技术,对于 ARM 指令集而言,PC 总是指向当前指令的下两条指令的地址,可以通过向 pc 赋值,来控制程序跳转,即 PC 的值为当前指令的地址值加8个字节。
-
CPSR (1 个 状态寄存器,当前程序状态寄存器 )
-
SPSR ( 5 个 备份状态寄存器 )
SPSR(备份的程序状态寄存器,或者叫 影子寄存器)。
SPSR 除 usr、sys 外,对应用于异常保护的 CPSR 的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,以保证程序的正常运行,每一中异常运行模式(除usr和sys)有各自的物理寄存器。
参考资料
STM32、Cortex-M3和ARMv8-M之间的关联(知乎)