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

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

3天内不再提示

剖析Armv8-A的AArch64寄存器

jf_78858299 来源:老秦谈芯 作者: 老秦谈芯 2023-01-30 16:45 次阅读

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

根据指令使用数据的方式, 指令系统可分为堆栈型、累加器型和寄存器型。寄存器型又可以进一步分为寄存器-寄存器型和寄存器-存储器型。

  • 堆栈型。堆栈型指令又称零地址指令, 其操作数都在栈顶, 在运算指令中不需要指定操作数, 默认对栈顶数据进行运算并将结果压回栈顶。
  • 累加器型。累加器型指令又称单地址指令, 包含一个隐含操作数——累加器, 另一个操作数在指令中指定, 结果写回累加器中。
  • 寄存器-存储器型。在这种类型的指令系统中, 每个操作数都由指令显式指定, 操作数为寄存器和内存单元。
  • 寄存器-寄存器型。在这种类型的指令系统中, 每个操作数也由指令显式指定, 但除了访存指令外的其他指令的操作数都只能是寄存器。

寄存器-寄存器型指令系统中,运算指令的操作数只能来自寄存器, 不能来自存储器, 所有的访存都必须显式的通过load和store指令来完成, 所以寄存器-寄存器型又被称为load-store型。使用寄存器的优势在于, 寄存器的访问速度快, 便于编译器的调度优化, 并可以充分利用局部性原理, 大量的操作可以在寄存器中完成。此外, 寄存器-寄存器型的另一个优势是寄存器之间的相关性容易判断, 容易实现流水线、多发射和乱序执行等方法。当今的指令系统主要是寄存器-寄存器型。(以上内容摘自《计算机体系结构基础》)

说了这么多,就是想强调一下在Armv8-A中寄存器的重要性。

在AArch64应用级角度,一个PE(Process Element)具有下列寄存器:

31个通用寄存器, R0 - R30,其中64-bit的寄存器命名为X0 – X30,而32位的寄存器命名为W0 -W30。

零寄存器XZR(64-bit)和WZR(32-bit)。

一个64-bit的堆栈指针(Stack Pointer)寄存器,堆栈指针的最低有效32位可以使用寄存器WSP访问。

一个64-bit的程序计数器(Program Counter),用于保存当前指令地址。软件无法直接写入PC。

32个SIMD(Single Instruction Multiple Data)&FP(Float Point)寄存器,V0 – V31。其中,128-bit的寄存器命名为Q0 -Q31;64-bit的命名为D0 – D31;32-bit的命名为S0 – S31;16-bit的命名为H0 -H31;8-bit的命名为B0 – B31。

一个64-bit的SIMD&FP控制寄存器FPCR。

一个64-bit的SIMD&FP状态寄存器FPSR。

三十二个可扩展向量寄存器(Scalable Vector registers),Z0 – Z31,寄存器宽度取决于具体实现,在128-1024 bit之间。

十六个可扩展断言寄存器(Scalable Predicate registers),P0 - P15。

一个专用SVE第一故障寄存器FFR(First Fault Register)。

一个处理器状态寄存器PSTATE,它是处理器状态信息的集合,包括条件标记寄存器NZCV,异常屏蔽寄存器DAIF,SP选择寄存器SPSEL、异常等级寄存器CurrentEL等。下图是PSTATE的字段定义。

在AArch64下,PSTATE字段使用以下专用(Special-Purpose)寄存器访问,通过MRS指令直接读取,通过MSR指令直接写入。

NZCV寄存器比较简单,如下图。N是负数条件标志位,如果最后一个标志设置指令的结果为负,则N=1;Z是0条件标志位,如果最后一个标志设置指令的结果为零,则Z=1,否则Z=0;C是进位条件标志位,如果最后一个标志设置指令导致进位情况发生,则C=1;V是溢出条件标志位,如果最后一个标志设置指令导致溢出情况发生,则V=1。其它位是保留位。

D是处理器状态调试屏蔽位;A是系统错误(SError)中断屏蔽位;I是IRQ屏蔽位;F是FIQ屏蔽位。其它位是保留位。

CurrentEL是当前异常等级寄存器,

SPSel(Stack Pointer Select)是堆栈指针选择寄存器,如下图,只有一个有效位。0b0表示在所有异常级别使用SP_EL0;0b1表示在异常级别ELx使用SP_ELx。

PAN(Privileged Access Never)是特权访问禁止寄存器。0b0表示特权读写不被此机制禁用;0b1表示禁用对EL0级别可访问地址的特权读写访问。

UAO(User Access Override)是用户访问覆盖寄存器。

DIT(Data Independent Timing)是数据独立时序寄存器。0b0表示该架构没有说明任何指令的时序属性。

SSBS是Speculative Store Bypass Safe(翻译不出来了)。0b0表示不允许硬件进行推测性load/store。

TCO(Tag Check Override)是标记检查覆盖寄存器。改为表示是否允许全局禁用内存标记检查。0b0表示load/store不受影响;0b1表示load/store不被检查。

