基础篇(二).ARMv8寄存器(1)

这篇具有很好参考价值的文章主要介绍了基础篇(二).ARMv8寄存器(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ARMv8寄存器(1)


ARMv8寄存器实在太多了,本节主要针对系统软件常用的寄存器作为重点介绍。

1.ARMv8寄存器介绍

ARMv8架构(针对Core来说)至少有上千个寄存器,更别提Core外SOC级外设寄存器。这两类寄存器的区别是:前者(不管通用寄存器还是系统寄存器)不占用地址空间,而后者是和内存统一编制的,要占用地址空间。

下面我们主要针对ARM Core内寄存器进行介绍。ARM核心寄存器可以分为:

  • 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。
  • 状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。
  • 特殊寄存器。有专门的用途,用于控制处理器的行为,或表示CPU的状态。
  • 系统寄存器。除了以上寄存器,ARMv8体系结构还定义了很多系统寄存器,用来完成对处理器不同功能的配置。对应ARMv7的cp15寄存器。

而系统寄存器,根据其功能又可以分为11种:

  • 基本系统寄存器。
  • 特殊目的寄存器。3个ELR, 4个SP, 8个SPSR。
  • VMSA(虚拟内存架构)特殊寄存器。
  • ID寄存器。
  • 性能监控寄存器。
  • DEBUG寄存器。
  • RAS寄存器。
  • 通用定时器寄存器。
  • Cache维护相关寄存器。
  • 地址转换寄存器。
  • TLB维护寄存器。
  • 分支预测寄存器。

2.重点寄存器

这么多寄存器很难记得住,我们只需要重点关注以下寄存器,其余寄存器用到时候再查手册。

寄存器 描述
PSTATE 程序状态寄存器
SP_ELx(x>0) 在EL1/EL2/EL3 level中,如果spsel=0,则使用SP_ELx(x>0)
SP_EL0 在所有level中,如果spsel=1, 则使用SP_EL0
SPSR 备份的程序状态寄存器
ELR_ELx(x>0) 异常链接寄存器,记录着异常时程序的返回地
ESR_ELx(x>0) 同步异常, 异常特征寄存器
VBAR_ELx(x>0) 向量表基地址寄存器
TTBRn_ELx(n=1,2、x>0) 地址翻译基地址寄存器,存放页表地址。
MAIR_ELx(x>0) 内存属性寄存器
PAR_EL1 物理地址寄存器, 当使用指令操作MMU进行VA到PA的转换时,物理地址由PAR_EL1输出
SCR_EL3 安全控制寄存器
HCR_EL2 Hypvisor控制寄存器
SCTLR_ELx(x>0) 系统控制寄存器
TCR_ELx(x>0) 地址翻译控制寄存器

3.通用寄存器

AArch64执行状态提供了31个在任何时间任何特权级下都可访问的64位的通用寄存器,分别是X0-X30。而AArch32状态支持16个32位的通用寄存器。

每个AArch64 64位通用寄存器(X0-X30)也具有32位(W0-W30)形式。

基础篇(二).ARMv8寄存器(1)
32位W寄存器取自相应的64位X寄存器的低32位。也就是说,W0映射到X0的低32位,W1映射到X1的低32位。

从W寄存器读取时,忽略相应X寄存器高32位,并保持其它不变。写入W寄存器时,将X寄存器的高32位设置为零。也就是说,将0xFFFFFFFF写入W0会将X0设置为0x00000000FFFFFFFF。

通用寄存器在ACPS中用法

除了用于数据运算和存储外,通用寄存器还在函数的调用过程中起到特殊作用,ARM64体系结构的函数调用标准和规范对此有约定,如下图所示。

基础篇(二).ARMv8寄存器(1)

说明:

  • X0-X7 用于参数传递
  • - [ ] X9-X15 在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低。在子函数中使用这些寄存器时,直接使用即可, 无需save/restore.。在汇编代码中x9-x15出现的频率极低。
  • X19-X29 在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre。在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre。
  • X8, X16-X18, X29, X30 这些都是特殊用途的寄存器。
  • – X8: 用于返回结果
  • – X16、X17 :进程内临时寄存器
  • – X18 :resrved for ABI
  • – X29 :FP(frame pointer register)
  • – X30 :LR

4.处理器状态 (PSTATE)

ARMv7中使用当前程序状态寄存器(CPSR)表示处理器当前状态。AArch64没有直接与之等价的寄存器。

在AArch64中,传统CPSR的组件作为可以独立访问的字段提供。这些状态被统称为处理器状态(PSTATE)。

该程序和备份程序状态寄存器(SPSR_ELx)是一对。当异常发生时,处理器会将PSTATE寄存器的值保存到当前异常级别对应的SPSR_ELx寄存器;当异常返回时(eret),处理器会将SPSR_ELx寄存器的值恢复到PSTATE寄存器。这是硬件自动行为,不需要编程人员操作。

AArch64的处理器状态或PSTATE字段有以下定义:
基础篇(二).ARMv8寄存器(1)

上面的图不好,且容我从别处找个图。

条件判断相关的域
基础篇(二).ARMv8寄存器(1)
如cmp指令,tst指令,条件判断时用到这些标志位;还有像sbc等运算指令,会将标志位一并加入运算。

异常掩码标志位

基础篇(二).ARMv8寄存器(1)

  • 1:表示屏蔽了这个异常
  • 0:表示没有屏蔽这个异常

执行状态控制位
基础篇(二).ARMv8寄存器(1)

部分字段有专门对应的寄存器,如NZCV寄存器、CurrentEL寄存器。注意:EL0级别只能访问PSTATE.{N, Z, C, V}和PSTATE.{D, A, I, F}字段。

5.特殊寄存器

ARMv8支持的特殊寄存器:
基础篇(二).ARMv8寄存器(1)
部分寄存器还可以当作32位的使用:
基础篇(二).ARMv8寄存器(1)

5.1 备份程序状态寄存器(SPSR_ELx)

当异常发生时,处理器会将PSTATE寄存器的值保存到当前异常级别对应的SPSR_ELx寄存器;当异常返回时(eret),处理器会将SPSR_ELx寄存器的值恢复到PSTATE寄存器。这是硬件自动行为,不需要编程人员操作。
基础篇(二).ARMv8寄存器(1)
AArch64下各域的含义:

  • N 负数标志位,如果结果为负数,则N=1;如果结果为非负数,则N=0。
  • Z 零标志位,如果结果为零,Z=1,否则Z=0。
  • C 进位标志位
  • V 溢出标志位
  • SS 是否是能软件单步功能 ,若为1,说明在异常处理中软件单步功能开启
  • IL 非法执行状态位
  • D 程序状态调试掩码,在异常发生时的异常级别下,来自监视点、断点和软件单步调试事件中的调试异常是否被屏蔽。
  • A SError(系统错误)掩码位
  • I IRQ掩码位
  • F FIQ掩码位
  • M[4] 异常发生时的执行状态 ,0表示AArch64状态
  • M[3:0] 异常发生时的模式或异常级别

在ARMv8中,写入的SPSR依赖于异常级别。如果异常发生在EL1,则使用SPSR_EL1。如果异常发生在EL2,则使用SPSR_EL2,如果异常发生在EL3,则使用SPSR_EL3。处理器核会在异常发生时填充SPSR。

注意: 与异常级别相关联的寄存器对ELR_ELn和SPSR_ELn保存着在较低异常级别执行期间的状态。

5.2 异常链接寄存器(ELR)

异常链接寄存器保存异常返回地址。在执行eret指令后,会将该寄存器的值赋值给PC。

5.3 CurrentEL寄存器

该寄存器表示PSTATE中的EL字段,其中保存了当前异常级别。使用MRS指令可以读取该寄存器。

  • 0:表示EL0.
  • 1:表示EL1
  • 2:表示EL2.
  • 3:表示EL3.

5.4 DAIF寄存器

该寄存器表示PSTATE中的{D, A, I, F}字段。使用MRS指令可以读取该寄存器。

5.5 SPSel寄存器

该寄存器表示PSTATE中的SP字段,用于在SP_EL0和SP_ELx中选择使用哪个。

5.6 PAN寄存器

该寄存器表示PSTATE中的PAN(Privileged Access Never, 特权禁止访问)字段。可以通过MSR和MRS指令读取和设置寄存器。这是ARMv8.1新增特性,为了防止内核态恶意访问用户态内存。

PAN寄存器的值如下:

  • 0: 表示内核态可以访问用户态内存。
  • 1:表示内核态访问用户态内存会触发一个访问权限异常。

5.7 UAO寄存器

该寄存器表示PSTATE中的UAO(User Access Override, 用户访问覆盖)字段。可以通过MSR和MRS指令读取和设置寄存器。

UAO值为1 ,表示在EL1和EL2执行非特权指令(如LDTR、STTR)的效果和特权指令(例如LDR、STR)是一样的。

5.8 NACV寄存器

该寄存器表示PSTATE中的{N, Z, C, V}字段。

5.9 PC (Program Counter,程序计数器) 寄存器

PC寄存器通常用来指向当前运行指令的下一条指令的地址。

在原来的ARMv7体系结构中,将通用寄存器R15作为程序计数器(PC),同时作为一个通用寄存器使用。编程人员可以通过修改PC寄存器的值控制程序中指令的运行顺序。但这增加了编译器和复杂的流水线的设计困难。

在ARMv8中,PC不再作为一个命名的寄存器来访问,编程人员无法通过指令来直接访问它。但是,可以在某些指令中隐式的使用PC,如PC相对加载和地址生成(adrp等指令)。

5.10 零寄存器(WZR/XZR)

XZR:64位
WZR: 32位

当访问零寄存器时,所有写操作都被忽略(用于将一个结果丢弃),所有读操作返回0。

5.11 栈指针寄存器(SP)

在ARMv8体系结构中,4个异常级别各有一个SP寄存器SP_ELn。认情况下,发生异常时会选择目标异常级别的SP_ELn作为栈指针。

  • SP_EL0:程序在EL0时栈指针寄存器,EL0时只能使用此寄存器存放栈地址。
  • SP_EL1:程序在EL1时默认栈指针寄存器。
  • SP_EL2:程序在EL2时默认栈指针寄存器。
  • SP_EL3:程序在EL3时默认栈指针寄存器。

EL0永远只能访问SP_EL0。其他异常级别ELx:文章来源地址https://www.toymoban.com/news/detail-474527.html

  • 发生异常时,使用自己的SP_ELx寄存器存放栈地址;
  • 可以将SP_EL0寄存器作为临时寄存器来使用,例如Linux内核使用该寄存器存放进程中task_struct数据结构指针。

到了这里,关于基础篇(二).ARMv8寄存器(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARMv8M Cortex-M33 系列 7.1 -- xPSR | CFSR | HFSR | BFAR | MMFAR 寄存器】

    请阅读 【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 由于在RA4M2(Cortex-M33)移植RT-Thread OS的时候遇到了 Hardfault,不知道如何分析错误原因,后参考以前写的文章【ARM Cortex-M 系列 2.1 – RT-Thread Cortex-M7 异常处理及 hardfault 处理分析】 来查找原因。 在 ARM Cortex-M33 微控制器上

    2024年01月20日
    浏览(50)
  • 【ARMv9 DSU-120 系列 4.2 -- Utility Bus 访问的 memory-mapped 寄存器详细介绍】

    请阅读 【Arm® DynamIQ™ Shared Unit-120 专栏 】 ARMv9架构中的DSU-120(DynamIQ™ Shared Unit-120)提供了一组Cluster系统控制寄存器,这些寄存器可以通过两种方式访问: 通过Utility Bus上的内存映射访问 :允许外部设备或核心之外的系统与DSU-120的控制寄存器进行交互。 通过核心的系统寄

    2024年04月29日
    浏览(35)
  • Verilog基础之十一、移位寄存器实现

    目录 一、前言 二、工程设计 ​2.1 工程代码 2.2 综合结果 2.3 仿真结果     移位寄存器SRL在工程中属于使用频率较高个模块,可用于存储数据,实现串并转换;根据数据移动方向可分为左移寄存器,右移寄存器,左移是向数据高位移动,右移是向数据低位移动。  工程中包

    2024年02月11日
    浏览(45)
  • Verilog基础:寄存器输出的两种风格

    相关文章 Verilog基础 https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482         Verilog中的寄存器操作一般指的是那些对时钟沿敏感而且使用非阻塞赋值的操作。例如状态机中的状态转移,实际上就是一种寄存器操作,因为这相当于将下一状态的组合逻辑连接至

    2024年02月04日
    浏览(39)
  • 明解STM32—GPIO理论基础知识篇之寄存器原理​

    一、前言         在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍。GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析;GPIO工作模式中主要介绍GPIO应用在不同的使用场景下,GPIO端口的静态特征配置和动态的工作模式,同时对

    2024年02月16日
    浏览(48)
  • 【明解STM32】中断系统理论基础知识篇之中断寄存器功能原理

    目录 一、前言 二、寄存器概述 三、NVIC寄存器组 四、SCB寄存器组 五、中断屏蔽寄存器组 六、总结         在之前的STM32的中断系统理论基础知识之基本原理及NVIC中,分别中断的基本原理,中断的管理机制和中断的处理流程进行了较为详细的论述,读者通过全篇的阅读了

    2024年02月16日
    浏览(46)
  • STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管

    本篇介绍的是基于 STM32——寄存器 版本的矩阵键盘控制 5161as数码管 显示数字的实例。我们赋予每一个按键从1到9的数字,当我们按下对应的数字按键时,程序会检测出被按下的是哪一个按键并在5261as数码管上显示相应的数字。 (1)原理 为了读取每一个按键的状态,最简单

    2024年02月11日
    浏览(35)
  • 【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动

    🎉欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 ISSP调试演示: 程序配置完成:

    2024年02月09日
    浏览(46)
  • RISC-V基础之函数调用(五)函数递归调用及函数参数数量溢出(超出现有寄存器个数)约定(包含实例)

    首先先解释一下栈在函数调用中的作用,更详细的部分请参照考研复习之数据结构笔记(五)栈和队列(上)(包含栈的相关内容)_管二狗赶快去工作!的博客-CSDN博客 函数嵌套调用栈的作用是用来保存和恢复函数调用过程中的相关信息,如参数、局部变量、返回地址、上下

    2024年02月14日
    浏览(50)
  • 【汇编中的寄存器分类与不同寄存器的用途】

    寄存器分类 在计算机体系结构中,8086CPU,寄存器可以分为以下几类: 1. 通用寄存器: 通用寄存器是用于存储数据和执行算术运算的寄存器。在 x86 架构中,这些通用寄存器通常包括 AX、BX、CX、DX、SI、DI、BP 和 SP。其中,AX、BX、CX 和 DX 寄存器可以分别作为累加器(accumulat

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包