第一章 启发式 Arm 架构解读
第二章 CPU微架构
第三章 系统微架构
第四章 总线微架构
第五章 监控微架构
第六章 安全微架构
第七章 虚拟化微架构
第八章 Armv9-A 架构
第九章 Armv8-M 架构
第十章 Armv8-R 架构
第十一章 Cortex-A715 解读
第十二章 Cortex-X3 解读
第十三章 Neoverse 解读
第十四章 Cortex-M85 解读
第十五章 Cortex-R82 解读
目录
前言
一、架构概述
1.1 冯诺依曼架构
1.2 哈佛架构
1.3 Arm 架构
二、架构图谱
2.1 三驾马车
2.2 六代传承
2.3 最新成员
2.3.1 大师兄 Cortex-A710
2.3.2 二师弟 Cortex-R82
2.3.3 小师妹 Cortex-M85
2.4 架构宗亲
2.4.1 图形处理器单元 GPU
2.4.2 神经网络处理器单元 NPU
三、架构魔法
3.1 派系
3.1.1 Cortex-A 魔法
3.1.2 Cortex-R 魔法
3.1.3 Cortex-M 魔法
3.2 时代
3.3 微魔法
四、架构演练
4.1 大集结
4.2 排兵布阵
4.3 运筹帷幄,决胜千里之外
4.3.1 上传下达-控制台输出
4.3.2 烽火通信-LED 跑马灯
4.3.3 密令签发-加密
4.3.4 粮草先行-启动代码
4.3.5 整装待发-链接脚本
五、总结
参考
CPU 微架构 | 实现指令集架构的中央运算单元架构,A、R、M系列架构描述的就是 CPU 架构 |
系统微架构 | 为了处理器各个组件能够正常运行而存在的系统组件架构 |
总线微架构 | 将各个架构子系统连接起来的桥梁架构 |
监控微架构 | 对系统各个架构组件进行调试、跟踪 |
安全微架构 | 用来实现系统安全的架构集合 |
虚拟化微架构 | 用来对硬件资源进行虚拟化的架构集合 |
每个架构家族演进既有独立性又有关联性。目前 A 系列已经演化到 Armv9 版本、M 系列演化到 Armv8 版本、R系列演化到 Armv8 版本,下面是每个家族代表性处理器的架构。
Cortex-A710 是 Cortex-A78 的增强版,Armv9-A 架构的大核架构,使用起来和上一代基本相同,新的微架构能获得更好的性能和更低的功耗;增强版的向量计算扩展架构 SVE2 支持;高级 SIMD&DSP 的 NEON 架构支持;兼容 VFPv3 向量浮点的 FPU 浮点架构。
Cortex-R82 是 R 系列最新的处理器,采用 Armv8 架构,包含 CoreSgiht MDT、GIC、FPU、TCM、SCU、ACP、AXI-S、AXI-M、LLPP、LLRAM 等微架构。
M85 是 Armv8.1-M 架构,包括 MPU、Helium、PMU、CP、FPU、TCM、AHB、DSP、ETM、PACBTI、APH 等微架构。
本文讲述的 Arm 架构指的是通用处理器架构,并不包含专业处理器。除了通用处理器,Arm 还有图形处理器和神经网络处理器。
GPU 架构分为传统的 Mali 架构和最新的 Immortalis 架构两个分支:
更多GPU架构知识,参考 Arm GPUs
Ethos - NPUs 是Arm推出的基于神经网络的机器学习芯片架构,包括 U55、U65、 N78,
更多 NPU 知识,参考 Arm NPUs
架构魔法指的是架构特性,比如运算魔法、安全魔法、虚拟化魔法等,而这部分我们将从派系、时代、微魔法多个维度介绍这些神秘的魔法。
魔法8.0(Armv8.0-A)
魔法8.1(Armv8.1-A)
魔法8.2(Armv8.2-A)
魔法8.3(Armv8.3-A)
魔法8.4(Armv8.4-A)
魔法8.5/9.0(Armv8.5-A/Armv9.0-A)
魔法8.6/9.1(Armv8.6-A/Armv9.1-A)
魔法8.7/9.2(Armv8.7-A/Armv9.2-A)
魔法8.8/9.3(Armv8.8-A/Armv9.3-A)
第七代魔法(Armv7-R)
第八代魔法(Armv8-R)
第八代魔法(Armv8.0-M)
第八代魔法v1(Armv8.1-M)
LoB/Loop Tail Predication/BF
Security
2022 | A-PROFILE 2022 |
2021 | A-PROFILE 2021 |
2020 | A-PROFILE 2020 |
2019 | - |
2018 | A-PROFILE 2018 |
2017 | A-PROFILE 2017 |
2016 | A-PROFILE 2016 |
2015 | A-PROFILE 2015 |
2014 | A-PROFILE 2014 |
NEON | 整数向量运算 |
VFP | 浮点向量运算 |
SVE | 变长向量扩展运算 |
查看ID_AA64xxxx系列寄存器识别当前 CPU 实现的架构特性。
随着时间的推移和需求变化,各个产品家族都演化出了多个成员,其中 Cortex-A 系列处理器从 A5到 A715 共发布了24款,Cortex-M 系列处理器从 M0 到 M85 共发布了11款,Cortex-R 系列处理器从 R4 到 R82 共发布了11款,对于各个处理器之间的差异,可以从下面链接表格中看到。
不同的处理器可处理不同的应用。
在可穿戴方面,主要用 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 (传感器中枢)的芯片领域。
/*Hello world*/
#include
int main()
{
printf("Hello World\n");
return 0;
}
#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;
}
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 );
}
.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
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微架构