当前位置: 首页 > article >正文

《learn_the_architecture_-_aarch64_exception_model》学习笔记

1.当发生异常时,异常级别可以增加或保持不变,永远无法通过异常来转移到较低的权限级别。从异常返回时,异常级别可能会降低或保持不变,永远无法通过从异常返回来移动到更高的权限级别。EL0级不进行异常处理,异常必须在比EL0更高的异常级别处理。

2.ARM A-profile处理器(即A系列)的虚拟内存系统通过内存管理单元(MMU)管理内存访问权限。MMU使用转换表将虚拟地址映射到物理地址,并设置内存区域的属性和访问权限,包括读/写权限。访问权限分为特权和非特权访问,特权访问由高异常级别(如EL1、EL2、EL3)控制,通常用于操作系统内核或虚拟机管理程序,而非特权访问用于低级别的用户模式(EL0)。当应用程序在EL0执行时,内存访问权限会根据非特权访问权限进行检查,确保其不能访问超出权限的区域。而EL1、EL2、EL3的内存访问根据特权访问权限进行检查。MMU的配置存储在系统寄存器中,这些寄存器的访问权限由当前的异常级别控制,确保只有高权限级别才能修改MMU的配置,从而保障系统的安全性和稳定性。

3.SCTLR_ELx,即System Control Register。是ARM架构中用于控制系统行为的关键寄存器之一。不同的异常级别(EL0,EL1,EL2,EL3)都有相应的SCTLR_ELx寄存器,EL1和EL0共享相同的MMU配置,并且控制仅限于在EL1上运行的特权代码。因此没有SCTLR_EL0,所有控制均来自EL1可访问寄存器。较高的异常级别有权访问控制较低级别的寄存器,反之则不行。例如,如果需要,EL2有权访问SCTLR_EL1。无法从EL0访问该寄存器,任何尝试这样做都会生成异常。常见的系统寄存器如下表:

4.ARM架构中,处理元件(PE)在AArch32和AArch64执行状态间的切换只能在异常级别(EL)变化时发生。较低EL到较高EL时,可以保持当前状态或切换为AArch64;较高EL到较低EL时,可以保持或切换为AArch32。64位层可以托管32位层,但32位层不能托管64位层。例如,64位操作系统可运行64位和32位应用程序,而32位操作系统只能运行32位应用程序。AArch32提供与旧32位架构的向后兼容性,从Armv9-A开始在所有异常级别都必须支持AArch64,并且仅可选择在EL0级别支持AArch32。即除EL0其他异常级别均为 AArch64,并且复位时执行状态始终为 AArch64。这意味着旧版应用程序可以运行,但不能运行内核、虚拟机管理程序或固件。

5.AArch64架构支持多种安全状态,主要分为安全状态和非安全状态。想要从一种安全状态切换到另一种安全状态时必须通过EL3。如果实现了TrustZone,则处理器可以处于安全状态或非安全状态,这由SCR_EL3.NS位选择。安全状态下,处理元件(PE)可访问安全和非安全物理地址空间,适用于运行可信软件;而在非安全状态下,PE仅能访问非安全物理地址空间,适用于普通操作系统。EL3 是最高特权的异常级别,EL3 的安全状态是固定的,EL3 能够访问存储系统寄存器的所有副本。在Armv8-A架构中,EL3始终处于安全状态。而在Armv9-A架构中,EL3属于安全状态,除非实现了RME(Root Management Entity)。

Armv9-A新引入了对Realm Management Extension(RME)的支持。当实现RME时,支持两种额外的安全状态:Realm状态和Root状态。在Realm状态下,处理元件(PE)可以访问非安全和Realm物理地址空间;而在Root状态下,PE可以访问所有物理地址空间,且Root状态仅在EL3中可用。

6.对于任何特定处理器,是否实现所有异常级别以及每个实现的异常级别允许哪些执行状态都是可选择的,EL0和EL1是唯一必须实现且强制执行的异常级别,EL2和EL3是可选的。EL2包含许多虚拟化功能,没有EL2的实现无法访问这些功能。EL3是唯一可以更改安全状态的级别,如果实现选择不实现EL3,则该PE将只能访问单个安全状态。在Armv8.0-A中,EL2只存在于Non-secure状态,因为Secure状态下没有虚拟化支持。Armv8.4-A添加了S.EL2作为带有使能位(SCR_EL3.EEL2)的可选功能,以提供向后兼容性。

