0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AArch64寄存器介绍

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2022-08-24 09:57 次阅读

作者简介

周文嘉,目前就职于某国产 AI GPU 芯片公司,曾服务于 ARM、阿里巴巴、HTC 等公司,拥有 10 年以上工作经验,主要从事系统软件开发,涵盖系统库开发、指令集优化、Linux内核开发等,为某些开源社贡献过一定数量的补丁,担任 Free time team 创始人,致力于免费教育事业。

邵靖杰,目前就职于某国产大型机 ARM CPU 研究所,主要从事众核处理器的系统级缓存研发工作。

张健,先后在 SUSE、华为、区块链创业公司、寒武纪等公司工作,担任工程师、架构师、技术合伙人等,研究方向包括 ARM、Linux 发行版、Linux 内核、RISC-V 和虚拟化。

……

目录

1.2 AArch64 寄存器堆................................2

1.2.1 通用寄存器 ...................................2

1.2.2 特殊寄存器 ...................................2

1.2.3 系统控制寄存器 ...........................2

1.2.4 处理器状态 ...................................3

1.2.5 函数调用标准 ...............................4

作为 RISC 架构,AArch64 提供了大量的通用寄存器。除通用寄存器之外,本节还会介绍特殊寄存器、系统控制寄存器、处理器状态、函数调用标准。

1.2.1 通用寄存器

通用寄存器分为两类。其中一类寄存器包括 X0~X30,用于普通的指令集,每个寄存器都有 64 位(Xn)和 32 位(Wn)两种表示形式。其中 32 位的表示形式是 64 位表示形式的低 32位。另一类寄存器包括 V0~V31,用于浮点运算、SIMD、crypto 等领域。每个寄存器长度都是128 位(Qn),它们有 64 位(Dn)、32 位(Sn)、16 位(Hn)、8 位(Bn)这 4 种表示形式。以 X0 和 V0 为例,X0 是 64 位寄存器,它的低 32 位是 W0。V0 也称为 Q0,Q0 是一个128 位的寄存器,它的低 64 位称为 D0,它的低 32 位称为 S0,它的低 16 位称为 H0,它的低8 位称为 B0,如图 1.1 所示。

8f6f762a-22c7-11ed-ba43-dac502259ad0.png

1.2.2 特殊寄存器

XZR 和 WZR 分别对应 64 位与 32 位的零寄存器。对这些寄存器进行读操作,将会获取到0;对这些寄存器进行的写操作将会被处理器忽略。与 ARM 的 32 位架构不同,PC 寄存器已经不再是一个通用寄存器,无法直接访问。ARM 指令的长度是 4 字节,因此对于 ARMv8 上的纯 ARM 指令来说,PC 寄存器是按字节对齐的。SP 寄存器也不再是一个通用寄存器,SP寄存器强制按 16 字节对齐。

1.2.3 系统控制寄存器

ARM 的系统控制寄存器都以“_ELx”为后缀,其中“x”表示某异常级别(Exception Level,EL)的一个数字,如 SCTLR_EL1。后缀的数字意味着能够访问该寄存器的最低异常级别,ARM的系统控制寄存器如表 1.1 所示。

8f7bcccc-22c7-11ed-ba43-dac502259ad0.png

MRS 和 MSR 指令用于读写系统控制寄存器,示例代码如下。

MRS    X0, SCTLR_EL1     // X0 = SCTLR_EL1 MSR    SCTLR_EL1, X0     // SCTLR_EL1 = X0

常用的系统控制寄存器及其功能如表 1.2 所示。

8f9724ae-22c7-11ed-ba43-dac502259ad0.png

ARM 的系统控制寄存器数量庞大,详细的介绍可以参考文档 DDI0487F_b_ARMv8_arm.pdf。

1.2.4 处理器状态

AArch64 通过 PSTATE(process state)的标志位来保存处理器的状态,处理器执行指令的时候,可以读取和设置这些标志位。这些标志位既可以通过 mrs/msr 指令进行访问,也可以通过 DAIFSet、DAIFClr、SPSel、PAN、UAO 等指令直接访问。PSTATE 寄存器的标志位如表 1.3 所示。

8fc3e278-22c7-11ed-ba43-dac502259ad0.png

1.2.5 函数调用标准

1.AArch64 基本指令集函数调用规则

AArch64 提供了 31 个 64 位的通用寄存器 X0~X30,SP 寄存器已经变成了一个专用寄存器。这些寄存器的描述如表 1.4 所示。

8fd4741c-22c7-11ed-ba43-dac502259ad0.png

8ff35d32-22c7-11ed-ba43-dac502259ad0.png

值得注意的是,X16 和 X17 寄存器在动态链接的时候,可能会被某些链接器用于实现特殊功能。X18 寄存器在 Darwin 和 Windows 平台上会保留作为平台寄存器使用。在代码优化的时候,这 3 个寄存器要谨慎使用。

2.AArch64 NEON

指令集函数调用规则 AArch64 提供了 32 个 128 位的寄存器(V0~31),可以用来进行 SIMD 和浮点运算。其中,V0~V7 这 8 个寄存器用来传递参数和函数返回值,V8~V15 这 8 个寄存器需要由被调函数保存(只需要保存这些寄存器的低 64 位即可)。D8~D15 是 V8~V15 寄存器的低 64 位,因此通过如下的代码片段保存 D8~D15 的内容,就可以在函数中使用 V0~V31 这 32 个寄存器了。

