【ARM】A64指令介绍及内存屏障和寄存器

news2024/9/21 13:42:52

A64指令集介绍

ISA : Instruction System Architecture
在这里插入图片描述

指令集总结

在这里插入图片描述

跳转指令

使用跳转指令直接跳转,跳转指令有跳转指令B,带链接的跳转指令BL ,带状态切换的跳转指令BX。
B 跳转指令,跳转到指定的地址执行程序。
BL 带链接的跳转指令。指令将下一条指令的地址拷贝到R14(即LR)链接寄存器中,然后跳转到指定地址运行程序。
BX 带状态切换的跳转指令。跳转到Rm 指定的地址执行程序,若Rm 的位[0]为1,则跳转时自动将CPSR 中的标志T 置位,即把目标地址的代码解释为Thumb代码;若Rm 的位[0]为0,则跳转时自动将CPSR 中的标志T 复位,即把目标地址的代码解释为ARM代码
条件跳转指令 : 5个
• b.cond label
• cbz Xn|Wn, label
• cbnz Xn|Wn, label
• tbz Xn|Wn, #uimm6, label //如果Xn的第uimm的bit位位0,则跳转到label
• tbnz Xn|Wn, #uimm6, label

无条件跳转label指令 : 2个
• b label
• bl label
无条件跳转register指令 : 3个
• br Xn
• blr Xn
• ret {Xn}

PC相对寻址

读取 PC 的方法是:PC 相对地址的指令(ADR, ADRP, literal load, and direct branches),以及branch-and-link指令(BL 和 BLR)会将PC地址存储在LR寄存器
• 修改程PC的方法是:
使用显式控制流指令:条件分支、无条件分支、异常生成和异常返回指令

• ADR指令
使用格式:adr register exper
编译时,首先会计算出当前PC到exper的偏移量#offset_to_exper
然后会用ADD或SUB指令,来替换这条指令;例如等效于:ADD register,PC,#offset_to_exper,register就是exper的地址;

• ADRP指令
使用格式:adrp register exper。编译时,首先会计算出当前PC到exper的偏移量#offset_to_exper,pc的低12位清零,然后加上偏移量,给register得到的地址,是含有label的4KB对齐内存区域的base地址;

系统操作指令

cache操作

在这里插入图片描述

地址翻译

在这里插入图片描述
在这里插入图片描述

内存访问指令

• Load-Store Single Register 单寄存器读写
• Load-Store Single Register (unscaled offset) offset为-256 ~ +256对齐读写
• Load Single Register (pc-relative, literal load)
• Load-Store Pair 双寄存器读写
• Load-Store Non-temporal Pair 直接读写外存,跳过cache
• Load-Store Unprivileged 以EL0身份读写
• Load-Store Exclusive 独占访问指
• Load-Acquire / Store-Release – 单项屏障指令-One-way barriers
• Prefetch Memory

Load-Store Single Register 单寄存器读写

• LDR Wt, addr //从由 addr 寻址的内存中加载一个字到 Wt
• LDR Xt, addr
• LDRB Wt, addr //从由 addr 寻址的内存中加载一个字节到 Wt,然后zero-extends it to Wt
• LDRSB Wt, addr //从由 addr 寻址的内存中加载一个字节到 Wt, 然后sign-extends it into Wt
• LDRSB Xt, addr //从由 addr 寻址的内存中加载一个字节到 Wt,然后zero-extends it to Xt
• LDRH Wt, addr //从 addr 寻址的内存中加载一个半字,然后将其零扩展到 Wt
• LDRSH Wt, addr //从 addr 寻址的内存中加载一个半字,然后将其符号扩展为 Wt。
• LDRSH Xt, addr //从由 addr 寻址的内存中加载一个半字,然后进行符号扩展它变成了 Xt。
• LDRSW Xt, addr //从由 addr 寻址的内存中加载一个字,然后将其符号扩展为Xt。
• STR Wt,addr //将 Wt 中的字存储到由 addr 寻址的内存中。
• STR Xt, addr //将来自 Xt 的双字存储到由 addr 寻址的内存中。
• STRB Wt,addr //将字节从 Wt 存储到由 addr 寻址的内存中。
• STRH Wt, addr //将来自 Wt 的半字存储到由 addr 寻址的内存中
• ldr{} Rd,
• str{} Rd,
• : b h sb sh sw