7.异常是指任何可能导致当前正在执行的程序挂起的事件,发生异常会导致状态发生变化,以执行代码来处理该异常。当发生异常时,处理器不会移至当前代码中的下一条指令,而是停止当前执行并分支到一段代码来处理请求。该代码称为异常处理程序,一旦事件处理完毕,执行就可以返回到原来的程序。Arm架构将异常分为两大类:同步异常和异步异常。同步异常是由当前正在执行的指令引起或与之相关的异常。同步异常与执行流同步,因为它们与当前执行的指令直接相关。例如,尝试写入MMU定义的只读位置的指令将触发同步异常。常见的同步异常有:Invalid instructions and trap exceptions、Memory accesses(内存访问异常是软件层面的问题,通常与页表、虚拟内存和访问权限相关,注意与SError区别)、Exception-generating instructions、Debug exceptions。SVC、HVC、SMC指令分别用于EL0请求EL1操作系统服务、EL1请求EL2虚拟机管理程序服务、普通世界请求EL3安全世界服务。当 PE 在 EL0 上执行时,它无法直接调用EL2上的虚拟机管理程序或EL3上的安全监视器,因为这只能在EL1及更高版本上实现。EL0处的应用程序必须使用对内核的SVC调用,并让内核执行调用更高异常级别的操作。假设已经实现了相应的异常级别,则操作系统内核EL1可以执行HVC指令来调用EL2处的管理程序或使用SMC指令调用EL3处的安全监视器。类似地,从EL2开始,PE可以使用SMC指令来调用EL3安全监视器。如下图所示:

异步异常不直接与当前执行的指令相关,并且通常是来自处理器外部的系统事件。这可能是软件需要响应的系统事件,例如计时器的活动或屏幕的触摸。异步异常也称为中断。常见的异步异常(中断)有:Physical interrupts(如UART中断)、SError(System Error是内存系统为响应意外事件而生成的异常类型,主要与硬件故障或系统层面的严重问题相关,通常是由硬件故障引起的,比如内存、缓存、外设或总线出错)、IRQ and FIQ、Virtual interrupts(如vSError、vIRQ、vFIQ, 这些虚拟中断的功能与物理中断相同,但它们只能向EL1发送信号)。物理和虚拟异步异常都可以被暂时屏蔽,这意味着异步异常可以保持挂起状态,直到它们被取消屏蔽并且异常被处理,这对于处理嵌套异常特别有用。同步异常无法被屏蔽,这是因为同步异常是由指令的执行直接引起的,因此如果它们随后悬而未决或被忽略,则会阻止执行。总结一下,从更大的角度来说,ARM中异常总的分为同步异常、SError、IRQ和FIQ四类,其中后面三个是中断,同步异常和SError是没有与之对应的中断号的,所有的SGI、SPI、PPI、LPI中断最终都是被处理为IRQ或FIQ(可以将IRQ或FIQ理解为中断处理方式,将SGI、SPI、PPI、LPI理解为中断分类)。

8.当处理器遇到异常时,会保存当前处理元件(PE)的状态和异常返回地址,并进入特定模式以处理该异常。当前的处理器状态从PSTATE中获取(在ARMv8架构中,PSTATE 并不是一个单独的寄存器,而是一个处理器状态寄存器的抽象概念,PSTATE中的DAIF位用于屏蔽异常事件。当相应的位被设置时,不会响应相应异常,包括D(调试异常)、A(SError异步异常)、I(IRQ异步异常)和F(FIQ异步异常)),并保存到程序状态寄存器(SPSR_ELx,x为1、2、3),而返回地址会存入异常链接寄存器(ELR_ELx,x为1、2、3)。对于同步异常和SError,还会更新异常综合症寄存器(ESR_ELx,x为1、2、3),记录异常的具体原因。对于与地址相关的异常(如MMU故障),触发异常的虚拟地址会写入故障地址寄存器(FAR_ELx,x为1、2、3)。

9.任何给定异常的异常处理都从称为异常向量的固定内存地址开始,当异常发生时,处理元件(PE)分支到向量表中的某个位置。AArch64 中的向量表与许多其他处理器架构不同,因为它们包含指令,而不是地址。每个条目最多包含32条指令,一个指令4字节(32位);足以执行基本的堆栈和调用特定于异常的处理代码。异常处理与返回如下图所示:

