ARMv8 ARM64 架构 整体介绍

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

还有其他的内容,可以参考以下架构手册
coresight
	// 调试模型相关
gic
	// 异常模型相关
smmu
	// dma mmu 相关
generic timer
amba
	// 内存模型相关 : cache一致性(ACE总线)

市场

SOC

移动端(手机)市场
	高通,三星,苹果,MTK,华为
服务器市场
	

ARMv8的通用化

架构

架构版本

架构有哪些
	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指令

// 学习怎么看指令集

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) 完全不同,是完全不同的两套指令集
类别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),不建议执行
	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

FP&NEON指令集

异常模型

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

cache

内存三大问题

目前(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])
缓存一致性
原子性
memory order(狭义的内存一致性)

debug模型

External Debug

Self-hosted Debug

  • debug2 : AArch64 Self-hosted Debug : [自调试]

Trace & profiling

boot 模型

虚拟化模型

虚拟化代码跑在 EL2 , 这套代码可由 linux提供

安全模型

安全代码跑在 EL3 , 这套代码是独立的,不由linux提供

其他模型

开发工具

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

开发环境

软件开发

裸机(baremetal)开发

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 镜像

arm64-linux boot 符号

boot时的内存管理

debug

boot

架构相关代码

其他

微架构



// 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
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
armv8/armv9架构是英国ARM公司推出的一种指令集架构,用于开发低功耗、高性能的处理器。它广泛应用于各种移动设备、嵌入式系统和物联网设备中。 入门armv8/armv9架构时,首先需要了解它的基本特点。相较于之前的armv7架构armv8/armv9架构引入了64位指令集,支持更大的物理内存寻址和更高的数据通路,提供更高的性能和更多的扩展性。 其次,了解基本的指令集是很重要的。armv8/armv9架构支持基本的寄存器操作、算术和逻辑指令,以及访问内存和外设的指令。掌握这些指令的使用方法,可以进行基本的程序开发和调试。 此外,理解处理器的特殊功能模块也是入门的一部分。比如,了解浮点单元(FPU)的使用可以提升浮点运算的性能,了解向量处理单元(NEON)可以加速数据密集型计算。 此外,还需要学习汇编语言的基本知识。armv8/armv9架构使用汇编语言来编写底层的程序,可以更好地优化代码,提高性能和功耗效率。学习汇编语言可以帮助开发者更好地理解底层原理,编写高效的代码。 最后,掌握相关的开发工具和调试工具也是入门的一部分。armv8/armv9架构有很多开发工具和调试工具可供选择,如GCC编译器、GDB调试器等。熟悉这些工具的使用方法,可以方便开发和调试程序。 总之,入门armv8/armv9架构需要了解其基本特点、指令集、特殊功能模块、汇编语言和开发工具。通过不断实践和学习,逐渐掌握这些知识和技能,可以进行更深入的armv8/armv9架构开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值