这里整理一些 arm64(aarch64是armv8下面的一个工作状态,一般我们将其称为arm64?)
在这里不考虑 aarch32
这里的主要内容是 手册 arm ARM
arm ARM
// cpu mmu 相关
// 内存模型相关
// 编程模型相关
还有其他的内容,可以参考以下架构手册
coresight
// 调试模型相关
gic
// 异常模型相关
smmu
// dma mmu 相关
generic timer
amba
// 内存模型相关 : cache一致性(ACE总线)
移动端(手机)市场
高通,三星,苹果,MTK,华为
服务器市场
架构有哪些
armv8-a, armv8.1-a, armv8.2-a
armv8.3-a, armv8.4-a, armv8.5-a
armv8.6-a, armv8.7-a //没有 armv8.8-a了
// 往下是 armv9.0-a,armv9.1-a,armv9.2-a (2022-2-10 15:57:38)
没有具体的register指示当前的CPU实现的是Armv8.x .
但有register(ID_AA64* 寄存器)可以指示当前的CPU实现了Armv8.x所支持的功能。
ID_AA64AFR0/1_EL1
ID_AA64DFR0/1_EL1
ID_AA64ISAR0/1_EL1
ID_AA64MMFR0/1/2_EL1
ID_AA64PFR0/1_EL1
比如,ID_AA64MMFR2_EL1.AT表示Armv8.4-A是否支持宽松的对齐要求。
armv7有两种执行状态,arm和thumb。
//cpsr 的 T
// 0:arm
// 1:thumb
// 应该reset 是 arm 状态
// 异常时,cpsr 中的 T 被置位 0 , 也就是 进入arm state
armv8有两种执行状态(Execution state),aarch32和aarch64
// PSTATE 的 nRW
// 0:aarch64
// 1:aarch32
// On reset into an Exception level that is using AArch64.
// On taking an exception to an Exception level that is using AArch64.
// 学习怎么看指令集
1.运算
算术运算
整数/浮点/向量
逻辑运算
2.分支(程序流控制/跳转)
3.访存
4.系统控制
异常处理
原子操作
fence
系统寄存器访问
通用寄存器(31个)// D1.6.1 The general purpose registers, R0-R30 P2277
X0 - X30 // P99 B1.2.1 Registers in AArch64 state
SIMD&FP registers(32个+2)
V0 - V31
FPCR, FPSR // Two SIMD and floating-point control and status registers
PC寄存器
PC
状态寄存器(1个) // D1.7 Process state, PSTATE P2284
PSTATE
特殊寄存器(27个)// C5.2 Special-purpose registers P347
• CurrentEL, that holds PSTATE.EL, and that software can read to determine the current Exception level.
• DAIF, that holds the current PSTATE.{D, A, I, F} interrupt mask bits.
• DIT, that holds the PSTATE.DIT bit.
• ELR_EL1, that holds the address to return to for an exception return from EL1.
• ELR_EL2, that holds the address to return to for an exception return from EL2.
• ELR_EL3, that holds the address to return to for an exception return from EL3.
• FPCR, that provides control of floating-point operation.
• FPSR, that provides floating-point status information.
• NZCV, that holds the PSTATE.{N, Z, C, V} condition flags.
• PAN, that holds the PSTATE.PAN state bit.
• SP_EL0, that holds the stack pointer for EL0.
• SP_EL1, that holds the stack pointer for EL1.
• SP_EL2, that holds the stack pointer for EL2.
• SP_EL3, that holds the stack pointer for EL3.
• SPSel, that holds PSTATE.SP, that at EL1 or higher selects the current SP.
• SPSR_abt, that holds process state on taking an exception to AArch32 Abort mode.
• SPSR_EL1, that holds process state on taking an exception to AArch64 EL1.
• SPSR_EL2, that holds process state on taking an exception to AArch64 EL2.
• SPSR_EL3, that holds process state on taking an exception to AArch64 EL3.
• SPSR_fiq, that holds process state on taking an exception to AArch32 FIQ mode.
• SPSR_irq, that holds process state on taking an exception to AArch32 IRQ mode.
• SPSR_und, that holds process state on taking an exception to AArch32 Undefined mode.
• SSBS, that holds the PSTATE.SSBS bit.
• TCO, that holds the PSTATE.TCO bit.
• UAO, that holds the PSTATE.UAO bit.
• DLR_EL0, that holds the address to return to for a return from Debug state.
• DSPSR_EL0, that holds process state on entry to Debug state
系统寄存器(7类) // D13 P2817
1.通用系统控制寄存器
2.调试寄存器
3.性能监控寄存器
4.活动监控寄存器
5.统计扩展寄存器
6.RAS寄存器
7.通用定时寄存器
// 特殊寄存器中的几个寄存器和 系统寄存器全部用 MSR 和 MRS 指令访问
ARMv7 与 ARMv8 的关系,相当于
ARMv8 包括 AARCH32 和 AARCH64
其中 AARCH32 完全兼容 ARMv7 , 可以认为 AARCH32 就是 ARMv7
其中 AARCH64 和 AARCH32(即ARMv7) 完全不同,是完全不同的两套指令集
类别 | ARMv7 | ARMv8 |
---|---|---|
工作状态 | ATM&THUMB | AARCH32&AARCH64 |
指令集 | A32&T32 | A32&T32&A64 |
调用标准 | ATPCS/AAPCS/AAPCS32 | AAPCS64 |
指令位数 | 32 | 32 |
寄存器位数 | 32 | 64 |
通用寄存器个数 | 16 | 32 |
特权级 | PL0(app)/1(os)/2(hyp)&SecurePL1 | EL0(app)/1(os)/2(hyp)/3(trust) |
异常入口 | 8个(其中一个无效) | 16个(4类,每类4个入口) |
物理内存寻址空间 | <4G | 远远大于4G |
虚拟内存地址空间 | 4G | 远远大于4G |
MMU支持页面大小 | 最大16KB | 4KB/16KB/64KB |
虚拟地址空间有效位 | 32 | 39/42/48 |
数据宽度(byte) | 8/16/32 | 8/16/32/64/128 |
是否向前兼容 | AARCH32兼容ARMv7 | AARCH64与AARCH32完全不同 |
在EL0执行会生成UNDEFINED异常(异常后ESR_EL1.ISS为0),不建议执行
ERET
ERETAA, ERETAB
HVC
LDGM
SMC
STGM
STZGM
在 EL0 执行会生成异常,有相应用途
UDF
SVC
BRK
DCPS1
在 EL0 执行会进入debug mode,有相应用途
HLT
其他 在手册中的 aarch64指令 都可以执行
1. 可能会产生 EL 切换,但不一定产生
2. 在EL0下都可被正常执行
// 在访问权限被禁用的情况下,从EL0对系统寄存器的任何访问都会导致指令表现为未定义。
// Any access from EL0 to a System register with the access right disabled causes the instruction to behave as UNDEFINED .
Registers in AArch64 state
X0-X30
SP_EL0
PC
V0-V31
FPCR, FPSR
NZCV
System registers // 后缀为_EL0的寄存器
Cache ID registers
Debug registers
Performance Monitors registers
Activity Monitors registers
Thread ID registers
Timer registers
ARMv8异常向量表
irq & fiq : 异步中断(无同步中断)
device -> GIC -> armv8 cpu
armv8 cpu
register : asm volatile("msr daifclr, #0x03");
GIC
register : GICD->ISENABLER[M] = (0x1 << N);
device
register :
TIMER3->CURRENT_VALUE0 = 0x0FFFFFF;
TIMER3->LOAD_COUNT0 = 0x0FFFFFF;
TIMER3->CONTROL_REG = 0x05; //auto reload & enable the timer
RK3399 实例:
https://github.com/hceng/RK3399/tree/master/hardware/3_irq/code
目前(2022-6-24 13:59:48) 浅显的将 除MMU外的内存问题 分为三大类问题 // 极有可能更新为N类问题
1. 缓存一致性
硬件实现体现在
MESI/SCU
ACE/CCI(CHI/CCN)
软件实现体现在
共享属性page.SH[1:0]
// 在软件上看来会影响
1.缓存到哪一个cache域
2.cache维护指令的时候会广播到哪一个cache域
3.内存屏障指令 的 广播域
cache维护指令和PoU/PoC // 在软件上看来会影响cache维护操作的域
2. 原子性
软件体现在
原子指令
3. memory order(内存一致性)
硬件体现在
TODO
// ARMv8-A-Programmer-Guide.pdf P191
//The ARMv8 architecture employs a weakly-ordered model of memory.
软件体现在
MAIR , page.AttrIndx[2:0] // 在软件上看来 会 区分 Device 和 Normal
1. Device 根据 GRE 分类
2. Normal 由于 有cache 分类,根据 page.SH[1:0] 分类
内存屏障指令(内存屏障指令的参数 会用到 page.SH[1:0])
虚拟化代码跑在 EL2 , 这套代码可由 linux提供
安全代码跑在 EL3 , 这套代码是独立的,不由linux提供
ARMv8 Security
TEE的由来以及TEE的概念
arm-trusted-firmware code
arm-trusted-firmware wiki
arm 安全 code 启动流程
qemu对armv8 security的支持
不同供应商的汇编工具 具有不同的语法.
通常助记符和汇编指令是相同的,但汇编伪指令,定义,标号和只是语法有可能有差别
汇编工具有两类
1.ARM汇编器armasm
2.gnu汇编器(主流)
gcc 的选项
-march=rv32ima
// Specify the name of the target architecture and, optionally, one or more feature modifiers.
// 对于armv8 , 可填入 armv8-a, armv8.1-a, armv8.2-a, armv8.3-a, armv8.4-a, armv8.5-a
// 对于armv7 , 可填入 armv7-a+vfpv4
// 对于riscv , 可填入 RV32IMAFDC
// 表示要生成哪一类 汇编指令
————————————————
版权声明:本文为CSDN博主「__pop_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011011827/article/details/121375243
平台信息
qemu 对 ARMv8的支持
编译qemu
rk3399 boot code 介绍 & rk3399 裸机开发
ARMv7/ARMv8/RV32/RV64裸机编程中的区别
qemu armv8_aarch64裸机工程
兼容ARMv7/ARMv8/RV32/RV64的一个裸机qemu工程
1.EL1 boot -> EL0 APP
2.EL0 APP --syscall--> EL1 --eret--> EL0 APP
3.external debug
4.printf on uart
ARMv8 一般不跑RTOS
以arm32为例,arm64类似.各个镜像解读1&解读2
以arm32为例,arm64类似.各个镜像执行结果
arm64 3种镜像(uImage/Image/FIT image)及其加载
// ARM SOC 战略 :
从 Big.LITTLE 到 三簇(大中小)
Big.LITTLE:
ARMv7 : 4个A15和4个A7
2011年,ARM公司正式宣布了ARM v8指令集
2012年,推出了Cortex-A57,A53架构
2015年,推出了Cortex-A72,A55
A75,A55
A77,A55
A78,A55
三簇 :
Exynos 9820 : 双 Exynos M4 大核+双 A75 中核+四 A55 小核架构的三簇结构
骁龙8150 : 大中小架构,不过是“1+3+4”
麒麟980 :
麒麟9000: 采用1+3+4三簇8核心
资料
Big.LITTLE
https://www.donews.com/article/detail/4660/29172.html
三簇:
https://baijiahao.baidu.com/s?id=1617524988948811428&wfr=spider&for=pc
https://baijiahao.baidu.com/s?id=1616580085082056451&wfr=spider&for=pc
DDI0487E_armv8_A_architecture_reference_manual.pdf
A.Armv8 Architecture Introduction and Overview
B.The AArch64 Application Level Architecture
EL0 上的软件运行视角的架构
Programmers’ Model ---
Memory Model ---
C.The AArch64 Instruction Set
EL0/1/2/3 跑的指令
D.The AArch64 System Level Architecture
EL1/2/3 上的软件运行视角的架构
Programmers’ Model ---
Memory Model ---
Virtual Memory System Architecture &&&
Exception Model &&&
debug Model &&&
Self-hosted Debug
Self-hosted Trace
H.External Debug
安全模型 : 无
虚拟化模型 : 无
E.The AArch32 Application Level Architecture
F.The AArch32 Instruction Sets
G.The AArch32 System Level Architecture
H.External Debug
I.Memory-mapped Components of the Armv8 Architecture
J.Architectural Pseudocode
K.Appendixes
// ARMv8-A : A64 A32 T32
// ARMv7-A : A32 T32 A16
// ARMv7-R : A32 T32 A16
// ARMv7-M : T32
// aarch64(A64) reference card
// arm32(A32) reference card
// thumb2(T32) reference card (https://wenku.baidu.com/view/9011deddce2f0066f533221c.html)
// thumb(A16) reference card
// RISC-V-Reader-Chinese-v2p1.pdf
// 64-ia-32-architectures-software-developer-vol-1-manual.pdf
// 64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf
// 64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf