ARMv8 寄存器
本文主要介绍 Armv8/v9 指令集架构中常用部分,详细的还是要看 Arm architecture reference manual.
ARMv8 架构
ARMv8 架构支持3种指令集: T32, A32, A64
ARMv8 架构有两种执行状态: AArch32, AArch64
一个App 可以混合使用 T32 和 A32, 但是不能混合使用 A32 和 A64.
Registers in AArch64
The general purpose registers
该架构提供了 31 个通用寄存器。每个寄存器都可以用作 64 位 X 寄存器 (X0…X30),或用作 32 位 W 寄存器 (W0…W30)。这是查看同一寄存器的两种不同方式。比如这张寄存器图,W0是X0的低32位,W1是X1的低32位:
对于数据处理指令,选择X或W决定操作的大小。使用X寄存器将导致 64 位计算,使用 W 寄存器将导致 32 位计算。
此示例执行 32 位整数加法:ADD W0, W1, W2
此示例执行 64 位整数加法:ADD X0, X1, X2
写入寄存器时W,如上例所示,64 位寄存器的前 32 位被清零。
特殊寄存器
Zero register
零寄存器XZR和WZR始终读为 0 并忽略写入。
这个寄存器在编程中非常有用,因为它可以简化某些操作,例如:
- 当需要将一个寄存器清零时,可以将 zero register 直接作为源操作数,这样就能够避免使用额外的立即数或操作来实现清零。
- 在某些算术或逻辑操作中作为一个操作数使用,可以便捷地实现特定的功能。例如,如果仿效清零操作,可以通过将某个寄存器和 XZR/WZR 进行 OR 操作实现。
stack pointer
- ARMv8体系结构为每个异常等级都实现了一个栈指针SP_ELn,以异常等级为后缀
- 当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
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)(备份程序寄存器)
用于保存发生异常时的处理器状态
- ARMv8体系结构为每个可作为target exception level的异常等级都实现了一个SPSR_ELn,以异常等级为后缀
- 当异常发生时,处理器的状态将被保存在target exception level的SPSR寄存器;当异常返回时,将使用的SPSR寄存器中的值恢复PSTATE
- 保存异常发生时PSTATE状态的另一个作用,就是可以在异常处理时通过SPSR寄存器判断发生异常时的PE状态,例如发生异常时PE的异常等级和执行状态
SPSR寄存器保存的很多状态位与PSTATE中是相同的。这里特别说明一下M[4]和M[3:0]的含义
① M[4]:记录异常发生时的执行状态,即PSTATE.nRW位。0表示AArch64执行状态,1表示AArch32执行状态
② M[3:0]:记录异常发生时的异常等级及其使用的栈指针
- 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
Exception Link Registers (ELRs))
- ARMv8体系结构为每个可作为target exception level的异常等级都实现了一个ELR_ELn,以异常等级为后缀
- 当异常发生时,异常返回地址将被保存在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。在实现上,则是一组标志位的集合
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访问寄存器所需的最低权限。
ARMv8 寄存器的更多相关文章
- ARMv8寄存器手册
这份手册是从DS5里拷贝出来的,他是以网页的形式用浏览器打开,方面查看寄存器. ARMv8_regs_xhtml.tar.gz
- ARMv8 架构与指令集.学习笔记
目 录 第1章 ARMv8简介. 3 1.1基础认识. 3 1.2 相关专业名词解释. 3 第2章 Execution State 4 2.1 提供两种Execution State 4 2.2 决定 ...
- ARM 技术文档
1. 相关链接 ARM官网: http://infocenter.arm.com/ 比较有用的几个目录: ARM Technical Support Knowledge Articles 一些关于A ...
- DOS程序员手册(九)
第14章参考手册概述 本书余下的章节将向读者们介绍BIOS.DOS各种各样API函数和服务,作为一名程 序员,了解和掌握这些知识是很有好处的.在所介绍的参考手册中,每部手册都汇集了大 量的资源 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器
1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...
- armv8(aarch64)linux内核中flush_dcache_all函数详细分析【转】
转自:http://blog.csdn.net/qianlong4526888/article/details/12062809 版权声明:本文为博主原创文章,未经博主允许不得转载. /* * __ ...
- armv8(aarch64)linux内核中flush_dcache_all函数详细分析
/* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...
- ARMv8 Linux内核源代码分析:__flush_dcache_all()
1.1 /* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ EN ...
- ARMv8 Linux内核head.S源码分析
ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...
- ARMv8 Linux内核异常处理过程分析
NOTE:为了方便大家阅读,制作了PDF版文档.下载请猛戳这里 老样子,为了赚点积分下载其它人的文件,下载以上资料须要资源分2分. 假设没有积分请留言全部文档,留下邮箱就可以. 看了Linaro提供的 ...
随机推荐
- springsecurity:权限与异常处理
权限即不同用户可以使用不同功能 实现前置: 在上一次登录与校验中,我们将authentication存入到SecurityContextHolder中,后续我们需要从FilterSecurityInt ...
- python adb 安卓app性能测试
主要是进行cpu.内存.冷启动.热启动.流量.电量的监测 可获取到相关数据,同竞类产品对比,或者同版本对比 cpustatus adb命令:adb shell "dumpsys cpuinf ...
- python global将结果存储起来给另外一个文件对象使用
python global将结果存储起来给另外一个文件对象使用 使用场景: 在aaa.py文件里面操作数据生成结果C 然后再在bbb.py文件里面使用C 下面是aaa.py代码: #!/usr/bin ...
- 【RabbitMQ】03 订阅模式
Pub / Sub 订阅模式 特点是 一条消息可以给多个消费者接收了 首先创建订阅模式生产者发生一些代码变动: package cn.dzz.pubSub; import com.rabbitmq.c ...
- 大语言模型(LLM)运行报错:AttributeError: module 'streamlit' has no attribute 'cache_resource'
解决方法: https://blog.csdn.net/javastart/article/details/130785100 (图:https://blog.csdn.net/javastart/a ...
- Trump 黑马 or 搅局者? 讲座视频分享
沈逸-特朗普能走多远 https://www.bilibili.com/video/BV1r7411t7VS/?spm_id_from=333.788.videocard.2 国际关系 对 ...
- python报错:`visualize_sharding` requires `rich` to be installed.
Rich是python的一个绘图library,需要手动安装. 解决方法: pip install Rich
- 不务正业的再次胡想——chatgpt在“智能辅助编程”外的另一个可能场景"智能论文写作辅助”
在chatgpt4出来后震惊了很多人,但是很多人也觉得好像用处不大:可以说chatgpt4确实更加智能了,在语言对话上更加的智能,很多情况下已经很难分辨出这货是个机器人,但是现在这东西好像确实也没有太 ...
- JMH:基准测试工具套件-应用
1.背景 多线程性能测试 JMH:简介 JMH is a Java harness for building, running, and analysing nano/micro/milli/macr ...
- 执行maven时报内存溢出OutOfMemory
解决的方法是调整java的堆大小的值. Windows环境中 找到文件%M2_HOME%\bin\mvn.bat ,这就是启动Maven的脚本文件,在该文件中你能看到有一行注释为: @REM set ...