【ARMv8 编程】A64 系统控制和其他指令

news2025/1/2 4:26:55

A64 指令集包含与以下相关的指令:

  • 异常处理。
  • 系统寄存器访问。
  • 调试。
  • 提示指令,在许多系统中都有电源管理应用程序。

一、异常处理指令

存在三个异常处理指令,其目的是引发异常。这些用于调用在操作系统(EL1)、Hypervisor(EL2)或安全监视器(EL3) 中以更高异常级别运行的代码:

SVC #imm16 // Supervisor 调用,允许应用程序调用内核(EL1)。

HVC #imm16 // Hypervisor 调用,允许操作系统代码调用 hypervisor(EL2)。

SMC #imm16 // 安全监视器调用,允许操作系统或 hypervisor 调用安全监视器(EL3)。

立即值可用于异常“综合症”寄存器中的处理程序。这和 ARMv7 不同,在 ARMv7 中,必须通过读取调用指令的操作码来确定立即值。

要从异常中返回,请使用 ERET 指令。该指令通过将 SPSR_ELn 复制到 PSTATE 并分支到 ELR_ELn 中保存的返回地址来恢复处理器状态。

二、访问系统寄存器指令

为系统寄存器访问提供了两条指令:

MRS Xt, <system register> // 这会将系统寄存器复制到通用寄存器中
MSR <system register>, Xt // 这将通用寄存器复制到系统寄存器中

2.1 MRS

将系统寄存器移动到通用寄存器允许 PE 将 AArch64 系统寄存器读取到通用寄存器中。

在这里插入图片描述

MRS <Xt>, (<systemreg>|S<op0>_<op1>_<Cn>_<Cm>_<op2>)

<Xt> 是通用目标寄存器的 64 位名称,在“Rt”字段中编码。

<systemreg> 是一个系统寄存器名,编码在“o0:op1:CRn:CRm:op2”中。系统寄存器名称在系统寄存器 XML 的“AArch64 系统寄存器”中定义。

<op0> 是一个无符号立即数,编码为“o0”:

o0op0
02
13

<op1> 是一个 3 位无符号立即数,范围为 0 到 7,在“op1”字段中编码。

<Cn> 是名称“Cn”,“n”的范围为 0 到 15,在“CRn”字段中编码。

<Cm> 是名称“Cm”,“m”的范围为 0 到 15,编码在“CRm”字段中。

<op2> 是一个 3 位无符号立即数,范围为 0 到 7,在“op2”字段中编码。

下面是使用 MRS 指令的例子:

    long long int x = 0;
    long long int y = 0;
    long long int z = 0;
    LOGD("x=%llx y=%llx z=%llx", x, y, z);
    asm volatile(
        "MOV X0, #2\n"
        "SUBS X0, X0, #1\n"
        "MRS %x[x], NZCV\n"
        "SUBS X0, X0, #1\n"
        "MRS %x[y], NZCV\n"
        "MRS %x[z], CNTFRQ_EL0\n"
    :[x] "+r"(x),
     [y] "+r"(y),
     [z] "+r"(z)
    :
    : "cc", "memory");

    LOGD("-----------------------------");
    LOGD("x=%llx y=%llx z=%llx", x, y, z);

NZCV —— PSTATE.{N, Z, C, V} 域可以在 EL0 访问。所有其他 PSTATE 字段都可以在 EL1 或更高级别执行,并且在 EL0 是未定义的。

CNTFRQ_EL0 —— 计数型计时器的频率寄存器(上报系统计时器的频率)

运行结果如下:

2023-05-09 07:33:57.504 8036-8152/com.demo.myapplication D/NativeCore: x=0 y=0 z=0
2023-05-09 07:33:57.504 8036-8152/com.demo.myapplication D/NativeCore: -----------------------------
2023-05-09 07:33:57.504 8036-8152/com.demo.myapplication D/NativeCore: x=20000000 y=60000000 z=1d4c00

2.2 MSR(立即数)

