首页 > 其他分享 >ARMv8 寄存器

ARMv8 寄存器

时间:2024-03-16 21:34:57浏览次数:18  
标签:PSTATE SP 使用 指令 寄存器 ARMv8 异常

本文主要介绍 Armv8/v9 指令集架构中常用部分,详细的还是要看 Arm architecture reference manual.

ARMv8 架构

ARMv8 架构支持3种指令集: T32, A32, A64

ARMv8 架构有两种执行状态: AArch32, AArch64

image

一个App 可以混合使用 T32 和 A32, 但是不能混合使用 A32 和 A64.

image

Registers in AArch64

The general purpose registers

image

该架构提供了 31 个通用寄存器。每个寄存器都可以用作 64 位 X 寄存器 (X0…X30),或用作 32 位 W 寄存器 (W0…W30)。这是查看同一寄存器的两种不同方式。比如这张寄存器图,W0是X0的低32位,W1是X1的低32位:

image

对于数据处理指令,选择X或W决定操作的大小。使用X寄存器将导致 64 位计算,使用 W 寄存器将导致 32 位计算。
此示例执行 32 位整数加法:ADD W0, W1, W2
此示例执行 64 位整数加法:ADD X0, X1, X2

写入寄存器时W,如上例所示,64 位寄存器的前 32 位被清零。
image

特殊寄存器

image

Zero register

零寄存器XZR和WZR始终读为 0 并忽略写入。

这个寄存器在编程中非常有用,因为它可以简化某些操作,例如:

  • 当需要将一个寄存器清零时,可以将 zero register 直接作为源操作数,这样就能够避免使用额外的立即数或操作来实现清零。
  • 在某些算术或逻辑操作中作为一个操作数使用,可以便捷地实现特定的功能。例如,如果仿效清零操作,可以通过将某个寄存器和 XZR/WZR 进行 OR 操作实现。

stack pointer

  1. ARMv8体系结构为每个异常等级都实现了一个栈指针SP_ELn,以异常等级为后缀
  2. 当PE在某个异常等级处理异常时,可配置使用如下2个栈指针之一(通过PSTATE.SP配置),
    ① 所处理异常的target exception level对应的SP_ELn(默认情况)
    ② SP_EL0(注意,EL0是不会作为target exception level的,所以这不是默认情况,而是需要特殊配置的)
    说明1:配置使用SP_EL0是在PE已经切换到targe exception level上进行的
    说明2:即使异常处理没有发生异常等级切换,也需要处理上述栈指针的配置
    例如PE当前在EL1运行,并且使用SP_EL0。此时如果发生异常,并且target exception level也是EL1,虽然异常等级不会切换,但是栈指针也会自动切换为SP_EL1。此时如果想继续使用SP_EL0,则仍需要设置PSTATE.SP

image

t后缀表示thread,此时使用SP_EL0作为栈指针;h后缀表示handler,此时使用当前异常等级对应的栈指针。

3:在Linux内核中,当从EL0陷入EL1时,使用SP_EL1作为当前栈指针。此时SP_EL0可以作为一个临时寄存器使用,Linux内核会使用该寄存器存放进程的task_struct结构指针

在 ARMv8 架构中,实际上有两个堆栈指针,它们是:

  • SP_EL0:用于应用程序的用户模式堆栈指针。
  • SP_ELx:x 可以是 1, 2, 或 3,代表不同的异常级别。不同的异常级别对应不同的操作模式,比如操作系统的内核模式或中断处理模式,每个异常级别都有自己的堆栈。

当发生函数调用时,处理器通常会将当前的 PC (程序计数器) 寄存器值(即返回地址)和其他必要的寄存器保存在栈上,然后将 SP 寄存器减少一定量来为新的函数调用预留空间。相反,在函数返回时,处理器会使用 SP 寄存器的内容来恢复之前保存的寄存器值并跳回到调用点。
SP 寄存器的使用遵循调用约定和堆栈平衡的规则,这些规则确保了函数间参数传递、局部变量存储和控制流的正确性。

Saved Program Status Registers (SPSRs)(备份程序寄存器)

