这里整理一些 arm64(aarch64是armv8下面的一个工作状态,一般我们将其称为arm64?)在这里不考虑 aarch32 这里的主要内容是 手册arm ARMarm ARM// cpu mmu 相关// 内存模型相关// 编程模型相关还有其他的内容,可以参考以下架构手册coresight// 调试模型相关gic// 异常模型相关smmu// dma mmu 相关generic timeramba// 内存模型相关 : cache一致性(ACE总线)
文章目录
- 市场
- SOC
- ARMv8的通用化
- 架构
- 架构版本
- 编程模型
- 执行状态(Execution state)
- aarch64指令
- aarch64寄存器
- ARMv8与ARMv7的区别
- EL0 (可以访问)(视角下)的指令及寄存器
- ABI
- FP&NEON指令集
- 异常模型
- 内存模型
- MMU
- cache
- 内存三大问题
- 缓存一致性
- 原子性
- memory order(狭义的内存一致性)
- debug模型
- External Debug
- Self-hosted Debug
- Trace & profiling
- boot 模型
- 虚拟化模型
- 安全模型
- 其他模型
- 开发工具
- gcc toolchain & gdb
- qemu
- 开发环境
- 软件开发
- 裸机(baremetal)开发
- RTOS
- linux
- arm64-linux 镜像
- arm64-linux boot 符号
- boot时的内存管理
- debug
- boot
- 架构相关代码
- 其他
- 微架构
- ref手册内容
- 指令速查卡
市场
SOC
移动端(手机)市场高通,三星,苹果,MTK,华为服务器市场
ARMv8的通用化
- x86 arm riscv 生态
- UEFI EDK II
架构
架构版本
架构有哪些armv8-a, armv8.1-a, armv8.2-aarmv8.3-a, armv8.4-a, armv8.5-aarmv8.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_EL1ID_AA64DFR0/1_EL1ID_AA64ISAR0/1_EL1ID_AA64MMFR0/1/2_EL1ID_AA64PFR0/1_EL1比如,ID_AA64MMFR2_EL1.AT表示Armv8.4-A是否支持宽松的对齐要求。
编程模型
执行状态(Execution state)
armv7有两种执行状态,arm和thumb。//cpsr 的 T// 0:arm// 1:thumb// 应该reset 是 arm 状态// 异常时,cpsr 中的 T 被置位 0 , 也就是 进入arm statearmv8有两种执行状态(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.
aarch64指令
- AARCH64 常用的指令和寄存器描述
- ARMv7/ARMv8/RV32/RV64指令集及寄存器对比
// 学习怎么看指令集1.运算算术运算整数/浮点/向量逻辑运算2.分支(程序流控制/跳转)3.访存4.系统控制异常处理原子操作fence系统寄存器访问
aarch64寄存器
通用寄存器(31个)// D1.6.1 The general purpose registers, R0-R30 P2277X0 - X30 // P99 B1.2.1 Registers in AArch64 stateSIMD&FP registers(32个+2)V0 - V31FPCR, FPSR // Two SIMD and floating-point control and status registersPC寄存器PC状态寄存器(1个) // D1.7 Process state, PSTATE P2284PSTATE特殊寄存器(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 P28171.通用系统控制寄存器2.调试寄存器3.性能监控寄存器4.活动监控寄存器5.统计扩展寄存器6.RAS寄存器7.通用定时寄存器// 特殊寄存器中的几个寄存器和 系统寄存器全部用 MSR 和 MRS 指令访问
ARMv8与ARMv7的区别
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 (可以访问)(视角下)的指令及寄存器
在EL0执行会生成UNDEFINED异常(异常后ESR_EL1.ISS为0),不建议执行ERETERETAA, ERETABHVCLDGMSMCSTGMSTZGM在 EL0 执行会生成异常,有相应用途UDFSVCBRKDCPS1在 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 stateX0-X30SP_EL0PCV0-V31FPCR, FPSRNZCVSystem registers // 后缀为_EL0的寄存器Cache ID registers Debug registersPerformance Monitors registersActivity Monitors registersThread ID registersTimer registers
ABI
- ARM64 调用约定 Procedure Call Standard AAPCS64
FP&NEON指令集
异常模型
ARMv8异常向量表
irq & fiq : 异步中断(无同步中断)
device -> GIC -> armv8 cpu armv8 cpuregister : asm volatile("msr daifclr, #0x03");GICregister : GICD->ISENABLER[M]= (0x1 << N);deviceregister :TIMER3->CURRENT_VALUE0 = 0x0FFFFFF;TIMER3->LOAD_COUNT0= 0x0FFFFFF;TIMER3->CONTROL_REG= 0x05; //auto reload & enable the timerRK3399 实例:https://github.com/hceng/RK3399/tree/master/hardware/3_irq/code
- sync : 同步异常
- error : 异步异常
内存模型
MMU
- ARMv8的MMU
- MMU开关与CACHE开关的联系
cache
- 高速缓存与一致性专栏索引
- cache 概念详解 & PoC & PoU & inner/outer cache
- ARM的缓存一致性
内存三大问题
- A.缓存一致性 B.原子性 C.memory order(内存一致性)
目前(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 和 Normal1. Device 根据 GRE 分类2. Normal 由于 有cache 分类,根据 page.SH[1:0] 分类内存屏障指令(内存屏障指令的参数 会用到 page.SH[1:0])
缓存一致性
- ARM的缓存一致性
原子性
- 参考ARMv7
memory order(狭义的内存一致性)
- 乱序和屏障1 : 总览 及 编译器内存屏障
- 乱序和屏障2 : UP单核需要处理的CPU乱序问题
debug模型
- Debug & profiling
External Debug
- debug1 : External Debug : 基于JTAG的 芯片DEBUG 文章整理
Self-hosted Debug
- debug2 : AArch64 Self-hosted Debug : [自调试]
Trace & profiling
boot 模型
- ARMv7 boot
- ARMv8 boot
虚拟化模型
- ARMv7 Virtualization
虚拟化代码跑在 EL2 , 这套代码可由 linux提供
- KVM 文章总览
安全模型
- Security
安全代码跑在 EL3 , 这套代码是独立的,不由linux提供
ARMv8 Security
TEE的由来以及TEE的概念
arm-trusted-firmware code
arm-trusted-firmware wiki
arm 安全 code 启动流程
qemu对armv8 security的支持
其他模型
- Multi-processors
- Power Management
- big.Little
开发工具
gcc toolchain & gdb
不同供应商的汇编工具 具有不同的语法.通常助记符和汇编指令是相同的,但汇编伪指令,定义,标号和只是语法有可能有差别汇编工具有两类1.ARM汇编器armasm2.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
平台信息
qemu 对 ARMv8的支持
编译qemu
开发环境
- Arm Development Studio & A64-Exercises试用报告
软件开发
裸机(baremetal)开发
rk3399 boot code 介绍 & rk3399 裸机开发
ARMv7/ARMv8/RV32/RV64裸机编程中的区别
qemu armv8_aarch64裸机工程
兼容ARMv7/ARMv8/RV32/RV64的一个裸机qemu工程
1.EL1 boot -> EL0 APP2.EL0 APP --syscall--> EL1 --eret--> EL0 APP3.external debug4.printf on uart
RTOS
ARMv8 一般不跑RTOS
linux
arm64-linux 镜像
以arm32为例,arm64类似.各个镜像解读1&解读2
以arm32为例,arm64类似.各个镜像执行结果
arm64 3种镜像(uImage/Image/FIT image)及其加载
arm64-linux boot 符号
- arm32-linux boot 符号总览
- arm64-linux boot 符号总览
boot时的内存管理
- RISC 架构 linux boot 临时页表 对比 ARM32 ARM64 RV32 RV64
debug
- gdb调试qemu virt板 arm64 linux 各个过程
boot
- linux从被加载到start_kernel
架构相关代码
其他
微架构
// ARM SOC 战略 :从 Big.LITTLE 到 三簇(大中小)Big.LITTLE: ARMv7 : 4个A15和4个A72011年,ARM公司正式宣布了ARM v8指令集2012年,推出了Cortex-A57,A53架构2015年,推出了Cortex-A72,A55A75,A55A77,A55A78,A55三簇 :Exynos 9820 : 双 Exynos M4 大核+双 A75 中核+四 A55 小核架构的三簇结构骁龙8150 : 大中小架构,不过是“1+3+4”麒麟980 : 麒麟9000: 采用1+3+4三簇8核心资料Big.LITTLEhttps://www.donews.com/article/detail/4660/29172.html三簇:https://baijiahao.baidu.com/s?id=1617524988948811428&wfr=spider&for=pchttps://baijiahao.baidu.com/s?id=1616580085082056451&wfr=spider&for=pc
- [流水线
- [多发射
ref手册内容
DDI0487E_armv8_A_architecture_reference_manual.pdfA.Armv8 Architecture Introduction and OverviewB.The AArch64 Application Level ArchitectureEL0 上的软件运行视角的架构Programmers’ Model---Memory Model ---C.The AArch64 Instruction SetEL0/1/2/3 跑的指令D.The AArch64 System Level ArchitectureEL1/2/3 上的软件运行视角的架构Programmers’ Model---Memory Model---Virtual Memory System Architecture&&&Exception Model&&&debug Model&&&Self-hosted DebugSelf-hosted TraceH.External Debug安全模型 : 无虚拟化模型 : 无E.The AArch32 Application Level ArchitectureF.The AArch32 Instruction SetsG.The AArch32 System Level ArchitectureH.External DebugI.Memory-mapped Components of the Armv8 ArchitectureJ.Architectural PseudocodeK.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