「Arm Arch」 初识 Arm(下)

简介: 「Arm Arch」 初识 Arm(下)

三、架构魔法

架构魔法指的是架构特性,比如运算魔法、安全魔法、虚拟化魔法等,而这部分我们将从派系、时代、微魔法多个维度介绍这些神秘的魔法。


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


虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件。


皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~

“收藏夹吃灰”是学“器”练“术”非常聪明的方法,帮助我们避免日常低效的勤奋~

下一章 CPU微架构


相关文章
|
机器学习/深度学习 存储 监控
「Arm Arch」 初识 Arm(上)
「Arm Arch」 初识 Arm(上)
797 1
|
存储 编译器 内存技术
「Arm Arch」 ISA 寄存器
「Arm Arch」 ISA 寄存器
139 0
|
传感器 缓存 监控
「Arm Arch」 微架构
「Arm Arch」 微架构
233 0
|
存储 机器学习/深度学习 Java
「Arm Arch」 ISA 指令集
「Arm Arch」 ISA 指令集
298 0
|
传感器 缓存 虚拟化
「Arm Arch」 虚拟化微架构
「Arm Arch」 虚拟化微架构
141 0
|
存储 传感器 缓存
「Arm Arch」 调试微架构
「Arm Arch」 调试微架构
134 0
|
存储 传感器 缓存
「Arm Arch」 总线微架构
「Arm Arch」 总线微架构
159 0
|
存储 传感器 缓存
「Arm Arch」 安全微架构
「Arm Arch」 安全微架构
153 0
|
存储 程序员 编译器
「Arm Arch」 ISA 概述
「Arm Arch」 ISA 概述
286 0
|
存储 传感器 缓存
「Arm Arch」 系统微架构
「Arm Arch」 系统微架构
196 0