用于保存发生异常时的处理器状态

  1. ARMv8体系结构为每个可作为target exception level的异常等级都实现了一个SPSR_ELn,以异常等级为后缀
  2. 当异常发生时,处理器的状态将被保存在target exception level的SPSR寄存器;当异常返回时,将使用的SPSR寄存器中的值恢复PSTATE
  3. 保存异常发生时PSTATE状态的另一个作用,就是可以在异常处理时通过SPSR寄存器判断发生异常时的PE状态,例如发生异常时PE的异常等级和执行状态

image

SPSR寄存器保存的很多状态位与PSTATE中是相同的。这里特别说明一下M[4]和M[3:0]的含义
① M[4]:记录异常发生时的执行状态,即PSTATE.nRW位。0表示AArch64执行状态,1表示AArch32执行状态
② M[3:0]:记录异常发生时的异常等级及其使用的栈指针

image

  • M[3:2]标识发生异常时的异常等级
  • M[1]为保留位,需要置为0
  • M[0]标识栈指针SP的选择,0表示使用SP_EL0,1表示使用与异常等级对应对应的SP_ELn

说明2:不像栈指针SP的使用可配置,异常发生时只能使用与targe exception level相应的SPSR_ELn
说明2:异常返回时,使用SPSR_ ELx的内容来恢复PSTATE

  1. ARMv8体系结构为每个可作为target exception level的异常等级都实现了一个ELR_ELn,以异常等级为后缀
  2. 当异常发生时,异常返回地址将被保存在target exception level的ELR寄存器;当异常返回时,将使用的ELR寄存器中的值恢复到PC寄存器
    说明:和SPSR寄存器一样,异常发生时也只能使用与targe exception level相应的ELR_EL

其中,对于保存什么异常返回地址,对于不同的异常规则不同。
首选的异常返回地址取决于异常的性质,如下所示:
l 对于异步异常,它是发生中断的指令边界之后的指令的地址。因此,它是由于中断而没有执行或没有完成执行的第一条指令的地址。
l 对于系统调用以外的同步异常,它是生成异常的指令的地址。
l 对于系统调用,它是系统调用指令后面的指令的地址。
n 注意:如果由于异常级别没有足够的权限执行指令而导致系统调用指令被捕获、禁用或未定义,则首选的异常返回地址为系统调用指令的地址。
n 系统调用是通过执行SVC、HVC或SMC指令生成的

Process state, PSTATE

在ARMv7体系结构中,使用CPSR寄存器来表示当前处理器的状态。在ARMv8中,将PE的状态抽象为PSTATE。在实现上,则是一组标志位的集合
image

image

image

ARMv8体系结构提供了一组特殊寄存器,用于访问PSTATE状态位

CurrentEL寄存器 表示PSTATE寄存器中的EL字段
DAIF寄存器 表示PSTATE寄存器中的{D,A,I,F}字段
SPSel寄存器 表示PSTATE寄存器中的SP字段
PAN寄存器 PSTATE寄存器中的PAN
UAO寄存器 UAO为1表示在EL1和EL2执行这非特权指令(例如LDTR、STTR)的效果与特权指令(例如LDR、STR)是一样的。
NZCV寄存器

说明:当内核态拥有访问用户态内存或者执行用户态程序的能力时,攻击者就可以利用漏洞轻松地执行用户的恶意程序。为了修复这个漏洞,在ARMv8.1中新增了PAN特性,防止内核态恶意访问用户态内存。如果内核态需要访问用户态内存,那么需要主动调用内核提供的接口,例如copy_from_user()或者copy_from_user()函数。(将内核态与用户态隔离的思想,在很多方面都提现了出来,比如内存管理中的内存隔离,内存映射等)
PAN寄存器的值如下。

0:表示在内核态可以访问用户态内存。
1:表示在内核态访问用户态内存会触发一个访问权限异常。
对于这些特殊寄存器的访问,只能通过MRS(读)/MSR(写)指令完成。
举例:仅设置C标志位为1
MRS R0,NZCV ;读NZCV到R0
ORR R0,R0,#0x200000000 ;设置R0的第29位
MSR NZCV,R0 ;写NZCV

Counter( PC)

Program Counter( PC)在A64中不是通用寄存器,不能和数据处理指令一起使用。可以使用以下方式读取 PC:ADR Xd, .
点 ( .) 表示“这里”,因此显示的指令返回其自身的地址。这相当于阅读PC.

