armv8体系结构基础
armv8是arm公司发布的第一代支持64位处理器的指令集和体系结构,且能够兼容上一代体系结构指令集,一次可以运行32位应用程序和64位应用程序。
armv8体系结构中的基本概念
- 处理机:处理器处理事务的过程称为处理机(PE-process element)
- 执行状态:处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等,armv8定义了两种执行状态:
- AArch64:64位的执行状态
- 提供31个64位通用寄存器
- 提供64位的PC、SP、ELR(异常链接寄存器)
- 支持A64指令集
- 定义armv8异常模型,支持4个异常等级EL0-EL3
- 提供64位内存模型
- 定义一组处理器状态PSTATE用来保存PE的状态
- AArch32:32位执行状态
- 提供13个32位通用寄存器,再加上PC、SP、LR寄存器
- 支持A32和T32指令集
- 支持armv7-a异常模型,基于PE模式并映射到armv8异常模型中
- 提供32位虚拟内存访问机制
- 定义一组处理器状态PSTATE用来保存PE的状态
- AArch64:64位的执行状态
- 系统寄存器的命名:在AArch64状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器,使用方法如下:
_Elx (x=0/1/2/3带表不同的异常等级)
armv8异常等级
等级 | 描述 |
---|---|
EL0 | 用户特权,用于运行普通的用户程序 |
EL1 | 系统特权,用于操作系统内核,如果使能了虚拟化扩展,运行虚拟机系统内核 |
EL2 | 运行虚拟化扩展的虚拟机监控器(hypervisor) |
EL3 | 运行安全世界中的安全监控器(secure monitor) |
armv8寄存器(AArch64)
通用寄存器
- 31个通用寄存器:X0-X30
- W表示低32位数据,W0表示X0低32位
- X0-X7:用于传递参数和结果
- X8:用于返回结果
- X9-X15:caller save register,易失寄存器,子函数使用这些寄存器时无需save/restore,如果需要下次使用的话,由子函数的caller保存这些参数
- X16-X18:平台寄存器
- X19-X28:callee save register,非易失寄存器,子函数使用这些寄存器时需要save/restore
- X29:栈帧指针寄存器(FP)
- X30:链接寄存器(LR)
PSTATE寄存器
使用PSTATE寄存器表示当前处理器状态,类似armv7中的cpsr寄存器,根据各个字段的功能可将PSTATE寄存器的分割为下面几类:
- 条件标志位:N、Z、C、V分别表示负数标志位、0标志位、进位标志位、有符号溢出标志位
- 执行状态控制:
- nRW:0-处于AArch64状态,1-处于AArch32状态
- EL:表示当前异常等级,0-3分别表示EL0-EL-3
- SP:选择SP寄存器,0-SP_EL0, 1-SP_ELn
- 异常掩码标志位:
- A:用来屏蔽系统错误
- I:用来屏蔽IRQ
- F:用来屏蔽FIQ
特殊寄存器
PC寄存器
- 通常用来指向当前运行指令的下一条指令地址,与流水线模式有关,无法通过指令直接访问此寄存器
SP寄存器
- 4个异常等级每个异常等级都有一个专门的SP寄存器即SP_ELn
- 异常等级高于EL0时,处理器也可以访问SP_EL0寄存器作为一个临时寄存器,如linux内核中使用该寄存器作为进程中task_struct数据结构的指针
- 异常等级处于EL0时,只能访问SP_EL0,无法访问更高等级的SP
备份程序状态寄存器SPSR
- 异常发生时,处理器会将PSTATE寄存器中的值备份在SPSR寄存器中,异常处理完成并返回时,再从SPSR寄存器中回复PSTATE寄存器
ELR寄存器
- 存放异常返回的地址
CurrentEL寄存器
- 表示PSTATE寄存器中的EL字段,即当前的异常等级,使用MRS指令可以读取当前异常等级
DAIF寄存器
- 表示PSTATE寄存器中的异常掩码标志位D、A、I、F
SPSel寄存器
- 表示PSTATE寄存器中的SP字段,用于选择SP寄存器
系统寄存器
7类系统寄存器代替armv7中的cp15协处理器
- 通用系统控制寄存器
- 调试寄存器
- 性能监控寄存器
- 活动监控寄存器
- 统计扩展寄存器
- RAS寄存器
- 通用定时器寄存器
系统寄存器支持不同异常等级的访问,通常系统寄存器会使用Reg_ELn的方式表示:
处理器处于高异常等级时可以访问低异常等级的系统寄存器
大部分系统寄存器不支持处理器处于EL0等级时访问
通过MSR和MRS访问系统寄存器
- mrs 目标 源 -> 从源(系统寄存器)中读取数据存放到目标中
- msr 目标 源 -> 从源中读取数据写入目标(系统寄存器)中
armv8体系结构基础
http://example.com/2022/11/21/armv8体系结构基础/