10.每种异常类型都有目标异常级别,可能是根据异常类型隐式决定的,或者由系统寄存器中的配置位定义。同步异常(如SVC、HVC和SMC指令)根据与其指令相关的规则进行路由。其他异常类型(如IRQ、FIQ和SError)可以路由到EL2(虚拟机管理程序)或EL3(安全监视器)。例如,可以配置系统将所有IRQ路由到EL1。每种异常类型(IRQ、FIQ和SError)的路由配置是独立进行的。SCR_EL3寄存器用于指定哪些异常(如IRQ、FIQ和SError)会路由到EL3(安全监视器),HCR_EL2寄存器用于指定哪些异常会路由到EL2(虚拟化层),这些寄存器允许将不同类型的中断路由到不同的异常级别。SCR_EL3和HCR_EL2中的每一位控制特定类型的中断(如IRQ、FIQ、SError),SCR_EL3的配置优先于HCR_EL2配置。当系统复位时,这些路由位的值是UNKNOWN的,必须由软件进行初始化配置。

11.路由到较高异常级别的异常无法被较低EL屏蔽。例如,如果中断在EL1中被屏蔽,并且中断被路由到EL2,则EL1屏蔽将不会影响EL2操作。路由到当前异常级别的异常可以被当前级别屏蔽。路由到较低异常级别的异常始终被屏蔽,异常将被挂起,直到PE更改为等于或低于路由到的异常级别。异常被处理时,处理器在特定异常级别的执行状态(AArch64或AArch32)由更高的异常级别的控制寄存器来决定。如下图:

12.每个异常级别都有自己的向量表,其基地址由其自己的向量基地址寄存器VBAR_ELx(Vector Base Address Register,x为1、2、3)定义。每种异常类型都有特定的地址偏移,这些偏移指向异常处理程序。异常可以分为四大类:来自较低异常级别的异常且较低异常级别使用的都是AArch32、来自较低异常级别的异常且较低异常级别至少有一个使用的是AArch64、来自当前异常级别且使用的堆栈指针是SP_EL0和来自当前异常级别且使用的堆栈指针是SP_ELx(使用哪个SP由PSTATE.SP位来决定)。在ARM架构中,当异常被路由到某个异常级别处理时,所使用的异常向量表是目标异常级别(即接收异常的异常级别)对应的向量表,而不是原始异常发生时的异常级别的向量表。

13.2021年扩展Armv8.8-A和Armv9.3-A中添加了不可屏蔽中断(NMI)支持。具有超级优先级的中断被归类为NMI,即使PSTATE异常掩码通常会阻止它被获取,也可以被获取。


http://www.kler.cn/a/466996.html

相关文章:

  • Linux 基础 4.文件IO 通用的IO模型
  • 【2025年最新】OpenWrt 更换国内源的指南(图形界面版)
  • 提升汽车金融租赁系统的效率与风险管理策略探讨
  • 【FlutterDart】 拖动边界线改变列宽并且有边界高亮和鼠标效果(12 /100)
  • Vue3实现PDF在线预览功能
  • 如何通过USB在电脑上查看手机屏幕
  • SAP MM物料管理模块常见BAPI函数清单
  • React之从0开始(3)
  • pcl源码分析之计算ISS描述子(一)
  • 力扣--70.爬楼梯
  • 故事可视化AI
  • Python学习(5):数据结构
  • 基于单片机的光控窗帘设计
  • DetToolChain: A New Prompting Paradigm to Unleash Detection Ability of MLLM论文解读
  • ⾃定义类型:联合和枚举
  • oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln
  • NLP CH8 属性级情感分析复习
  • Python:交互式物质三态知识讲解小工具
  • 如何清理Docker的overlay2目录下的文件
  • python-leetcode-O(1) 时间插入、删除和获取随机元素
  • 杂七杂八之基于windows安装jupyterlab
  • 【亚马逊云】如何提升AWS Support 计划支持
  • Set对象和Map对象的区别和用途【JavaScript】
  • 深入探索 SQLite:高级功能解析
  • 自动驾驶控制与规划——Project 5: Lattice Planner
  • 【时时三省】(C语言基础)常见的动态内存错误2