将立即值移动到特殊寄存器将立即值移动到 PSTATE 的选定位。该指令可以写入的位是:

  • PSTATE.D、PSTATE.A、PSTATE.I、PSTATE.F 和 PSTATE.SP。

  • 如果实现了 FEAT_SSBS,包括 PSTATE.SSBS。

  • 如果实现了 FEAT_PAN,包括 PSTATE.PAN。

  • 如果实现了 FEAT_UAO,包括 PSTATE.UAO。

  • 如果实现了 FEAT_DIT,包括 PSTATE.DIT。

  • 如果实现了 FEAT_MTE,包括 PSTATE.TCO。

  • 如果实现了 FEAT_NMI,包括 PSTATE.ALLINT。

  • 如果实现了 FEAT_SME,包括 PSTATE.SM 和 PSTATE.ZA。

  • 如果实现了 FEAT_EBEP,包括 PSTATE.PM。

该指令由别名 SMSTART 和 SMSTOP 使用。

在这里插入图片描述

MSR <pstatefield>, #<imm>

<pstatefield> 是 PSTATE 字段名称。对于 MSR 指令,这是在“op1:op2:CRm”中编码的:

对于 SMSTART 和 SMSTOP 别名,这是在“CRm<2:1>”中编码的,其中 0b01 指定 SVCRSM,0b10 指定 SVCRZA,0b11 指定 SVCRSMZA。

<imm> 是 4 位无符号立即数,范围为 0 到 15,在“CRm”字段中编码。 当 <pstatefield> 为 ALLINT、PM、SVCRSM、SVCRSMZA 或 SVCRZA 时,限制在 0 到 1 的范围内,在“CRm<0>”中编码。

例如:

也可以使用 MSR 或 MRS 访问 PSTATE 的各个字段。例如,要选择与 EL0 或当前异常级别关联的堆栈指针:

MSR SPSel, #imm —— 该寄存器中的值 0 或 1 用于在使用 EL0 堆栈指针或当前异常级别堆栈指针之间进行选择。

2.3 MSR(寄存器)

将通用寄存器移动到系统寄存器允许 PE 从通用寄存器写入 AArch64 系统寄存器。

在这里插入图片描述

MSR (<systemreg>|S<op0>_<op1>_<Cn>_<Cm>_<op2>), <Xt>

<systemreg> 是一个系统寄存器名,编码在“o0:op1:CRn:CRm:op2”中。系统寄存器名称在系统寄存器 XML 的“AArch64 系统寄存器”中定义。

<op0> 是一个无符号立即数,编码为“o0”:

o0op0
02
13

<op1> 是一个 3 位无符号立即数,范围为 0 到 7,在“op1”字段中编码。

<Cn> 是名称“Cn”,“n”的范围为 0 到 15,在“CRn”字段中编码。

<Cm> 是名称“Cm”,“m”的范围为 0 到 15,编码在“CRm”字段中。

<op2> 是一个 3 位无符号立即数,范围为 0 到 7,在“op2”字段中编码。

<Xt> 是通用源寄存器的 64 位名称,在“Rt”字段中编码。

例如: MSR SPSR_EL1, X0 —— 将 X0 复制到 SPSR_EL1

三、Debug 指令

调试相关的指令有两条:

BRK #imm16 // 进入监控模式调试

HLT #imm16 // 进入暂停模式调试

四、提示指令

HINT 指令可以合法地视为 NOP,但它们可以具有特定于实现的效果:

NOP // 无操作 - 不保证需要时间来执行
YIELD // 提示当前线程正在执行可以换出的任务
WFE // 等待事件
WFI // 等待中断
SEV // 发送事件
SEVL // Send Event Local

4.1 NOP

无操作指令除了将程序计数器的值增加 4 外,什么都不做。该指令可用于指令对齐目的。

不保证在程序中包含 NOP 指令的时序效果。它可以增加执行时间,或者保持不变,甚至减少它。 因此,NOP 指令不适用于定时循环。

4.2 YIELD

YIELD 是一条提示指令。具有多线程功能的软件可以使用 YIELD 指令向 PE 指示它正在执行一项任务,例如自旋锁,可以将其换出以提高整体系统性能。如果 PE 支持此功能,则它可以使用此提示来挂起和恢复多个软件线程。

4.3 WFE

WFE(Wait For Event)是一条提示指令,表示 PE 可以进入低功耗状态,并一直保持到唤醒事件发生。唤醒事件包括由于在多处理器系统中的任何 PE 上执行 SEV 指令而发出的事件信号。执行 WFE 指令可能会导致进入低功耗状态,但可能会陷入更高的异常级别。

4.4 WFI

WFI(Wait For Interrupt)是一条提示指令,表示 PE 可以进入低功耗状态并一直保持到唤醒事件发生。WFI 指令的执行可能会导致进入低功耗状态,但可能会陷入更高的异常级别。

4.5 SEV

SEV(Send Event)是一条提示指令。它导致向多处理器系统中的所有 PE 发送一个事件信号。

4.6 SEVL

SEVL(Send Event Local)是一条提示指令,它使事件在本地发出信号,而不需要将事件信号通知给多处理器系统中的其他 PE。 它可以启动一个以 WFE 指令开始的等待循环。

五、NEON 指令

NEON 指令集也有一些增强,其中一些非常重要。A64 中对 NEON 的更改包括:

  • 支持双精度浮点,使使用双精度浮点的 C 代码能够被矢量化。

  • 用于操作存储在 NEON 寄存器中的标量数据的新指令。

  • 插入和提取向量元素的新指令。

  • 类型转换和饱和整数运算的新指令。

  • 浮点值规范化的新指令。

  • 用于向量缩减、求和以及取最小值或最大值的新跨通道指令。

  • 执行比较、加法、求绝对值和取反等操作的指令已扩展为能够对 64 位整数元素进行操作。

例如下面使用 NEON 指令的片段。

    long long int x = 0;
    long long int y = 0;

    char* srcArr = new char[16];
    for(int i = 0; i < 16; i++){
        srcArr[i] = i;
    }
    LOGD("x=%llx y=%llx", x, y);
    LOGD("srcArr dw: 0x%llx 0x%llx", *((long long int*)srcArr), *((long long int*)srcArr + 1));
    asm volatile(
        "LD1 {v0.16B},[%[srcArr]]\n"
        "MOV %[x],v0.D[0]\n"
        "MOV %[y],v0.D[1]\n"
    :[srcArr] "+r"(srcArr),
     [x] "+r"(x),
     [y] "+r"(y)
    :
    : "cc", "memory", "v0");

    LOGD("-----------------------------");
    LOGD("x=0x%llx y=0x%llx", x, y);

在这里插入图片描述

LD1 指令将 srcArr 指针指向的数组内容加载到 v0 寄存器的 16 个 B 通道,两条 MOV 指令则将 v0 寄存器按照 D 通道划分,分别将 D[0] 和 D[1] 写入 x 和 y。

运行结果如下:

2023-05-10 08:27:57.959 30077-30154/com.demo.myapplication D/NativeCore: x=0 y=0
2023-05-10 08:27:57.959 30077-30154/com.demo.myapplication D/NativeCore: srcArr dw: 0x706050403020100 0xf0e0d0c0b0a0908
2023-05-10 08:27:57.959 30077-30154/com.demo.myapplication D/NativeCore: -----------------------------
2023-05-10 08:27:57.959 30077-30154/com.demo.myapplication D/NativeCore: x=0x706050403020100 y=0xf0e0d0c0b0a0908

六、浮点指令

A64 提供一组与 ARMv7-A VFPv4 扩展类似的浮点指令集,它提供对标量浮点值的单精度和双精度数学运算。有许多更改和新功能:

  • 浮点比较直接设置条件标志(NZCV)。在 A64 中,不需要显式地将比较结果从浮点数标志转移到整数标志。

  • 添加了与 IEEE754-2008 标准相关的说明,例如计算一对数字的最小值和最大值。

  • 从整数格式转换为浮点格式时,现在可以明确指定舍入模式。当在特定舍入模式下需要简单转换时,不再需要设置全局 FPCR 标志。其中一些选项也可用于 ARMv8 A32 和 T32。

  • 添加了指令以支持 64 位整数和浮点格式之间的转换。

  • 在 A64 中,涉及整数类型的浮点运算直接作用于整数寄存器。无需手动在浮点寄存器和整数寄存器之间传递整数值以进行转换操作。

