当前位置:   article > 正文

AArch64 ARM64 寄存器介绍_aarch64 寄存器

aarch64 寄存器

目录

一、通用寄存器

二、浮点寄存器

三、特殊寄存器


一、通用寄存器

AArch64架构提供了31个通用寄存器,每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。对于数据处理指令,X或W的选择决定了操作的size。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。当写入W寄存器时, 64位寄存器的高32位为零。

  • X0: 也称为零寄存器,用于存储函数的返回值、传递函数参数和临时存储变量。
  • X1-X7: 用于传递函数参数和临时存储变量。
  • X8: 也称为程序计数器(PC),用于存储当前正在执行的指令的地址。当处理器执行一条指令时,PC会自动递增以指向下一条指令。
  • X9-X15: Caller Saved寄存器,用于存储函数参数、局部变量和临时数据。
  • X16-X17: 也称为临时寄存器,用于存储临时数据,这些寄存器在函数调用期间不需要保留其值。
  • X18: 也称为平台相关寄存器,用于存储与特定平台相关的信息,如TLS(线程本地存储)指针。
  • X19-X28: Callee Saved寄存器,于存储函数参数、局部变量和临时数据。
  • X29: 也称为帧指针寄存器(Frame Pointer,FP),用于存储当前函数的堆栈帧指针。当函数调用发生时,x29寄存器的值被保存到堆栈中,以便在函数执行期间可以轻松地访问上一级函数的堆栈帧。这样,当函数返回时,可以通过恢复x29寄存器的值来恢复到正确的堆栈帧。
  • X30: 也称为链接寄存器(Link Register,LR),用于存储函数调用的返回地址。当函数执行完毕时,处理器将使用x30寄存器中存储的返回地址来恢复到调用点。这样,控制流程可以顺利返回到调用函数的位置继续执行。

X29寄存器和X30寄存器在函数调用和堆栈帧的管理中扮演着关键角色。X29寄存器用于存储当前函数的堆栈帧指针,以便在函数执行期间可以访问上一级函数的局部数据。X30寄存器则用于存储函数调用的返回地址,以便在函数执行完毕后可以返回到正确的调用点。理解和正确使用这两个寄存器对于编写正确和高效的函数代码至关重要。

二、浮点寄存器

AArch64架构引入了SIMD(Single Instruction, Multiple Data)操作,通过矢量寄存器(Vector Registers)来支持高级的浮点运算和数据处理。

  • 32个128位寄存器V0-V31。(也叫Q0-Q31,其实是Q0-Q31直接map到了V0-V31)
  • 32个64位寄存器D0-D31。
  • 32个32位寄存器S0-S31。
  • 32个16位寄存器H0-H31。
  • 32个8位寄存器B0-B31。

除了上述通用寄存器,还有FPSR(浮点状态寄存器)和 FPCR(浮点控制寄存器)等。FPSR和FPCR寄存器是用于控制和管理浮点数运算的状态和控制信息;FPSR(Floating-point Status Register)保存了浮点数运算的状态信息,如溢出、下溢、无穷大、NaN等;FPCR(Floating-point Control Register)用于控制浮点数运算的模式和精度,如舍入模式、精度控制等。

三、特殊寄存器

  • CurrentEL寄存器: 用于存储当前执行指令的异常级别(Exception Level),如 ELR_EL0、ELR_EL1 等。
  • 零寄存器: XZR(扩展为 WZR)寄存器也被称为零寄存器。它始终包含值零(0x0),无法更改。在指令执行期间,可以使用XZR寄存器作为操作数,用于表示零值。零寄存器在条件分支和比较指令中常用于表示零值,以进行条件判断和比较操作。它还可用于将寄存器中的值清零或作为临时存储寄存器。
  • PC寄存器: PC寄存器存储当前正在执行的指令的地址,它是指示处理器下一条要执行的指令的位置的重要寄存器。当处理器执行一条指令时,PC会自动递增以指向下一条指令。通过修改PC寄存器的值,可以实现跳转和分支,从而改变程序的控制流程。在函数调用过程中,PC寄存器被用于保存下一条要执行的指令的地址,并在函数返回时使用保存的地址来恢复到正确的执行位置。
  • SP寄存器: 也称为堆栈指针寄存器(Stack Pointer),用于指向当前堆栈的顶部地址。堆栈是一种先进后出(LIFO)的数据结构,用于存储函数调用期间的局部变量、临时数据和返回地址等。在函数调用过程中,SP寄存器会随着数据的入栈和出栈而自动更新。通过递增和递减SP寄存器的值,可以在堆栈上分配和释放内存,以及保存和恢复函数调用的上下文信息。在多线程和多任务环境中,每个线程或任务都有自己的堆栈,而SP寄存器用于指向当前线程或任务的堆栈顶部。
  • SPSR寄存器: (Saved Program Status Register) 是用于保存先前处理器状态的寄存器。它在异常处理期间用于保存当前状态,以便在异常返回时可以恢复到先前的状态。
  • ELR寄存器: 也称为异常链接寄存器,用于保存发生异常时的下一条指令的地址,即异常返回地址。不同特权级别的 ELR 对应不同特权级别的寄存器,如 ELR_EL0、ELR_EL1 等。通过这些特权级别相关的寄存器,处理器可以在异常发生时正确切换到相应的特权级别,并保存和恢复相关的上下文信息,确保异常处理和特权级别切换的正确性和安全性。

EL0、EL1、EL2和EL3是AArch64架构中定义的四个特权级别(Exception Levels),用于支持不同的执行环境和特权级别。它们对应于不同的软件层次和特权级别,包括用户空间、操作系统内核、虚拟化管理器和安全监控器。下面是对这些特权级别的详细介绍:

  1.  EL0是最低特权级别,也称为用户空间。在EL0级别下,执行的是普通应用程序,如用户应用和用户态服务。EL0级别的软件没有直接访问特权指令和受限资源的权限。它运行在操作系统内核之上,并通过系统调用和异常来访问特权功能。
  2. EL1是操作系统内核的特权级别,也称为内核空间。在EL1级别下,操作系统内核运行,并拥有直接访问处理器的所有特权指令和受限资源的权限。EL1级别通常用于操作系统内核的执行,包括处理器的调度、中断处理、内存管理等关键任务。
  3. EL2是虚拟化管理器的特权级别。它允许运行虚拟化管理器(如Hypervisor),用于创建和管理虚拟机。在EL2级别下,虚拟化管理器可以对硬件资源进行虚拟化,并为虚拟机提供虚拟化环境。
  4. EL3是安全监控器的特权级别。它用于实现安全性和可信度,比如使用TrustZone技术实现的安全分区。在EL3级别下,安全监控器可以控制对系统的安全访问,并提供安全隔离和保护,以保护关键数据和系统资源。

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号