系统寄存器

数据处理或加载/存储指令不能直接使用系统寄存器。相反,需要将系统寄存器的内容读入寄存器X,对其进行操作,然后写回系统寄存器。有两个用于访问系统寄存器的专用指令:
MRS Xd, 将系统寄存器读入Xd.
MSR , Xn 写入Xn系统寄存器。
系统寄存器由名称指定,例如SCTLR_EL1:MRS X0, SCTLR_EL1 读SCTLR_EL1入X0.
系统寄存器名称以_ELx. 指定_ELx访问寄存器所需的最低权限。

标签:PSTATE,SP,使用,指令,寄存器,ARMv8,异常
From: https://www.cnblogs.com/linhaostudy/p/18077647

相关文章

  • Vim的寄存器和宏录制编辑
    本文结构:a.寄存器、宏录制编辑简介b.常用寄存器分类举例c. 宏录制操作举例a1. Vim的寄存器是一个强大的功能,它允许用户存储和检索文本块,以便在编辑过程中进行复制、删除和粘贴等操作。a2. Vim的宏录制功能允许用户录制一系列编辑命令,并在之后重复执行这些命令,大大提......
  • 【ARMv8】异常级别的定义EL0、EL1、EL2、EL3
    ExceptionlevelsARMv8-A系列定义了一系列的异常等级,从EL0到EL3,下面具体说明其含义:ELn中,随着n的增加,软件的执行权限也相应的增加;EL0被称为无特权执行;EL2提供了对虚拟化的支持EL3提供了安全状态切换功能(安全状态与非安装状态之间的切换)异常级别的切换在AARCH64状态下,异常......
  • 滴水逆向笔记系列 - 4.内存地址_堆栈-5.标志寄存器-6.JCC命令
    第四课内存地址_堆栈内存地址db与dd命令db:d表示查找,b表示bytedd:d表示查找,d表示dworddb命令在数据区找出目的内存地址,发现数据区内和堆栈区显示的是相反的反汇编窗口和寄存器窗口的都是从高位到低位,数据区反之(比如数据0x12345678,12是高位,8是低位)所以0012FFDC这块内存(1字节)......
  • 滴水逆向笔记系列-1.进制-2.数据宽度_逻辑运算-3.通用寄存器_内存读写
    第一课进制这节课讲进制计算的核心就是查表例:3+5,就是从上表的3开始往后数五个数,10例:46则是看作6+6+6+6,6+6由上表可知为14,14再往后数12个数得出为46=30八进制复杂计算(文字比较难说明,但是大致还是和我们十进制的计算方式一样,只是九九乘法表换成上面三张表作业1.成立。可以以5......
  • 痞子衡嵌入式:不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IPCMD读写异常。痞子衡曾经写过一篇文章《改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常》,这篇文章提出了一个观点,即对于MCU外设寄存器应......
  • 3. 寄存器(内存) | 问题 3.7 - 3.10
    问题3.7编程,将10000H  ~  1000FH做为连本带利,初始状态是空的,将AX,BX,DS中的数据入栈。#初始化SS,SPss=1000H[sp]=[0010],则[ssss:sp]=[1000H:0010H]movax,1000movss,ax#sp是指针,不是段寄存器,可以直接传数据,不用ax中转movsp,0010pushaxpushbxpu......
  • 22_BKP备份寄存器&RTC实时时钟
    BKP备份寄存器&RTC实时时钟BKP简介BKP基本结构一个数据寄存器存2字节RTC简介选LSE的32.768kHZ的时钟频率,因为支持VBAT供电RTC框图RTC基本结构硬件电路供电方案RTC操作注意事项读写备份寄存器接线图代码main.c#include"stm32f10x.h"......
  • 物理内存与外设寄存器
    物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。物理地址空间,一部分给物理R......
  • 2. 寄存器(内存) | 检测点3.1
          TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditionalIndonesianSlovakCzechItalianSlovenianDanishJapanese......
  • 十三、BKP备份寄存器&RTC实时时钟
    十一、BKP备份寄存器&RTC实时时钟Unix时间戳Unix时间戳(UnixTimestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间UTC/......