ARMv8 ARM64 架构 整体介绍

这里整理一些 arm64(aarch64是armv8下面的一个工作状态,一般我们将其称为arm64?)
在这里不考虑 aarch32 
这里的主要内容是 手册  arm ARM
arm ARM
	// cpu mmu 相关
	// 内存模型相关
	// 编程模型相关

还有其他的内容,可以参考以下架构手册
coresight
	// 调试模型相关
gic
	// 异常模型相关
smmu
	// dma mmu 相关
generic timer
amba
	// 内存模型相关 : 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-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是否支持宽松的对齐要求。


编程模型

执行状态(Execution state)

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.

aarch64指令

  • AARCH64 常用的指令和寄存器描述
  • ARMv7/ARMv8/RV32/RV64指令集及寄存器对比
// 学习怎么看指令集

1.运算
	算术运算
		整数/浮点/向量
	逻辑运算
2.分支(程序流控制/跳转)
3.访存
4.系统控制
	异常处理
	原子操作
	fence
	系统寄存器访问

aarch64寄存器

通用寄存器(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 指令访问

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),不建议执行
	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
 

ABI

  • ARM64 调用约定 Procedure Call Standard AAPCS64

FP&NEON指令集

异常模型

  • 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
	
  • 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 和 Normal
				1. 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汇编器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

  • 平台信息

  • 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 APP
2.EL0 APP --syscall--> EL1 --eret--> EL0 APP
3.external debug
4.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个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

  • [流水线
  • [多发射

ref手册内容

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

你可能感兴趣的:(ARMv8,ARM64,armv8)