Load-Store Non-temporal Pair

直接读写外存,跳过cache
ldnp{} Rd,
• stnp{} Rd,
• : b h sb sh sw

Load-Store Unprivileged 以EL0身份读写

ldtr{} Rd,
• sttr{} Rd,
• : b h sb sh sw

Load-Store Exclusive 独占访问指令

• ldxr{} Rd,
• stxr{} Ws , Rd,
• ldxp{} Rd,
• stxp{} Ws, Rd,
• : b h sb sh sw

LDXR Wt, [base{,#0}]
(1)、从base地址处读取一个数字,存放到Wt寄存器中;
(2)、将Monitor变成exclusive状态

STXR Ws, Wt, [base{,#0}]
(1)、将Wt中的数据写入到base地址处,如果成功Ws返回0,否则返回1;
(2)、将Monitore从exclusive状态切换成open, 如果切换成功,则说明写入成功,Ws返回0;
如果切换失败,则数据不会写入到内存,Ws返回1

Load-Acquire / Store-Release – 单项屏障指令-One-way barriers

在这里插入图片描述
(Non-exclusive)
ldar{} Rd,
stlr{} Rd,

(exclusive)
ldaxr{} Rd,
stlxr{} Rd,
: b h sb sh sw

• 所有在LDAR之后的加载和存储指令,必需在LDAR之后才能被观察到
• 所有在STLR之前的加载和存储指令,必需在STLR之前观察到

数据操作指令

Data Processing (immediate)
• Arithmetic (immediate) 算数运算 : add、sub、cmp、cmn、mov
• Logical (immediate) 逻辑运算 : and eor orr movi tst
• Move (immediate) : mov movz movn movk
• Bitfield (operations) 位操作 : bfm sbfm ubfm bfe bfxil sbfiz sbfx ubfiz ubfx
• Shift (immediate) : asr lsl lsr ror
• Sign/zero extend : sxt uxt
• Data Processing (register)

Arithmetic (shifted register) : add sub cmn cmp neg
• Arithmetic (extending register) : add sub cmn cmp
• Logical (shifted register) : and bic eon eor orr orn mov mvn tst
• Shift (register) : asrv lslv lsrv rorv asr lsl lsr
• Bitwise operations : cls clz rbit rev rev16 rev32

算术操作

在这里插入图片描述

• add 加,
• adc 带进位的加,
• sub 减,
• sbc 带进位的减,
• neg 取反
• ngc 带进位的取反

逻辑操作

在这里插入图片描述
• and Bitwise AND
• bic Bitwise Bit Clear,
• eor Bitwise Exclusive OR,
• eon Bitwise Exclusive OR NOT,
• orr Bitwise OR,
• orn Bitwise OR NOT, and
• mvn Bitwise NO

数据移动操作

在这里插入图片描述

• mov Move,
• movz Move wide with zero,
• movn Move wide with NOT, and
• movk Move wide with keep

移位操作

• asr Arithmetic shift right,
• lsr Logical shift right, and
• lsl Logical shift left,
• ror Rotate right.

指令流水线

一般是三级指令流水线,第一级是Fetch,第二级是Decode,第三级是Issue。即取值、译码、发射。
对于ARM的AArch64,所有的cpu在取值和译码时都是顺序执行的,在发射时可能是乱序的。
在这里插入图片描述
• in-order:顺序流水线, 是指处理器按照它们在内存中出现的顺序发出指令(issue)。下一条指令不会早于上一条指令发出,但是如果是多pipeline的,那么一次还是可以发送多条指令的。所以即使它是顺序的还有可能第二条的load早于第一条的load。
• out-of-order: 乱序流水线, 是指处理器可以不按照指令在内存中的顺序发出(issue)指令。

Dual-pipeline 和 single-pipeline

Dual-pipeline的意思是每个pipeline上有两个,就如上图所示,如果是Dual-pipeline那么就会有两个load或者两个其他的。现在大多是都是single-pipeline,不理解也没关系。

in-order和out-of-order的执行原理

in-orde

顺序执行
在这里插入图片描述

IF:取值
D:译码
E:执行
M:访问内存
WB:写回,此时执行结束
上图的三条指令都是按顺序执行的,第一条去完指令之后,第二条才开始取值,然后第三条取值,然后依次进行下一步,在WB时也一样,先第一条执行,然后后面指令再依次执行,一步一步按顺序执行。

out-of-order

乱序执行
在这里插入图片描述
在这张图的三条指令中,在第一条指令未执行结束时,第二条指令就已经WB执行结束了。此时第一条指令还没执行完成,但是第三条指令又开始执行WB,接着第三条指令也执行结束,最后第一条指令执行完毕,这就是乱序执行。

DMB/DSB/ISB的介绍

由于很多处理器都是 Out-of-order execution(乱序执行)和 speculative execution(推测执行), 所以也意味着你的访问内存可能没有按照程序顺序进行 。 在大多数的情况下,我们都无需关心访问的顺序,但有些情况下却是不得不考虑,例如:
• 在不同的threads/cores之间共享数据
• 传递数据给peripherals, 如DMA操作
• 修改指令所在的内存,如load一个程序到RAM
• 修改内存管理方案,如context switching
(以上总结为: 不同observer之间共享数据时,需使用barries指令)

DMB– Data Memory Barrier:数据内存屏障,确保位于 “DMB 指令前的所有显式内存访问” 早于 " DMB 指令后的显示内存访问"( 注意:data cache的操作也被看做是显示的访问)。
DSB – Data Synchronization Barrier:数据同步屏障。
(1)位于此指令前的所有显式内存访问均完成。
(2)位于此指令前的所有缓存、跳转预测和 TLB 维护操作全部完( 注意:cache/TLB/branch的维护操作如果广播,那么要等待广播的完成)。
ISB – Instruction Synchronization Barrier:指令同步屏障。确保提取时间晚于 ISB 指令的指令能够检测到 ISB 指令执行前就已经执行的上下文更改操作的执行效果。

barries限定符

在这里插入图片描述
Load-Load/store:表示barries仅影响load,所有在barries之后的load/store,必须等待barries之前的load
Store-Store:表示barries仅影响store
Any-Any:表示既影响store,也影响load

one-way barries

LDR:后面的指令不能跑前面去,但是前面指令可以去后面,是单向的。
STR:前面的指令不能跑后面去,但是后面的指令可以去前面

ISB

Context‐changing 操作:
• Cache、TLB、分支预测维护操作
• 系统寄存器的改变(如 SCTLR_EL1,TCR_EL1、TTBRn_EL1…)

Context‐changing只有在下面事件之后才会被确认:
• taking一个异常
• 退出一个异常
• ISB

Instruction Synchronization Barrier (ISB)
• 确保ISB之后的指令 可以看到 ISB之前的Context‐changing
• 确保ISB之后的Context‐changing,仅影响ISB之后的指

内存属性:Device memory

Device-nGnRnE : 处理器必须严格按照代码中内存访问来进行、必须严格执行program order(无需重排序)、写操作的ack必须来自最终的目的地
Device-nGnRE : 处理器必须严格按照代码中内存访问来进行、必须严格执行program order(无需重排序)、写操作的ack可以来自中间的write buffer
Device-nGRE : 处理器必须严格按照代码中内存访问来进行、内存访问指令可以进行重排、写操作的ack可以来自中间的write buffer
Device-GRE : 处理器对多个memory的访问是否可以合并、内存访问指令可以进行重排、写操作的ack可以来自中间的write buffer
➨Gathering和non Gathering(G or nG):表示对多个memory的访问是否可以合并,如果是nG,表示处理器必须严格按照代码中内存访问来进行,不能把两次访问合并成一次。例如:代码中有2次对同样的一个地址的读访问,那么处理器必须严格进行两次read transaction
➨Reordering(R or nR):表示是否允许处理器对内存访问指令进行重排。nR表示必须严格执行program order
➨Early Write Acknowledgement(E or nE):PE访问memory是有问有答的(更专业的术语叫做transaction),对于write而言,PE需要write ack操作以便确定完成一个write transaction。为了加快写的速度,系统的中间环节可能会设定一些write buffer。nE表示写操作的ack必须来自最终的目的地而不是中间的write buffer

ARM架构中的寄存器

在这里插入图片描述
**寄存器的分类:**通用寄存器,状态寄存器,控制寄存器,特殊用途寄存器,系统寄存器。在 ARM 架构中,寄存器是 CPU 内部用于存储数据、地址和状态信息的关键组件。

通用寄存器

通用寄存器是一组用于存储数据和地址的寄存器。在 ARM 架构的不同版本中,这些寄存器的数量和命名有所不同。
R0-R15 (R0-R14 + PC):
在 ARMv7 和之前的版本中,有 16 个通用寄存器,编号从 R0 到 R15。
R0 到 R14 用于存储数据和地址。
R15 通常被称为程序计数器(PC),用于存储下一条指令的地址。
X0-X30 (X0-X29 + SP):
在 ARMv8 和之后的版本中,有 31 个通用寄存器,编号从 X0 到 X30。
X0 到 X29 用于存储数据和地址。
X30 通常被称为链接寄存器(LR),用于保存返回地址。
X31 通常被称为堆栈指针(SP),用于管理堆栈。

状态寄存器

状态寄存器用于存储 CPU 的状态信息,例如标志位、中断使能状态等。
Program Status Register (PSR):
PSR 是 ARM 架构中的一个重要的状态寄存器,包含了多个子寄存器,用于存储 CPU 的状态信息。
PSR 包括:
Application Program Status Register (APSR): 用于存储条件码标志位(如 N、Z、C、V 等)。
Implementation-defined Program Status Register (IPSR): 用于指示当前正在处理的中断。
Program Status Register (EPSR): 用于存储控制位,如中断使能位。

IPSR 用于指示当前正在处理的中断。
当 CPU 正在处理中断时,IPSR 中包含了中断的编号
当没有正在处理的中断时,IPSR 的值为 0。

I (Interrupt Disable): 如果置位,则禁用所有中断。
F (Fast Interrupt Disable): 如果置位,则禁用快速中断。
在这里插入图片描述
N (Negative): 如果最近的算术运算结果的最高位为 1,则置位。
Z (Zero): 如果最近的算术运算结果为 0,则置位。
C (Carry): 如果最近的算术运算产生了进位,则置位。
V (Overflow): 如果最近的算术运算产生了溢出,则置位。

控制寄存器

控制寄存器用于控制 CPU 的行为,如中断控制、调试控制等。
Control Register (CTRL): 用于控制某些 CPU 特性,如是否启用调试模式等。
Auxiliary Control Register (ACTLR): 用于控制辅助特性,如性能监控单元(PMU)等

特殊用途寄存器

除了通用寄存器和状态寄存器之外,ARM 架构还包括一些特殊用途的寄存器。

Stack Pointer (SP): 用于管理堆栈,通常映射到通用寄存器 X31/R13。
Link Register (LR): 用于保存返回地址,通常映射到通用寄存器 X30/R14。
Program Counter (PC): 用于存储下一条指令的地址,通常映射到通用寄存器 X15/R15。
System Register (SYSREG): 用于控制和监视 CPU 的各种特性和状态,如中断控制、缓存控制等。

SP 用于指示当前堆栈的顶部位置。
在函数调用期间,参数、局部变量以及返回地址都会被压入堆栈。
SP 的值会随着堆栈操作的变化而更新。

ARMv7 架构中的寄存器

在 ARMv7 架构中,有 16 个通用寄存器,编号从 R0 到 R15。这些寄存器主要用于存储数据、地址以及程序计数器等。

R0-R14:这些寄存器可以用于存储数据、地址等。它们在函数调用和数据处理中非常有用。
R0 到 R3 通常用于函数调用中的参数传递。
R4 到 R11 通常用于局部变量或函数内部使用的寄存器。
R12 通常用作临时寄存器或用于保存跨函数调用的数据。
R13 通常称为堆栈指针(SP),用于管理堆栈。
R14 通常称为链接寄存器(LR),用于保存返回地址。
R15 (PC):R15 通常称为程序计数器(PC),用于存储下一条指令的地址。

ARMv8 架构中的寄存器

在 ARMv8 架构中,通用寄存器的数量增加到了 31 个,编号从 X0 到 X30。此外,还引入了 32 位和 64 位寄存器的区分,分别称为 X 寄存器和 W 寄存器。

X0-X29:这些寄存器可以用于存储数据、地址等。它们在函数调用和数据处理中非常有用。
X0 到 X3 通常用于函数调用中的参数传递。
X4 到 X29 通常用于局部变量或函数内部使用的寄存器。
X30 通常称为链接寄存器(LR),用于保存返回地址。
X31 通常称为堆栈指针(SP),用于管理堆栈。
W0-W29:这些寄存器是 X0 到 X29 的低 32 位版本,用于兼容 32 位应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET周刊【9月第3期 2024-09-15】

国内文章 关于.NET在中国为什么工资低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中国开发者的薪资偏低,主要因市场需求、技术栈选择和企业文化等因素所致。历史上,.NET曾因微软的闭源策略发展受限,尽管后来推出了跨平…

传输层协议 —— TCP协议(下篇)

目录 0.前言 1.流量控制 什么是流量控制? 如何做到流量控制? 窗口探测 PSH标志位与流量控制 一个问题 2.滑动窗口 为什么要有滑动窗口? 滑动窗口在哪? 滑动窗口到底是什么? 滑动窗口的工作原理 滑动窗口中…

Java——认识String类

在 C 语言中已经涉及到字符串了,但是在 C 语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字 符串应用又非…

【射频通信电子线路基础第五讲】噪声、噪声系数和灵敏度

一、噪声 确定信号对应的是干扰,而随机信号对应的是噪声,噪声又分为系统内部的噪声和外部对系统的噪声。 1、电阻热噪声 (1)无源有耗网络的热噪声 (2)热噪声通过线性网络 (3)等效噪…

酷炫航模飞手飞行技术详解

在无人机与航模的广阔世界里,成为一名技艺高超的飞手,不仅需要对飞行器有深入的理解,还需掌握一系列精湛的飞行技巧。本文将从基础飞行技巧、特技飞行动作、FPV第一人称视角、安全飞行要点、设备调试与维护,以及实战应用与拓展六个…

2024 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|高速公路应急车道启用建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! CS团队倾注了大量时间和心血,深入挖掘解…

深度学习--从零实现线性回归【数据流水线+模型+损失函数+小批量梯度下降】

代码来源于动手学深度学习pytorch版,感兴趣的同学可以自行购买观看。本节内容带着大家了解深度学习框架底层实现逻辑,如何自定义模型,自定义层或自定义损失函数,方便大家后续使用深度学习框架时候能够明白一些基本函数的实现过程&…

C语言——————结构体

前言: 我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在实际问题中有时候我们需要几种数据类型一起来修饰某个变量。 例如一个学生的信息就…

2024 “华为杯” 中国研究生数学建模竞赛(F题)深度剖析|X射线脉冲星光子到达时间建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! CS团队倾注了大量时间和心血,深入挖掘解…

如何成为信息安全等级测评师?具体有哪些要求?

给大家的福利,点击下方蓝色字 即可免费领取↓↓↓ 🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 文章目录 前言 信息安全等级测评师 定义与作用:证书颁发:能力要求&#x…

2024 “华为杯” 中国研究生数学建模竞赛(C题)深度剖析|数据驱动下磁性元件的磁芯损耗建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! CS团队倾注了大量时间和心血,深入挖掘解…

植保无人机是朝阳产业还是夕阳产业?

植保无人机产业是朝阳产业还是夕阳产业,可以从多个维度进行分析: 一、市场需求与增长趋势 市场需求:随着农业现代化的推进和劳动力成本的上升,植保无人机因其高效、安全、节省农药等优势,在农业生产中的应用越来越广…

Spring Boot赋能高校心理健康教育

1绪 论 1.1研究背景 随着计算机和网络技术的不断发展,计算机网络已经逐渐深入人们的生活,网络已经能够覆盖我们生活的每一个角落,给用户的网上交流和学习提供了巨大的方便。 当今社会处在一个高速发展的信息时代,计算机网络的发展…

【Python】探索 Errbot:多功能聊天机器人框架

不是旅行治愈了你,是你在路上放过了自己。 在当今的数字化时代,聊天机器人已成为企业与客户互动、提升工作效率和增加乐趣的重要工具。Errbot是一个高度可扩展的聊天机器人框架,它允许开发者使用Python轻松创建和定制机器人。本文将介绍Errb…

【linux008】目录操作命令篇 - rmdir 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 rmdir 是 Linux 系统中的一个命令,用于删除空目录。它只能删除 空目录,如果目录中存在文件或子目录,则无法删除。 1、基本用法 rmdir [选项] 目录名...2、常见选项 -p, --parents&…

1.4 MySql配置文件

既然我们开始学习数据库,就不能像大学里边讲数据库课程那样简单讲一下,增删改查,然后介绍一下怎么去创建索引,怎么提交和回滚事务。我们学习数据库要明白怎么用,怎么配置,学懂学透彻了。当然MySql的配置参数…

关于群里脱敏系统的讨论2024-09-20

群里大家讨论脱敏系统,傅同学:秦老师,银行数据脱敏怎么做的,怎么存储的? 采购了脱敏系统,一般是硬件(厂商直接卖的一体机)。这个系统很复杂,大概卖50-100万一台。 最核…

为什么消费还能返利?2024年全新返利模型!

在当今竞争激烈的电商市场中,一种名为“循环购”的创新商业模式正悄然兴起,以其独特的消费返利机制和积分体系,为消费者带来了前所未有的购物体验 一、循环购模式:消费即投资的智慧选择 循环购模式并非简单的消费行为&#xff0c…

MySQL | 知识 | 从底层看清 InnoDB 数据结构

文章目录 一、InnoDB 简介InnoDB 行格式COMPACT 行格式CHAR(M) 列的存储格式VARCHAR(M) 最多能存储的数据记录中的数据太多产生的溢出行溢出的临界点 二、表空间文件的结构三、InnoDB 数据页结构页页的概览Infimum 和 Supremum使用Page Directory页的真实面貌 四、B 树是如何进…

重生奇迹MU 强化玩法套路多 极品装备由你打造

欢迎来到重生奇迹MU的强化玩法指南!想要打造极品装备吗?不可错过这篇文章,我们将为您揭开最多套路的强化技巧和窍门,帮您节省时间和资源,并带来最高效的升级结果。无论您是新手还是老玩家,本文适合所有级别…