例如下面使用浮点指令的片段。

    double x = 0.0;
    double y = 0.0;

    auto* srcArr = new double[2];
    for(int i = 0; i < 2; i++){
        srcArr[i] = 1.121 * (i + 1);
    }
    char *src = (char *) srcArr;
    LOGD("x=%lf y=%lf", x, y);
    LOGD("srcArr: %lf %lf", srcArr[0], srcArr[1]);
    asm volatile(
        "LD1 {v0.16B},[%[src]]\n"
        "MOV v1.16B, v0.16B\n"
        "FADD v2.2D, v0.2D, v1.2D\n"
        "FMOV %[x], D2\n"
        "FMOV %[y],v2.D[1]\n"
    :[src] "+r"(src),
     [x] "+r"(x),
     [y] "+r"(y)
    :
    : "cc", "memory", "v0", "v1", "v2");

    LOGD("-----------------------------");
    LOGD("x=%lf y=%lf", x, y);

在这里插入图片描述

FADD v2.2D, v0.2D, v1.2D 将 v0 和 v1 寄存器中的 D 通道双精度浮点值相加,最后保存在 v2 寄存器中,FMOV 指令分别将 v2 寄存器中的两个 D 通道的值移动到 %[x] 和 %[y] 寄存器内。我们看到指令已按照我们预想的执行了!

运行结果如下:

2023-05-11 08:26:03.612 11758-11846/com.demo.myapplication D/NativeCore: x=0.000000 y=0.000000
2023-05-11 08:26:03.612 11758-11846/com.demo.myapplication D/NativeCore: srcArr: 1.121000 2.242000
2023-05-11 08:26:03.612 11758-11846/com.demo.myapplication D/NativeCore: -----------------------------
2023-05-11 08:26:03.612 11758-11846/com.demo.myapplication D/NativeCore: x=2.242000 y=4.484000

七、加密指令

ARMv8 的可选扩展添加了加密指令,可显着提高 AES 加密以及 SHA1 和 SHA256 散列等任务的性能。

参考资料

1.《ARMv8-A-Programmer-Guide》
2.《Arm® A64 Instruction Set Architecture Armv8, for Armv8-A architecture profile》

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

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

相关文章

004、PG实例结构

实例结构 1、PostgreSQL实例2、建立一个连接和创建一个会话3、初始化参数文件4、postgresql.conf参数文件5、postgresql.auto.conf参数文件6、参数生效条件7、Memory Architecture8、Process Architecture9、Postgres Server Process10、Backend Processes11、Background Proce…

Linux:split命令、paste命令、ecal命令和正则表达式

Linux&#xff1a;split命令、paste命令、ecal命令和正则表达式 一、split命令二、paste命令三、eval命令四、正则表达式五、实验与应用 一、split命令 split命令—Linux下将一个大的文件拆分成若干小文件语法格式 split 选项 参数 原始文件 拆分后文件名前缀常用选项 选项说…

Claude不能用了?我来帮你

前几天&#xff0c;我在《不需要等待列表&#xff0c;也不用魔法上网的Claude&#xff0c;能否比肩ChatGPT&#xff1f;》一文中&#xff0c;介绍了ChatGPT的同门师兄Claude的注册使用教程。许多同学按照我的教程&#xff0c;很快就无痛使用上了类似ChatGPT的服务。 403 Forbid…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(二)(共识网络分析-第二步-构建网络与模块-分步法)

1写在前面 不知道各位最近过得怎么样&#xff0c;昨天去修了脚&#x1f9b6;&#xff0c;感觉自己马上就要迈入油腻中年人的行列了。&#x1f972; 不过说实话&#xff0c;还是挺舒服的&#xff0c;值得再去一次。&#x1f605; 接着更一下WGCNA的教程吧&#xff0c;还是值得大…

TypeScript-基础类型

目录 介绍 布尔值 数字 字符串 数组 元组 Tuple 枚举 Unknown Any Void Null 和 Undefined Never Object 类型断言 关于 Number, String, Boolean, Symbol 和 Object 介绍 在TypeScript中&#xff0c;我们能够处理一些数据单元&#xff0c;例如&#xff1a;数字…

【JavaWeb】-- HTML、CSS、JavaScript

文章目录 HTML1.基本介绍2.快速入门3.基础标签3.1 标题标签3.2 hr标签3.3 字体标签3.4 加粗、斜体、下划线标签3.5 居中标签 4.图片、音频、视频标签5.超链接标签6.列表标签7.表格标签8.布局标签9.表单标签9.1 表单标签概述9.2 form标签属性9.3 代码演示 10.表单项标签 CSS1.概…

【Prompting】ChatGPT Prompt Engineering开发指南(5)

