浅析ARMv8体系结构:程序运行寄存器

发布时间:2026/7/6 21:34:21

浅析ARMv8体系结构:程序运行寄存器 文章目录概述通用寄存器程序状态寄存器NZCV标记位特殊寄存器PC寄存器SP寄存器SPSR寄存器异常链接寄存器ELRCurrentEL寄存器SPSel寄存器DAIF寄存器NZCV寄存器PAN寄存器UAO寄存器零寄存器系统寄存器相关参考概述ARM体系架构下程序运行依赖一系列的寄存器用于记录运行状态、过程数据以及系统配置等这些寄存器大体可分为以下几个类别通用寄存器程序状态寄存器特殊寄存器系统寄存器。通用寄存器AArch64运行状态支持31个64位的通用寄存器分别是X0X30寄存器而AArch32状态支持16个32位的通用寄存器。通用寄存器除了用于数据运算和存储之外还可以在函数调用过程中起到特殊作用ARM64架构的函数调用标准和规范对此有所约定。在AArch64状态下使用X来表示64位通用寄存器如X0、X30等。另外还可以使用W来表示低32位的数据如W0表示X0寄存器的低32位数据W1表示X1寄存器的低32位数据通用寄存器中有2个相对特殊的寄存器X29和x30主要用于函数调用过程其中X29栈帧寄存器可以通过别名FP进行引用用于记录函数调用栈帧的基地址X30链接寄存器可以通过别名LR进行引用用于保存函数调用的返回地址。程序状态寄存器在AArch64里使用PSTATE寄存器来表示准确来说PSTATE并不是单一的寄存器而是一系列系统状态的组合。PSTATE状态通常是通过其它特殊的系统寄存器进行访问包括CurrentEL、DAIF、SPSel、PAN、UAO以及NZCV寄存器这些寄存器可以通过指令MRS/MSR进行访问和操作。NZCV标记位标志全称含义触发条件ZZero结果全0运算输出所有bit0Z1否则0NNegative结果最高位运算结果最高bit(bit63/X, bit31/W)1 → N1视作有符号负数CCarry进位/借位无符号溢出ADD最高位产生进位SUB最高位产生借位VOverflow有符号补码溢出两个同符号数相加结果符号反转两异号数相减等价同号相加溢出C 只管无符号溢出纯二进制进位和正负无关V 只管补码有符号溢出符号位出错N/Z 只是结果属性和溢出无关特殊寄存器ARMv8架构除了支持31个通用寄存器之外还提供多个特殊的寄存器PC寄存器PC寄存器通常用来指向当前运行指令的下一条指令的地址用于控制程序中指令的运行顺序ARM不支持通过指令来直接访问它但使用分支跳转和返回指令可以间接改变。SP寄存器ARMv8架构支持4个异常等级每一个异常等级都有一个专门的SP寄存器SP_ELn存放当前异常等级下程序运行使用的栈地址如处理器运行在EL1时选择SP_EL1寄存器作为SP寄存器。SP_EL0EL0下的SP寄存器。SP_EL1EL1下的SP寄存器。SP_EL2EL2下的SP寄存器。SP_EL3EL3下的SP寄存器。当处理器运行在比EL0高的异常等级时处理器可以访问如下寄存器。当前异常等级对应的SP寄存器SP_ELn。EL0对应的SP寄存器SP_EL0可以当作一个临时寄存器如Linux内核里使用该寄存器存放进程的task_struct数据结构的指针。当处理器运行在EL0时它只能访问SP_EL0而不能访问其他高级的SP寄存器。SPSR寄存器当CPU进入异常处理时硬件会自动把当前CPU的程序状态保存到SPSRSaved Process Status Register寄存器中。SPSR寄存器内容定义如下当异常将要发生时CPU会把PSTATE的值暂时保存到SPSR里当异常处理完成并返回时CPU再把SPSR的值恢复到PSTATE。异常链接寄存器ELRELR寄存器用于存放异常返回地址。当处理器发生异常时会将异常返回地址保存在异常级别对应的ELR寄存器中。AArch64位每个异常级别都提供了ELR寄存器。CurrentEL寄存器CurrentEL寄存器用于访问PSTATE寄存器中的EL字段EL保存了当前任务运行的异常等级使用MRS指令可以读取当前异常等级MRS X0, CurrentEL其中0表示EL01表示EL12表示EL23表示EL3。SPSel寄存器SPSel寄存器用于访问PSTATE寄存器中的SP字段用于ELx异常等级不包括EL0选择SP寄存器可以是SP_EL0或SP_ELx。当PSTATE.SPSel 0时CPU使用SP_EL0作为当前任务的堆栈寄存器反之则使用与异常等级对应的SP寄存器。DAIF寄存器DAIF寄存器用于访问PSTATE寄存器中的{D, A, I, F}字段用于异常、中断以及调试开关控制。NZCV寄存器NZCV寄存器用于访问PSTATE寄存器中的{N, Z, C, V}字段。PAN寄存器PAN寄存器用于访问PSTATE寄存器中的PANPrivileged Access Never特权禁止访问字段。UAO寄存器UAO寄存器用于访问PSTATE寄存器中的UAOUser Access Override用户访问覆盖字段。零寄存器ARMv8架构提供两个零寄存器zero register这些寄存器的内容全是0可以用作源寄存器也可以用作目标寄存器。WZR寄存器是32位的零寄存器XZR是64位的零寄存器。系统寄存器除了上面介绍的通用寄存器和特殊寄存器之外ARMv8架构还定义了很多的系统寄存器通过访问和设置这些系统寄存器来完成对处理器不同的功能配置。在ARMv7架构里我们需要通过访问CP15协处理器来间接访问这些系统寄存器而在ARMv8架构中没有协处理器可直接访问系统寄存器。ARMv8架构支持如下7类系统寄存器通用系统控制寄存器调试寄存器性能监控寄存器活动监控寄存器统计扩展寄存器RAS寄存器通用定时器寄存器系统寄存器支持不同的异常等级的访问通常系统寄存器会使用Reg_ELn的方式来表示Reg_EL1处理器处于EL1、EL2以及EL3时可以访问该寄存器。Reg_EL2处理器处于EL2和EL3时可以访问该寄存器。大部分系统寄存器不支持处理器处于EL0时访问但也有一些例外如CTR_EL0寄存器。相关参考《奔跑吧Linux内核》《ARM64体系结构编程与实践》PSTATE.SPSel, SP_EL0的实际使用

相关新闻