stp        d8, d9, [sp, -192]! 
stp        d10, d11, [sp, 16] stp        d12, d13, [sp, 32] stpd14,d15,[sp,48]

3.AArch64 SVE

指令集函数调用规则 如果平台支持 SVE 扩展,那么 AArch64 会提供 32 个可变长的向量寄存器 Z0~Z31。每个寄存器都可以用来进行 SIMD 和浮点运算,其中 Z0~Z7 用来传递参数和函数返回值。Z8~Z15 这 8 个寄存器需要由被调函数保存(只需要保存这些寄存器的低 64 位即可)。AArch64 还为 SVE 提供了 16 个断言寄存器 P0~P15,其中 P0~P3 这 4 个寄存器用来传递参数和函数返回值。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19245

    浏览量

    229596
  • 寄存器
    +关注

    关注

    31

    文章

    5334

    浏览量

    120208
  • aarch64
    +关注

    关注

    0

    文章

    7

    浏览量

    5023
  • 函数调用
    +关注

    关注

    0

    文章

    19

    浏览量

    2585

原文标题:1.2.5 函数调用标准 ...............................4

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    简要分析AArch64的虚拟化

    的指令集:T32和A32。标准寄存器宽度为32位。AArch6464位执行状态。有一个可用的指令集:A64。标准寄存器宽度为
    发表于 03-30 10:36

    在ARMv8中aarch64aarch32是怎样进行切换的

    、boot-a64.Sfastmodel最开始执行程序,是在EL3,在EL3,设置scr_el3寄存器,设置EL2运行模式是non-secure,aarch32。设置elr_el3,以及spsr_el3
    发表于 04-01 15:09

    一文读懂ARM AArch64 state的寄存器

    AArch64 state的寄存器寄存器分为一般寄存器和特殊寄存器,另外一些寄存器在特权执行模式
    发表于 05-09 09:37

    Hyp调试控制寄存器配置

    是:一个 Banked EL2 寄存器。在架构上映射到 AArch64 MDCR_EL2 寄存器。属性请参阅 表 4-85 c1 寄存器摘要中的
    发表于 06-08 18:04

    如何在x86环境下基于Qemu和Docker快速搭建AARCH64开发环境

    概述近年来 Arm 服务的发展势头很猛,但大部分人的个人电脑还是 x86 环境,开发上存在不便。从 docker-hub 可以下载到一个名字叫 dev4arm64/aarch64
    发表于 07-11 15:18

    简单研究一下Armv8-A的AArch64寄存器

    寄存器必须是系统寄存器。对于系统寄存器的访问,也是通过MSR和MRS指令。本次介绍寄存器只是AArch
    发表于 09-20 14:54

    AArch64异常模型指南

    AArch64异常模型指南介绍了Armv8-A中的异常和特权模型Armv9-A。它涵盖了Arm体系结构中不同类型的异常,以及处理与异常的关系。 这些内容面向底层代码的开发人员,例如引导代码或内核
    发表于 08-02 06:03

    AArch64自托管调试指南

    集成在Arm核心中的调试逻辑提供了观察和控制CPU和系统环境,同时在深度嵌入式处理上执行软件。手臂调试体系结构规范允许将调试逻辑合并到Arm体系结构中。 本指南介绍了调试,并介绍AArch
    发表于 08-02 10:05

    AArch64外部调试详解

    用自托管调试模型正在调试。调试异常是自托管调试模型的基础。这个调试对调试逻辑进行编程以生成调试事件。这些调试事件生成调试例外情况。您可以在我们的AArch64自托管调试指南中阅读有关此主题的内容。 当
    发表于 08-02 06:37

    ARM通用中断控制体系结构规范GIC体系结构版本3和版本4

    系统寄存器名称,而不是同时列出AArch32和AArch64体系寄存器名称。AArch64寄存器
    发表于 08-11 07:45

    AArch64平台上性能下降的例子

    编者按:目前许多公司同时使用 x86 和 AArch64 2 种主流的服务。这两种环境的算力相当,内存相同的情况下:相同版本的 JVM 和 Java 应用,相同的 JVM 参数,应用性
    的头像 发表于 09-09 11:11 2400次阅读

    如何使用预装程序创建并分发AArch64容器

    本文我们将探讨如何使用预装程序创建并分发 AArch64 容器。
    的头像 发表于 09-30 10:57 1197次阅读

    剖析Armv8-A的AArch64寄存器

    根据指令使用数据的方式, 指令系统可分为堆栈型、累加型和寄存器型。寄存器型又可以进一步分为寄存器-寄存器型和
    的头像 发表于 01-30 16:45 2041次阅读

    最新的Linux aarch64 LSA驱动程序

    电子发烧友网站提供《最新的Linux aarch64 LSA驱动程序.zip》资料免费下载
    发表于 08-23 15:46 2次下载
    最新的Linux <b class='flag-5'>aarch64</b> LSA驱动程序

    第四章:在 PC 交叉编译 aarch64 的 tensorflow 开发环境并测试

    本文介绍了在 PC 端交叉编译 aarch64 平台的 tensorflow 库而非 tensorflow lite 的心酸过程。
    的头像 发表于 08-25 11:38 980次阅读
    第四章:在 PC 交叉编译 <b class='flag-5'>aarch64</b> 的 tensorflow 开发环境并测试