这里整理一些 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) 完全不同,是完全不同的两套指令集
类别ARMv7ARMv8
工作状态ATM&THUMBAARCH32&AARCH64
指令集A32&T32A32&T32&A64
调用标准ATPCS/AAPCS/AAPCS32AAPCS64
指令位数3232
寄存器位数3264
通用寄存器个数1632
特权级PL0(app)/1(os)/2(hyp)&SecurePL1EL0(app)/1(os)/2(hyp)/3(trust)
异常入口8个(其中一个无效)16个(4类,每类4个入口)
物理内存寻址空间<4G远远大于4G
虚拟内存地址空间4G远远大于4G
MMU支持页面大小最大16KB4KB/16KB/64KB
虚拟地址空间有效位3239/42/48
数据宽度(byte)8/16/328/16/32/64/128
是否向前兼容AARCH32兼容ARMv7AARCH64与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