登录后台

页面导航

本文编写于 507 天前,最后修改于 450 天前,其中某些信息可能已经过时。

ARMv8是ARM公司发布的第一代支持64位处理的指令集和体系结构。它在扩充64位寄存器的同时提供了对上一代体系结构指令集的兼容,因此它提供了运行32 位和 64位应用程序的环境。

基本概念

arm处理器实现的是精简指令集结构。有如下比较重要的概念

  • 处理机(processing elemen PE):处理器处理事务的过程抽象成处理机
  • 执行状态(execution state):处理器运行所处的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。在armv8中有两个执行状态:AArch64和AArch32。主要的区别在于通用寄存器的个数与位宽,pc寄存器、栈指针、ELR寄存器的位宽,指令集,以及异常模型。学习的重点放在AArch64上。后续笔记没有特别指出的地方统一都指在AArch64状态下。
  • ARMv8指令集:针对不同的执行状态提供不同指令集的支持,包括A64、A32、T32。指令集是处理器体系结构设计的重点之一。ARMv8架构中最大的改变是增加了新的64位的指令集,它可以处理64位宽的寄存器和数据并且使用64位的指针来访问内存。需要注意的是A64指令集的指令宽度是32位,而不是64位。

异常等级

AArch64状态的异常等级(exception level)确定了处理器当前运行的特权级别,类似于ARMv7体系结构中的特权等级。

  • EL0:用户特权,用于运行普通用户程序
  • EL1:系统特权,通常用于操作操作系统内核。如果系统使能了虚拟化扩展,运行虚拟机操作系统内核。
  • EL2:运行虚拟化扩展的虚拟机监控器(hypervisor)
  • EL3:运行安全世界中的安全监控器(secure monitor)

寄存器

架构中支持31个64位的通用寄存器,分别是X0-X31寄存器。除了用于数据计算和存储之外,通用寄存器还可以在函数的调用过程中起到特殊作用。W表示寄存器低32位的数据。

2023-05-17T14:39:13.png

处理器状态

架构规定使用PSTATE寄存器来表示当前处理器状态(processor state)。包括条件标志位(N:负数标志位、Z:零标志位、C:进位标志位、V:有符号数溢出标志位)、执行状态控制(SS、IL、nRW:当前执行状态、EL:当前异常等级、SP:选择SP寄存器)、异常掩码标志位(D、A、I、F)、访问权限(PAN、UAO)。

一些特殊的寄存器

  • 零寄存器:XZR(64位零寄存器)、WZR(32位零寄存器)
  • PC指针寄存器:用来指向当前运行指令的下一条指令的地址,用于控制程序中指令的运行顺序,但是编程人员无法直接访问
  • SP寄存器:在每一个异常等级下都有一个专门的SP寄存器。当运行在非EL0下时,可以访问SP_EL0和SP_ELn。
  • SPSR寄存器:saved program status register。用于在发生异常时保存PSTATE寄存器的值,并在异常处理完成并返回时,将SPSR寄存器的值恢复到PSTATE寄存器中。
  • ELR寄存器:exception linker register。存放异常返回地址。
  • CurrentEL寄存器:表示PSTATE寄存器中的EL字段,其中保存了当前异常等级。
  • DAIF寄存器:表示PSTATE寄存器中的D、A、I、F字段
  • SPSel寄存器:表示PSTATE寄存器中的SP字段,用于在SP_EL0和SP_ELn中选择SP寄存器