ALLINT(All Interrupt Mask Bit)是全部中断屏蔽寄存器。

AArch64的专用寄存器除了上述,还有很多其它的。

此外,AArch64中还有大量的系统寄存器(System Registers)。系统寄存器为执行控制、状态和一般系统配置提供支持。大多数系统寄存器在EL0异常等级时不可访问。然而,一些系统寄存器可以配置为允许执行在EL0等级的软件进行访问。可以从EL0访问的寄存器包括:

  • Cache ID registers
  • Debug registers
  • Performance Monitors registers
  • Activity Monitors registers
  • Thread ID registers
  • Timer registers

前面讲GIC的时候提到过,ARM把一些中断相关的寄存器从GIC中剥离出来,放到了CPU interface中。在GICv2时,这些寄存器可以设计成系统寄存器,也可以设计成寻址访问的寄存器,但是到了GICv3,要求这些寄存器必须是系统寄存器。

对于系统寄存器的访问,也是通过MSR和MRS指令。

本次介绍的寄存器只是AArch64中全部寄存器的冰山一角,实际的寄存器远远多于今天提到的这些。ARM专门提供了一篇描述Armv8-A寄存器的文档,有四千多页。

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

    关注

    38

    文章

    7484

    浏览量

    163765
  • 数据
    +关注

    关注

    8

    文章

    7002

    浏览量

    88943
  • 累加器
    +关注

    关注

    0

    文章

    50

    浏览量

    9447
收藏 人收藏

    评论

    相关推荐

    ARMv8-A AArch32主要特性

    Cortex-A32产品介绍ARMv8-A AArch32主要特性ARMv7-M与AArch32的不同之处软件从
    发表于 02-19 06:20

    ARMv8架构资料分享

    (异常级别为 EL0 - EL3)  · ARMv8 寄存器组(和先前完全不同的 64寄存器)  · A64 指令集(新的
    发表于 03-21 14:50

    ARMv8aarch64aarch32是怎样进行切换的

    ARMv8中,aarch64aarch32是通过异常进行切换的。而A32和T32是通过bx指令进行切换的。如下图:以下A64
    发表于 04-01 15:09

    一文读懂ARM AArch64 state的寄存器

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

    请问Armv8-A到底是什么东西呢

    兼容,在Armv8-A中实际应用较少,后面内容基本都是介绍AArch64的相关内容。AArch64中扩展了一些寄存器,包括以下:31个通用的64
    发表于 08-22 15:39

    简单研究一下Armv8-AAArch64寄存器

    的指令系统主要是寄存器-寄存器型。说了这么多,就是想强调一下在Armv8-A寄存器的重要性。在AArch64应用级角度,一个PE(Proc
    发表于 09-20 14:54

    AArch64异常模型指南

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

    AArch64外部调试详解

    Armv8-A体系结构支持自托管调试和外部调试。本指南提供了外部调试的概述,并描述了 体系结构支持。该指南解释了外部调试功能,以及启用这些功能的步骤功能。 当调试托管在处理元素(PE)上时,将使
    发表于 08-02 06:37

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

    本手册中的体系结构描述使用了与Armv8体系结构相同的术语。有关该术语的更多信息,请参阅Armv8-A架构配置文件Armv8 Arm®架构参考手册A部分的介绍。此外,在适当的情况下使用
    发表于 08-11 07:45

    ARM Cortex-A系列ARMv8-A程序员指南

    ARMv8-A是针对应用配置文件的最新一代ARM架构。 在本书中,名称ARMv8用于描述整个体系结构,它现在包括32位执行状态和64位执行状态。 ARMv8引入了使用
    发表于 08-22 07:22

    ARM公司64ARMv8-A技术授权新里程

    2014年9月4日——ARM近日宣布完成第50份64ARMv8-A的技术授权协议。随着业界在更广泛应用中对于更高性能计算实现的需求提升,截至目前,共有27家企业取得了ARMv8-A技术授权。
    发表于 09-04 16:46 2100次阅读

    ARM64与ARM32 的Linux程序区别在哪里

    arm64或ARM64。我在示例中使用了AArch64寄存器,但我所描述的许多问题也发生在ARMv8-A 32位执行状态。
    的头像 发表于 08-09 09:51 2.7w次阅读
    ARM<b class='flag-5'>64</b>与ARM32 的Linux程序区别在哪里

    AArch64寄存器介绍

    作为 RISC 架构,AArch64 提供了大量的通用寄存器。除通用寄存器之外,本节还会介绍特殊寄存器、系统控制寄存器、处理
    的头像 发表于 08-24 09:57 6104次阅读

    Armv8架构及虚拟化介绍

    ARMv8基本概念 (1)执行状态(execution state):处理运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理及编程模型等。ARMv8体系结构定义了
    的头像 发表于 04-16 10:45 6427次阅读

    最新的Linux aarch64 LSA驱动程序

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