三、架构魔法
架构魔法指的是架构特性,比如运算魔法、安全魔法、虚拟化魔法等,而这部分我们将从派系、时代、微魔法多个维度介绍这些神秘的魔法。
3.1 派系
3.1.1 Cortex-A 魔法
魔法 8.0(Armv8.0-A)
Advance SIMD
aSIMD,增强的定长高级单指令多数据
在 Armv8-A 中,与变长的 SVE、SVE2 共同构成了SIMD
SVE 主要用在 HPC 中,在 V9 中为标配
密码扩展 (Crypto Extension ,CE)
AES加速器:AEAD、AESE
SHA加速器:SHA1、SHA256
CRC
硬件 CRC 加速
魔法 8.1(Armv8.1-A)
Atomic memory access instructions (AArch64)
为大型 系统 LSE 设计的存储原子访问扩展,PostgreSQL 已经支持,比如独占加载指令LDXR、独占存储指令STXR
Limited Order regions (AArch64)
为大系统LSE设计的内存访问顺序,load-aquire、store-release指令
是乱序时代的DMB、DSB、ISB的升级版
Increased Virtual Machine Identifier (VMID) size, and Virtualization Host Extensions (AArch64)
虚拟化中更大的虚拟机 ID
直接将 Host 运行在 EL2 的 VHE 技术
Privileged Access Never (PAN) (AArch32 and AArch64)
可以通过 PAN 限制内核对用户空间内存的访问
魔法 8.2(Armv8.2-A)
Support for 52-bit addresses (AArch64)
52位大物理地址和大虚拟地址的支持,通常面向服务器应用
The ability for PEs to share Translation Lookaside Buffer (TLB) entries (AArch32 and AArch64)
多 PE 共享 TLB,即共享页表项
FP16 data processing instructions (AArch32 and AArch64)
相对于单精度和双精度,支持半精度
Statistical profiling (AArch64)
内置于流水线内部的指令统计工具,比如包延迟、采样指令的重要信息(access/hit/miss,分支预测错误,是否读写互锁)、源于哪一级的存储
Reliability Availability Serviceability (RAS) support becomes mandatory (AArch32 and AArch64)
提供保证可靠性、可用性、可服务性的机制,TF-A 已经支持了 RAS 框架
安全扩展 CE
SHA2-512、SHA3
SM3、SM4
魔法 8.3(Armv8.3-A)
Pointer authentication (AArch64)
对指令指针、数据指针进行身份认证
目前GCC -msign-return-address 支持返回LR的认证
Nested virtualization (AArch64)
允许客户机在 EL1 中运行虚拟机管理程序
增加了 EL1 到 EL2 的访问机制
Advanced Single Instruction Multiple Data (SIMD) complex number support (AArch32 and AArch64)
aSIMD支持复数运算
Improved JavaScript data type conversion support (AArch32 and AArch64)
改进的javascript数据类型转换支持
A change to the memory consistency model (AArch64)
在RCsc基础上增加weaker RCpc支持
ID mechanism support for larger system-visible caches (AArch32 and AArch64)
cache ID寄存器扩容
魔法 8.4(Armv8.4-A)
Secure virtualization (AArch64)
S-EL2支持,可以在安全环境下运行安全虚拟机
Nested virtualization enhancements (AArch64)
虚拟机可以在 EL-1 模式运行 Hypervisor,并且优化了效率
Small translation table support (AArch64)
64 位模式下支持小转换表
Relaxed alignment restrictions (AArch32 and AArch64)
放宽的对齐限制
Memory Partitioning and Monitoring (MPAM) (AArch32 and AArch64)
MPAM 用于限制共享资源中的进程交互和干扰,在复杂系统中能够实现服务水平协议SLA
Additional crypto support (AArch32 and AArch64)
SHA2-512、SHA3
SM3、SM4
Generic counter scaling (AArch32 and AArch64)
计数器缩放,实现更高的精度
Instructions to accelerate SHA
SHA 加速指令
魔法 8.5/9.0(Armv8.5-A/Armv9.0-A)
Memory Tagging (AArch64)
MTE 的设计目标,就是能快速监测内存安全违例从而提供软件代码的鲁棒性,以此来抵御恶意代码的攻击。如果实现了芯片 MTE,能快速定位很多问题。
Branch Target Identification (AArch64)
分支目标标识技术,使得通过修改存储在栈上的指针方式攻击(JOP)无效
Random Number Generator instructions (AArch64)
支持确定、真随机数指令
Cache Clean to Point of Deep Persistence (AArch64)
cache 清空到深度存储点 PODP,先对于POD、POC、POU
魔法 8.6/9.1(Armv8.6-A/Armv9.1-A)
General Matrix Multiply (GEMM) instructions (AArch64)
矩阵乘法指令 GEMM 支持
Fine grained traps for virtualization (AArch64)
虚拟化细粒度陷入,提升虚拟机性能
High precision Generic Timer
超高精度的定时器
Data Gathering Hint (AArch64)
用来指示写 merging 对性能是否有好处
魔法 8.7/9.2(Armv8.7-A/Armv9.2-A)
Enhanced support for PCIe hot plug (AArch64)
增强的 PCIe 热插拔支持
Atomic 64-byte load and stores to accelerators (AArch64)
64 字节原子操作加速
Wait For Instruction (WFI) and Wait For Event (WFE) with timeout (AArch64)
带超时指示的 WFI 和 WFE 指令
Branch-Record recording (Armv9.2 only)
分支记录录制
魔法 8.8/9.3(Armv8.8-A/Armv9.3-A)
Non-maskable interrupts (AArch64)
不可屏蔽中断
Instructions to optimize memcpy() and memset() style operations (AArch64)
优化 memcpy 和 memset 的指令支持
Enhancements to PAC (AArch64)
PAC 增强
Hinted conditional branches
新指令将条件跳转方向作为hint
魔法 8.9/9.4(Armv8.9-A/Armv9.4-A)
Permission Indirection and overlays
与直接的权限控制相比,使用间接重叠方式更灵活,兼容 CPU 与 SMMU 共存方式
Translation hardening
转换表加固,通过减少也不的访问接口来加固页表安全
128-bit页表
新格式支持更大的输出地址和更大的新属性位域范围
SME2
增强的矩阵运算引擎
Guarded Control Stack
防止 ROP 攻击,以及提供一种不需要 unwind 就能获得当前调用栈的方式
Confidential Computing
机密计算 CCA 重头戏
Memory Tagging Extension(MTE) 更新
MTE 更新
Performance Monitor(PMU)快照支持和fixed-function指令计数器
额外的RAS能力,包括新的异常类型,用来报告structure上的错误,而不是内存上的错误
3.1.2 Cortex-R 魔法
第八代魔法(Armv8-R)
和 A-Profile 类似,后续补充
3.1.3 Cortex-M 魔法
魔法 8.0(Armv8.0-M)
Load acquire, store release instructions 内存原子操作,C11 已支持
Floating point extension architecture v5 浮点扩展架构 v5
New instructions for TrustZone technology support 支持 Trustzone 的新指令
New style MPU programmer’s model 新的 MPU 编程模型
Better debug capability 更优秀的调试能力
魔法 8.1(Armv8.1-M)
MVE (M-Profile Vector Extension),Arm Helium 基于 Helium 技术的向量扩展
LoB/Loop Tail Predication/BF 高效的循环和分支预测
Security
Execution permission 执行权限控制
V8.2-M PAC(Pointer Authentication) 防止 ROT 攻击的指针认证
V8.2-M BTI(Branch Target Instructions) 防止 JOT 攻击的 BTI 技术
DIT(Data Independent Timing) 为数据处理进行独立的定时功能
UDE(Unprivileged Debug Extension) 非特权调试扩展
3.2 魔法发展史
表2 魔法年份
2022 | Armv 8.9、9.4 |
A-PROFILE 2022 |
2021 | Armv 8.8、9.3 | A-PROFILE 2021 |
2020 | Armv 8.7、9.2 | A-PROFILE 2020 |
2019 | Armv 8.6 | -A-PROFILE 2019 |
2018 | Armv 8.5 | A-PROFILE 2018 |
2017 | Armv 8.4 | A-PROFILE 2017 |
2016 | Armv 8.3 | A-PROFILE 2016 |
2015 | Armv 8.2 | A-PROFILE 2015 |
2014 | Armv 8.1 | A-PROFILE 2014 |
3.3 微魔法
表3 技能表
NEON | 整数向量运算 |
VFP | 浮点向量运算 |
SVE | 变长向量扩展运算 |
CE | 密码扩展 |
SME | 矩阵运算引擎 |
SIMD | 单指令多数据(超标量) |
FPv5 | 浮点运算 |
MPU | 内存保护单元 |
MMU | 内存管理单元 |
SMMU | 系统内存管理单元 |
查看ID_AA64xxxx系列寄存器识别当前 CPU 实现的架构特性。
四、架构演练
4.1 大集结
随着时间的推移和需求变化,各个产品家族都演化出了多个成员,其中 Cortex-A 系列处理器从 A5到 A715 共发布了24款,Cortex-M 系列处理器从 M0 到 M85 共发布了11款,Cortex-R 系列处理器从 R4 到 R82 共发布了11款,对于各个处理器之间的差异,可以从下面链接表格中看到。
Arm Cortex-A 系列处理器功能对比表
Arm Cortex-M 处理器功能对比表
ArmCortex-R 处理器功能对比表
4.2 排兵布阵
不同的处理器可处理不同的应用。
在可穿戴方面,主要用 Cortex-A 和 Cortex-M ;存储方面 Cortex-R 和 Cortex-M ;在 ADAS 方面有 Cortex-A 和 Cortex-R ,A用于高性能计算、R用于实时和安全控制;在移动消费市场,Cortex-A、Cortex-R 和 Cortex-M 都有应用,A 来做应用处理器,R 主要是做基带,Cortex-M 可能会用于sensor hub (传感器中枢)的芯片领域。
4.3 运筹帷幄,决胜千里之外
4.3.1 上传下达-控制台输出
/*Hello world*/ #include <stdio.h> int main() { printf("Hello World\n"); return 0; }
4.3.2 烽火通信-LED 跑马灯
#include"led.h" void LED_Init(void) { RCC->APB2ENR|=1<<2; RCC->APB2ENR|=1<<5; GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X00000003; GPIOA->ODR|=1<<8; GPIOD->CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000300; GPIOD->ODR|=1<<2; }
4.3.3 密令签发-加密
void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { int i; uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; RK = ctx->rk; GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++; GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++; for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) { AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); } AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); X0 = *RK++ ^ ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); X1 = *RK++ ^ ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); X2 = *RK++ ^ ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); X3 = *RK++ ^ ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); PUT_UINT32_LE( X0, output, 0 ); PUT_UINT32_LE( X1, output, 4 ); PUT_UINT32_LE( X2, output, 8 ); PUT_UINT32_LE( X3, output, 12 ); }
4.3.4 粮草先行-启动代码
.text .global _start _start: @异常向量表 b reset nop b swi_handler nop nop nop b irq_hander nop reset: ldr sp,=buf+512*3 @irq模式 mrs r0,cpsr bic r0,#0x1f orr r0,#0x12 msr cpsr,r0 ldr sp,=buf+512*2 @user模式 mrs r0,cpsr bic r0,#0x1f orr r0,#0x10 msr cpsr,r0 ldr sp,=buf+512 mov r0,#0x11 mov r1,#0x22 SWI 1 add r2,r0,r1 nop nop stop: nop nop nop B stop @软中断 swi_handler: @入栈保护现场 stmfd sp!,{r0-r12,lr} mov r0,#0x1f mov r1,#0x2f mov r2,#0x3f mov r3,#0x4f mov r4,#0x5f @出栈 恢复现常,还原模式 spsr->cpsr @lc -> pc ldmfd sp!,{r0-r12,pc}^ @mov pc,lr @中断 irq_hander: @入栈保护现场 stmfd sp!,{r0-r12,lr} @中断处理 @switch(irqnum) ldmfd sp!,{r0-r12,pc}^ .DATA buf: .space 512*3 .end
4.3.5 整装待发-链接脚本
SECTIONS { . = 0x80000, .text.boot :{*(.text.boot)} .text : {*(.text)} .rodata : {*(.rodata)} .data : {*(.data)} . = ALIGN(0x8); bss_begin = .; .bss :{*(.bss*)} bss_end = .; . = ALIGN(4096); init_pg_dir = .; += 4096; }
五、总结
从过程角度来看,本文以架构概述、架构发展、架构特性、架构演练为主线对 Arm 架构进行了启发式的介绍。从金字塔式知识结构角度来看,本文涉及到了计算机体系结构、Arm 系统架构、微架构、处理器编程模型、应用编程;从系统思维角度来看,本文只是对于读者很可能是浮光掠影,蜻蜓点水,所以后面章节会更加系统化、体系化、深入的讲述 Arm 架构。
参考
术语
图灵机
一个抽象的机器、思想模型;
总线
计算机各种功能部件之间传送信息的公共通信干线;
Trustzone
通过隔离实现可信域的技术;
Hypervisor
虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件。
皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~
“收藏夹吃灰”是学“器”练“术”非常聪明的方法,帮助我们避免日常低效的勤奋~