ChatGPT Prompt Engineering开发指南&#xff1a;Transforming 翻译通用翻译器音调转换格式转换拼写检查/语法检查内容来源 在本教程中&#xff0c;我们将探讨如何使用大型语言模型来进行文本转换任务&#xff0c;例如语言翻译&#xff0c;拼写和语法检查&#xff0c;音调调整和…

怎么画邻接表?不用邻接矩阵也能画?

目录 一、有向图的邻接表 二、无向图的邻接表 一、有向图的邻接表 最简单粗暴的方式就是把某个顶点发出的箭头指向的顶点全作为单个结点连接到此顶点的后面。结点数等于边数。 按正常思路的话&#xff0c;是一种递归遍历。 1.选一个点作为出发点。比如选一个v0。 2.从第一出…

Kali-linux控制Meterpreter

Meterpreter是Metasploit框架中的一个杀手锏&#xff0c;通常作为利用漏洞后的攻击载荷所使用&#xff0c;攻击载荷在触发漏洞后能够返回给用户一个控制通道。当使用Armitage、MSFCLI或MSFCONSOLE获取到目标系统上的一个Meterpreter连接时&#xff0c;用户必须使用Meterpreter传…

【C++】leetcode力扣 剑指 Offer 题解

文章预览&#xff1a; 剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题…

大模型训练数据多样性的重要性

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

图形编程周刊(2023.001)

图形编程周刊(2023.001) key: webgpu webgl 3d webgis three.js cesium.js 这里是力博荣(Libaro)三维可视化带来的 图形编程周刊, 争取每周五发布。 更新源位置: https://gitee.com/lianming/graphics-programming-weekly/blob/master/2023001/2023001.md 发现的代码 1、th…

少儿编程 中国电子学会图形化编程等级考试Scratch编程三级真题解析(判断题)2023年3月

2023年3月scratch编程等级考试三级真题 判断题(共10题,每题2分,共20分) 26、单击如图所示积木,将生成一个介于1.5和2.5之间的一位小数 答案:错 考点分析:考查随机数积木的使用,随机生成小数的时候,生成的小数位不止一位,所以错误 27、为新建变量命名时,不区分大小…

红黑树封装map和set

文章目录 红黑树封装map和set1. 改良红黑树1.1 改良后的节点1.2 改良后的类分别添加仿函数代码 3. 封装map和set3.1 set3.2 map 3. 迭代器3.1 begin 和 end3.2 operator()和operator--()3.3 const迭代器set的迭代器map的迭代器 4. map的operator[]的重载5. 完整代码实现5.1 RBT…

美团二面:聊聊ConcurrentHashMap的存储流程

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

手把手教你彻底卸载MySQL

❤写在前面 ❤博客主页&#xff1a;努力的小鳴人 ❤系列专栏&#xff1a;MySQL8.0基础学习 ❤欢迎小伙伴们&#xff0c;点赞&#x1f44d;关注&#x1f50e;收藏&#x1f354;一起学习&#xff01; ❤如有错误的地方&#xff0c;还请小伙伴们指正&#xff01;&#x1f339; ​ …

抖音SEO矩阵系统源码开发搭建(一)

抖音SEI矩阵系统源码开发&#xff0c;需要遵循一下步骤&#xff1a; 1. 确定需求和功能&#xff1a;明确系统的主要目标和需要实现的功能&#xff0c;包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构&#xff1a;根据需求和功能确定系…

Golang每日一练(leetDay0068) 二叉树右视图、岛屿数量

目录 199. 二叉树的右视图 Binarytree Right Side View &#x1f31f;&#x1f31f; 200. 岛屿数量 Number-of-islands &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日…

【C++】图解类和对象(中)

类和对象&#xff08;中&#xff09; 文章目录 类和对象&#xff08;中&#xff09;一、类的6个默认成员函数二、构造函数1.定义2.特性3.对特性的理解及几点注意事项 二、析构函数总结 一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的…

只需6步,就能让你的 React +Tailwind.css站点实现暗黑功能

欢迎回来&#xff0c;开始一次新的编码之旅吧&#xff01;今天&#xff0c;我们将进入神秘的世界&#xff0c;探索如何在你的React.js网站中使用Tailwind.css实现暗黑模式。Tailwind.css 是你编码工具中的强大助手&#xff0c;结合React.js使用&#xff0c;你可以创造出令人惊叹…