ARMv8寄存器解释
·
AArch64寄存器分为五大类:通用GP寄存器、PSTATE状态、SP/ELR/SPSR异常专用寄存器、系统控制寄存器(SysReg)、NEON/FPU向量浮点寄存器;所有系统寄存器按ELx分级隔离是ARMv8安全隔离(TrustZone、权限管控、漏洞防护)的硬件根基。
重要前提:AArch64寄存器天然64bit,Xn=64位完整寄存器、Wn=低32位,写Wn自动高位清零(区别ARMv7 32位架构,逆向关键特征)。
一、通用整数寄存器:X0~X30 + XZR/WZR(32个逻辑寄存器)
共31个可编程通用寄存器 + 1个硬件零寄存器,EL0/EL1/EL2/EL3共用同一组物理GP,靠特权级+异常现场保存隔离上下文。
1. 通用寄存器功能划分(遵循AAPCS64调用规范,安卓Native、内核汇编通用)
|
寄存器
|
别名
|
用途(安全/逆向重点)
|
|
X0~X7
|
入参/返回寄存器
|
函数前8个入参;X0/X1存放返回值;syscall中X8=系统调用号(Linux/Android内核SVC入口硬性约定)
|
|
X8
|
-
|
间接结果存放、syscall编号专用
|
|
X9~X15
|
临时易毁寄存器
|
caller-saved,函数调用不保护,漏洞ROP常用跳板寄存器
|
|
X16/X17
|
IP0/IP1
|
链接器临时、PLT跳转、动态链接桩代码专用,ELF GOT跳转关键
|
|
X18
|
Platform寄存器
|
Linux/Android内核固定用作平台指针,用户态禁止随意篡改
|
|
X19~X28
|
被调用保存寄存器
|
callee-saved,函数进入/退出必须栈上保存恢复;栈溢出利用最难覆盖
|
|
X29
|
FP(Frame Pointer)
|
栈帧基址,开启-fno-omit-frame-pointer时用于栈回溯,安卓原生调试、栈溢出溯源核心;CFI防护依赖FP
|
|
X30
|
LR(Link Register)
|
函数调用返回地址,
BL/BLR
自动写入X30;
RET=BR X30
;
控制流劫持最关键目标,PAC签名保护对象
|
|
XZR/WZR
|
Zero Reg
|
硬件只读零寄存器:读永远0,写无效;用于常量置0、地址偏移运算、条件判空
|
补充:没有独立PC物理寄存器,AArch64不能直接MOV修改PC,只能通过BR/BL/RET/ERET跳转,硬件从根源减少任意篡改程序计数器漏洞。
二、栈指针寄存器 SP_ELx(分特权级独立物理寄存器,4组硬件SP)
ARMv8每个异常级别拥有独立硬件栈指针,硬件隔离栈,是内核/TEE栈隔离的基础:
SP_EL0、SP_EL1、SP_EL2、SP_EL3,全部64位。
SPSel(PSTATE第0位):SP选择开关
- SPSel=0:当前特权级代码强制使用SP_EL0(用户栈)
- SPSel=1:使用本级别专属SP_ELx(EL1用SP_EL1、EL3用SP_EL3)
- EL0(应用层APP):只能使用SP_EL0,无法访问SP_EL1/2/3
- EL1(Linux内核):可切换SPSel,进程用户态栈SP_EL0,内核栈SP_EL1
- EL3(ATF/TrustZone Monitor):专属SP_EL3,安全世界栈,Normal World无法访问
Android安全点:提权漏洞常利用SPSel配置缺陷跨级别篡改栈指针。
三、异常上下文寄存器:ELR_ELx + SPSR_ELx(分EL0~EL3四组)
每组ELx配套一对寄存器,硬件自动在异常触发时保存现场、ERET时自动恢复,4个EL共8个物理寄存器:
- ELR_ELx(Exception Link Register,64bit)
异常触发时:硬件自动把异常发生处PC存入ELR_ELx;
异常返回指令ERET:硬件从ELR_ELx加载回PC。
漏洞利用:异常劫持、SVC/SMC劫持核心,篡改ELR即可跳转任意地址。
- SPSR_ELx(Saved Program Status Register,32bit)
异常触发自动存入当前PSTATE所有标志;ERET时写回PSTATE;
存储:NZCV条件标志 + DAIF中断屏蔽 + CurrentEL + SPSel,无法直接MSR/PSTAE,只能通过SPSR_ELx读写历史状态。
四、PSTATE:处理器状态集合(无独立物理寄存器,位域分散硬件状态)
PSTATE是处理器实时状态位合集,不能整体读写,位域分为:条件标志、中断屏蔽、特权配置。
|
位域
|
位位置
|
功能说明(安全重点)
|
|
N(负)
|
31
|
运算结果为负置1
|
|
Z(零)
|
30
|
运算结果为0置1
|
|
C(进位)
|
29
|
无符号进位
|
|
V(溢出)
|
28
|
有符号溢出
|
|
D
|
9
|
调试异常屏蔽位
|
|
A
|
8
|
SError(硬件致命异常)屏蔽
|
|
I
|
7
|
IRQ普通中断屏蔽
|
|
F
|
6
|
FIQ快中断屏蔽
|
|
CurrentEL
|
[3:2]
|
当前运行异常级别:00=EL0、01=EL1、10=EL2、11=EL3
|
|
SPSel
|
0
|
SP栈指针选择位
|
读写规则:EL0仅能读写NZCV;DAIF/CurrentEL/SPSel仅EL1+高特权可MSR修改;关闭I位=关内核中断。
五、系统寄存器(SysReg,ARMv8最庞大体系,MRS/MSR专用访问,按_ELx划分访问权限)
访问指令:MRS Rd, SYSREG_ELx(读) / MSR SYSREG_ELx, Rd(写);低于寄存器后缀ELx的特权级无法访问,硬件拦截。
按功能分类(Android内核/TEE/MMU/TrustZone高频寄存器):
5.1 MMU地址转换&内存管理(EL1内核核心,Linux页表管理)
- TTBR0_EL1:用户空间(EL0)页表基地址(低VA地址,0~2^48)
- TTBR1_EL1:内核空间(EL1)页表基地址(高VA地址,内核高半区)
- TCR_EL1:转换控制寄存器:配置地址位数(39/48bit)、页粒度(4K/16K/64K)、内存属性、页表级数
- MAIR_EL1:内存属性寄存器,配置Normal/Device/nGnRE等缓存属性
- SCTLR_EL1:系统控制寄存器(内核开关总闸)
- Bit0(M):MMU总开关
- Bit2(C):数据Cache开启
- Bit12(I):指令ICache开启安卓内核开机汇编必配置SCTLR_EL1开启MMU。
5.2 故障异常信息寄存器(崩溃、缺页、非法访问溯源)
1.ESR_ELx:异常原因编码寄存器
EC域(31:26)=异常类型(SVC/SMC/缺页/权限错误/未定义指令);ISS=异常附加信息;安卓crash、内核oops依靠ESR解析故障。
2.FAR_ELx:Fault Address
出错访问的虚拟地址,缺页异常保存故障VA。
3.VBAR_ELx:异常向量基址
指定当前EL异常向量表起始地址,Linux vectors 基址写入VBAR_EL1。
5.3 TrustZone安全管控寄存器(仅EL3可访问,ATF固件核心)
1.SCR_EL3:安全配置寄存器(Normal/Secure世界总开关)
- NS(bit0): 0=Secure安全世界、1=Normal普通安卓世界
- IRQ/FIQ/EA:配置三类中断路由到EL3还是EL1
2.SPSR_EL3/ELR_EL3:SMC指令触发安全世界切换时保存Normal现场;SMC是安卓指纹/SE密钥TEE调用唯一入口。
5.4 定时器、计数器、ID寄存器(只读ID寄存器用于SOC识别)
- CNTFRQ_EL0:系统定时器时钟频率;CNTVCT_EL0虚拟计数器(用户态可读,计时)
- MIDR_EL1:CPU型号ID,芯片架构/大核小核识别,高通MTK内核判定依据
5.5 PAC/BTI安全扩展寄存器(ARMv8.3+,安卓高版本CFI/指针认证)
PACIBKEY_EL1、IAKEY_EL1:PAC签名密钥寄存器,硬件指针加密,防ROP,安卓12+默认启用。
六、NEON/FPU/SIMD向量浮点寄存器 V0~V31(32×128bit)
每个Vn=128bit,可分段访问不同位宽:
- Qn:128bit全宽(向量运算)
- Dn:低64bit双精度浮点
- Sn:低32bit单精度浮点
- Hn:16bit半精度浮点、Bn字节
- 调用规范AAPCS64:V0~V7传浮点入参,V0/V1浮点返回值;V8~V15 callee保存,V16~V31 caller临时寄存器。
- Android场景:视频硬解、OpenGL、AI NN推理、libc浮点运算全依赖V寄存器;恶意代码常利用向量寄存器隐藏Shellcode。
硬件特性:EL0默认可使用浮点,内核可通过CPACR_EL1开关全局禁用FPU。
七、补充关键安全规则(安卓逆向/漏洞必备)
1.寄存器特权隔离规则
后缀_EL1寄存器:EL0不可读写,EL1/EL2/EL3可访问;_EL3寄存器只有EL3能读写,Normal世界(安卓Linux)完全无法触碰。
2. AArch32兼容说明
切到AArch32(32位ARM/Thumb)后寄存器变为ARMv7架构R0~R15,SP/R13、LR/R14、PC/R15,寄存器模型完全重构;现代64位安卓APP默认AArch64。
3. 不能直接修改系统寄存器
必须MRS/MSR,硬件权限校验,非法访问触发未定义异常。
八、精简分类速记
- 通用整数:X0~X30+XZR(代码运算、传参)
- 异常现场:SP_ELx / ELR_ELx / SPSR_ELx(栈+异常现场保存)
- 状态:PSTATE(标志+中断+特权)
- 系统寄存器:TTBR/TCR/SCR/ESR等(MMU、TrustZone、异常控制)
- 向量浮点:V0~V31(NEON多媒体浮点)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)