armv8体系结构基础

ARMv8体系结构基础

armv8是arm公司发布的第一代支持64位处理器的指令集和体系结构,且能够兼容上一代体系结构指令集,一次可以运行32位应用程序和64位应用程序。

armv8体系结构中的基本概念

  • 处理机:处理器处理事务的过程称为处理机(PE-process element)
  • 执行状态:处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等,armv8定义了两种执行状态:
    1. AArch64:64位的执行状态
      • 提供31个64位通用寄存器
      • 提供64位的PC、SP、ELR(异常链接寄存器)
      • 支持A64指令集
      • 定义armv8异常模型,支持4个异常等级EL0-EL3
      • 提供64位内存模型
      • 定义一组处理器状态PSTATE用来保存PE的状态
    2. AArch32:32位执行状态
      • 提供13个32位通用寄存器,再加上PC、SP、LR寄存器
      • 支持A32和T32指令集
      • 支持armv7-a异常模型,基于PE模式并映射到armv8异常模型中
      • 提供32位虚拟内存访问机制
      • 定义一组处理器状态PSTATE用来保存PE的状态
  • 系统寄存器的命名:在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协处理器

  1. 通用系统控制寄存器
  2. 调试寄存器
  3. 性能监控寄存器
  4. 活动监控寄存器
  5. 统计扩展寄存器
  6. RAS寄存器
  7. 通用定时器寄存器
  • 系统寄存器支持不同异常等级的访问,通常系统寄存器会使用Reg_ELn的方式表示:

  • 处理器处于高异常等级时可以访问低异常等级的系统寄存器

  • 大部分系统寄存器不支持处理器处于EL0等级时访问

  • 通过MSR和MRS访问系统寄存器

    • mrs 目标 源 -> 从源(系统寄存器)中读取数据存放到目标中
    • msr 目标 源 -> 从源中读取数据写入目标(系统寄存器)中

armv8体系结构基础
http://example.com/2022/11/21/armv8体系结构基础/
作者
Hector
发布于
2022年11月21日
许可协议