ARM架构基础
ARM处理器使用精简指令集(RISC),ARM(Advanced RISC Machines)ARM是一家公司的简称,其次ARM指一系列处理器的统称,同时ARM也是一种精简指令集架构。
Arm CPU构架由各种微构架进行实作,以提供各种功耗、性能以及面积组合的软件兼容性。
CPU构架定义基本指令集,以及操作系统和虚拟机管理器倚赖的例外处理和內存模型。
CPU微构架由定义处理器的设计并涵盖以下内容以决定实作如何满足构架合约:功耗、性能、面积、管道长度及缓存等级。
中央处理单元(CPU)主要由运算器、控制器、寄存器三部分组成,CPU有着处理指令、执行操作、控制时间、处理数据四大作用。
当今处理器(CPU)一共有三个最强的架构,一个是以intel和AMD为代表的X86架构(CISC),一个是以手机、平板处理器所使用的ARM架构(RISC)、最后一个我国龙芯处理器所选择的MIPS架构(RISC)。
ARM内核进行运算的核心部件是算术逻辑运算单元-ALU(arithmetic and logic unit)。它对两个操作数进行逻辑或者算术运算。为了提高嵌入式处理器的工作速度,以保证实时性的要求,ARM在处理器中尽可能多地设置了寄存器。
(图片来源网络)
架构(Architecture)指的是一系列的功能规范。ARM 架构 指的就是是基于 ARM 架构的处理器的功能规范,即 ARM CPU 架构。
微架构包含:总线、电源管理、缓存、ARM架构
AMR架构又称为ARM CPU架构,它包含:指令集、寄存器组、异常模型、内存模型、调试,跟踪和分析。
Arm 架构的安全特性分为4类:防御性执行技术;隔离技术;通用平台安全服务;标准安全API。
ARM体系架构发展
ARM体系结构版本指的是ARM对应的各种指令集。从1985年ARMv1开始到2022年ARMV9,ARM体系结构定义了ARMv1~ARMv9共9个版本。
分别为:ARMv1、ARMv2、ARMv3、ARMv4、ARMv5、ARMv6、ARMv7、ARMv8、ARMv9。
(图片来源网络)
ARMv1、ARMv2 这两代没有做CPU,没有商业化;
ARMv3 对应的 CPU 是 ARM6;
ARMv4 首次增加 Thumb 指令集;
ARMv5 改进了 Thumb,首次增加 E(增强型DSP指令)、J(Java加速器Jazelle);
ARMv6 首次增加 SIMD,升级为 Thunmb-2,首次增加TrustZone;
ARMv7 首次增加 M(长乘法指令),NEON(DSP+SIMD);
ARMv8 首次增加 指令集A64,可执行64位指令;可在 32位 和 64位 之间切换;
ARMV9 进阶SIMD与可扩展向量延伸指令集2(SVE2)、AArch32与AArch64、机密领域管理扩充。
全新Armv9构架将形成下一波3,150亿个Arm构架芯片的领先优势。A系列构架的最新版本Armv9-A提供前所未有的最高性能,以及更高的安全性。
它主要特色包括:
进阶SIMD与可扩展向量延伸指令集2(SVE2);AArch32与AArch64;机密领域管理扩充。
ARM指令执行
ARM处理器(CPU)的字长是32位,则一条汇编指令的长度也是32位,也就是四个字节,而内存中一个地址单元是一个字节,也就是说一条指令要占据4个地址单元。
在ARM的CPU中,一般一条指令的执行简单的划分为3部分:取指->译码->执行。
在ARM的底层架构设计的术语中, CPU先进行fetch(取指令),接着进行decode(译码),然后进行excute(执行),这也就是基于F D E的三步操作,才能完成CPU的运算,这种三步的完成称为三级流水。
现在最新的ARM架构中已经扩展到5级的流水了: 取指->译码->执行->存取->保存结果.
在ARM架构中流水越多,过程越细,处理能力越强,可控制的情况也就越多,也就越复杂,一般来说,流水越多,也就说明体系架构越强大。
分解指令过程:
1、指令预读取(决定从内存的哪儿取指令)--perfetch
2、指令读取(从内存系统中读取指令)--fetch
3、指令译码(解读指令,并且生成控制信号)
4、寄存器读取(提供寄存器的值给操作单元)
5、分配(分配指令给执行单元,也就是分配给ALU)
6、执行(实际的ALU单元处理)
7、内存访问(数据的存取)
8、寄存器回写(更新运行结果到寄存器)
ARM架构指令集
ARM32共有37个32位寄存器,其中31个通用寄存器,6个状态寄存器。
其中未分组寄存器R0-R7,分组寄存器R8-R14;
R0-R7被称为低寄存器组,R8-R15被称为高寄存器组;
R0-R12是通用寄存器,用于存放通用数据;
R13常用作存放堆栈指针,用户也可以使用其他寄存器存放堆栈指针,但在Thumb指令集下,某些指令强制要求使用R13存放堆栈指针。
R14称为链接寄存器(LR全称Link Register),当执行子程序时,R14可得到
R15(PC)寄存器的备份,执行完子程序后,又将R14的值赋值回PC寄存器,即使用R14保存返回地址。
R15称为程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,位[31:1]用于保存PC。
R0-R3: 一般用于函数参数及返回值的传递;
R4-R6, R8,R10-R11: 这些寄存器没有特殊规定,就是普通的通用寄存器;
R7: 栈帧指针(Frame Pointer),指向前一个保存的栈帧(stack frame)和链接寄存器(link register)在栈上的地址;
R9: 操作系统保留;
R12: 称为IP(intra-procedure scratch);
R13: 称为SP(stack pointer),是栈顶指针,存储栈地址,程序跳转的时候,保存程序跳转的目标地址标识;
R14:称为LR(link register),链接寄存器,存放函数的返回地址;
R15:称为PC(program counter),指向当前指令地址。
str寄存器: 表示把寄存器内容存储到栈上;
ldr 寄存器:表示把栈上内容载入到寄存器
(图片来源网络)
在ARM64架构下, CPU提供了33个寄存器, 其中前31个(0~30)属于通用寄存器 (general-purpose integer registers),最后2个(31,32)是专用寄存器(sp寄存器和pc寄存器)。
x0-x7: 用于传递子程序的参数和返回值,使用时不需要保存,多余的参数用堆栈传递,64位的返回结果保存在x0中;
x8: 它是用于保存子程序的返回地址,使用时不需要保存;
x9-x15: 它是临时寄存器,也叫可变寄存器,子程序使用时不需要保存;
x16-x17: 子程序内部调用寄存器(IPx),使用时不需要保存,尽量不要使用;
x18: 它是平台寄存器, 它的使用与平台相关, 尽量不要使用;
x19-x28: 它们是临时寄存器, 子程序使用时必须保存;
x29: 它是帧指针寄存器(FP), 用于连接栈帧,使用时必须保存;
x30: 它是链接寄存器(LR), 用于保存子程序的返回地址;
x31: 它是堆栈指针寄存器(SP), 用于指向每个函数的栈顶;
ARM64该架构的 31 个通用寄存器中,每个寄存器都可用作 64 位 X 寄存器 (X0-X30),或用作 32 位 W 寄存器 (W0-W30)。
对于数据处理的指令,选择X或W决定操作的大小。使用X寄存器将用 64位计算,使用 W 寄存器将用32 位计算。
例如执行32位整数加法:
ADD W0, W1, W2
例如执行 64 位整数加法:
ADD X0, X1, X2
ARM64: A64 指令集是在 Armv8-A 中引入的,以支持 64 位架构。A64 指令集有固定的 32 位指令长度。
ARM32: A32 指令集有固定的 32 位指令长度,并在 4 字节边界上对齐。A32 指令集就是在 Armv6 和 Armv7 架构中我们常说的 ARM 指令集,Armv8 及之后改名 A32 以与 A64 进行区分。
Thumb32: T32 指令集最初是作为 16 位指令的补充集引入的,用于改进的用户代码的代码密度。随着时间的推移,T32 演变成 16 位和 32 位混合长度的指令集。32 指令集就是在在 Armv6 和 Armv7 架构中被我们所熟知的 Thumb 指令集,Armv8 及之后改名为 Thumb32。
ARM架构杂项
ARM授权方式主要有三种:架构层级授权、内核层级授权、使用层级授权。
其中指令集层级授权等级最高,企业就可以对ARM 指令集进行改造以实现自行设计处理器。
Arm 架构有2种异常类型:IRQ(外部中断异常)和FIQ(快速中断异常),旨在用于生成外设中断,在IRQ和FIQ都具有独立的路由控制,通常用于实现安全和非安全中断。
在ARM中当发生异常时,会中断当前程序流程。处理元件 (PE) 将更新当前状态并分支到向量表中的某个位置。通常这个位置将包含通用代码,用于将当前程序的状态推送到堆栈上,然后分支到进一步的代码。
异常产生的指令主要有2个:SWI和BKPT。
SWI:软中断指令,产生软中断,处理器进入管理模式;
SWI 0 //产生软中断,中断立即数为0
BKPT:断点中断指令,处理器产生软件中断;
ARM的异常模型主要细分为:
1、复位异常(Reset): 当处理器在工作时, 突然被按下重启键, 就会触发该异常;
2、数据异常(Data Abort): 当读取数据失败,就会触发数据异常;
3、快速中断异常(FIQ): 快速中断要比普通中断响应速度要快一些;
4、外部中断异常(IRQ): 普通中断;
5、预取异常(Prefetch Abort): 预取指令失败, ARM 在执行指令的过程中, 要先去预取指令准备执行,如果预取指令失败, 就会产生该异常;
6、软中断异常(SWI): 软件中需要去打断处理器工作, 可以使用软中断来执行 ;
7、未定义指令异常(Undefined Instruction): 处理器无法识别指令的异常。
ARM处理器的运行模式
运行不同的程序所需的硬件资源不同,因此ARM处理器它可以为不同程序提供7种不同的硬件资源组合,每一种硬件资源组合称为一种ARM的运行模式。
1、USR(用户模式): ARM处理器正常程序执行模式;
2、FIQ(快速中断模式):用于高速数据传输或通道处理的执行模式;
3、IRQ(中断模式): 用于通用的中断处理的执行模式;
4、SVC(管理模式):它是操作系统使用的保护模式;
5、ABT(终止模式):当数据或指令预取出错时进入的模式;
6、SYS(系统模式):运行具有特权的操作系统任务;
7、UND(未定义指令中止模式):当处理器试图执行未定义指令时进入的模式。
ARM处理器工作状态
从编程的角度来看,ARM微处理器的工作状态一般ARM和Thumb有两种,并支持在两种状态之间切换。
1、ARM状态:此时处理器执行32位的字对齐ARM指令,绝大部分工作在此状态。
2、Thumb状态:此时处理器执行16位的半字对齐的Thumb指令。
ARM处理器存储格式
ARM32体系结构将存储器看作是从0地址开始的字节的线性组合,它所支持的最大寻址空间为4GB。
用户空间(0—3G),这段空间映射到物理内存的高端内存;内核空间(3G—4G),这段空间映射到低端内存,这段空间又分为以下4部分,它们分别为:1、直接映射区(0—896M): 这段虚拟地址空间和低端内存地址存在线性的地址关系即虚拟地址3G+X = 物理地址X;2、动态映射区(896—1016M): 这段空间具体映射到物理内存的什么位置不确定,该区域的地址由内核中的vmalloc来实现分配,其特点是虚拟地址空间连续,但是物理地址空间不一定连续。vmalloc函数返回的是虚拟地址,但是其映射的物理地址有可能在高端内存,也有可能在低端内存;3、永久内存映射区(pkmap1016—1020M): 使用kmap函数将高端内存的地址映射到这部分区域,这样就可以通过这个虚拟地址来访问高端内存的地址。通过这4M的窗口可以重复映射所有的高端内存;4、固定映射区(1020—1024M): 这4M的地址是有特定用途的固定地址,这4M的区域映射的物理内存作为ACPI电源管理等寄存器的地址。
ARM64架构处理器采用48位物理寻址,它最大可以支持256T的地址空间,但是虚拟地址依然采用64,虚拟地址远远大于物理地址。
所以在处理器架构设计上,把虚拟地址空间划分为3部分: 用户空间、非规范区、内核空间,其中内核空间和用户空间每个部分最大支持256T的访问。
用户空间:(0x0000_0000_0000_0000——0x0000_FFFF_FFFF_FFFF)256T
内核空间:(0xFFFF_0000_0000_0000——0xFFFF_FFFF_FFFF_FFFF)256T
其余部分被称为非规范区域。
内核空间又可细分为以下部分:
1、Vmalloc区域:0xFFFF_0000_0000_0000——0xFFFF_7BFF_BFFF_0000(126974G)
2、Vmemmap区域:0xFFFF_7BFF_C000_0000——0xFFFF_7FFF_C000_0000(4096G)
3、PCI I/O区域:0xFFFF_7FFF_AE00_0000——0xFFFF_7FFF_BE00_0000(16M)
4、Moudules区域:0xFFFF_7FFF_C000_0000——0xFFFF_8000_0000_0000(64M)
5、Normal memory线性映射区:0xFFFF_8000_0000_0000——0xFFFF_FFFF_FFFF_FFFF(128T)
ARM体系结构可以用两种方法存储字数据,分别为大端模式和小端模式。
大端模式(高低高低): 字的高字节存储在低地址字节单元中,字的低字节存储在高地址字节单元中。
小端模式(高高低低): 字的高字节存储在高地址字节单元中,字的低字节存储在低地址字节单元中。
审核编辑:汤梓红
评论
查看更多