ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)

在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中,作者对异常处理整体流程以及相关概念做了梳理。接下来,本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。

ARMv8-AArch64 的异常处理模型详解之异常处理详解

  • 一, 保存当前处理器状态(Saving the current processor state)
    • PSTATE,Processor state
    • PSTATE at AArch32
    • SPSR,Saved Process Status Register
  • 二,异常路由以及中断控制器
    • SCR_EL3, Secure Configuration Register
        • RW, bit [10], Execution state control for lower Exception levels.
        • HCE, bit [8],Hypervisor Call instruction enable. HVC指令使能
        • SMD, bit [7],Secure Monitor Call disable. 禁止使用SMC指令
        • EA, bit [3],External Abort and SError interrupt routing,用于控制是否将外部异常以及SError路由到EL3
        • FIQ, bit [2],IRQ, bit [1],用于控制IRQ和FIQ是否要路由到EL3
        • NS, bit [0],用于控制EL2,EL1,以及EL0是否处于Non-secure状态

一, 保存当前处理器状态(Saving the current processor state)

在ARMv7以及更早的架构中,有个程序状态寄存器(CPSR)来保存当前处理器的状态。而在ARMv8架构中,该寄存器被称为PSTATE(processor state)。PSTATE里包含了当前异常等级以及算数逻辑单元(Arithmetical Logical Unit (ALU))的一些标志位。在AArch64下,它们包括:

  • 状态标志位,Condition flags

  • 执行状态控制,Execution state controls

  • 异常屏蔽位,Exception mask bits

  • 访问控制位,Access control bits

  • Timing control bits

  • Speculation control bits
    比如PSTATE中有四个屏蔽bit(DAIF),用于屏蔽四种异常:

  • D - 调试屏蔽,Debug exception mask bit

  • A - SError异步异常屏蔽,SError asynchronous exception mask bit, for example, asynchronous external abort

  • I - IRQ异步异常屏蔽,IRQ asynchronous exception mask bit

  • F -FIQ异步异常屏蔽, FIQ asynchronous exception mask bit

PSTATE,Processor state

下图为AArch64模式下的PSTATE各个bit的功能描述表格:
PSTATE field definitions
在AArch64下,当使用ERET指令进行异常返回时,会让SPSR_ELn的值拷贝到PSTATE中。该操作会让处理器恢复到异常处理前的状态,其中包括:ALU的状态标志位(NZCV),执行状态(AArch64 或者AArch32),当前所处的异常等级以及处理器分支等等。并且将ELR_ELn中保存的地址恢复到PC(Program Counter)中,让处理器从该地址继续工作。
需要注意的是,PSTATE.{N, Z, C, V}可以在EL0下被访问,除了这四个bit,PSTATE的其他bit只能在EL1及更高的异常等级下被访问,对EL0来说是未定义的。

PSTATE at AArch32

在AArch32下,为了与ARMv7的CPSR相对应,PSTATE相比于AArch64,有额外的一些bit:
CPSR bit assignments in AArch32
 PSTATE bit definitions

SPSR,Saved Process Status Register

当异常发生时,处理器的PSTATE会被保存到对应的SPSR中,SPSR的作用相当于临时保存PSTATE的值,等到异常处理完成,执行了ERET指令后,SPSR的值将会重新写入到PSTATE中。
SPSR
以下是AArch64下的SPSR的bit功能:
在这里插入图片描述
在ARMv8中,SPSR有三个:, SPSR_EL3,, SPSR_EL2以及SPSR_EL1。异常发生在哪个异常等级(taken to)就用哪个SPSR,比如异常发生在EL1(taken to EL1,taken from EL0),则使用SPSR_EL1,并且ELR_ELn和SPSR_ELn是成对使用的。

当PSTATE的值在SPSR里有了备份,然后,处理器就可以将当前的PSTATE更新为体系结构中为该异常类型定义的PSTATE,以反映新的状态。这包括更新受影响的目标异常级别和安全级别。当PSTATE被更新后,处理器就可以跳转到异常向量表的的异常处理函数中,具体从哪个目标异常等级的异常向量开始执行,这个由异常类型决定。
下图为EL0->EL1->EL0的异常处理示意图,在异常处理前需要将PC和PSTATE备份到ELR以及SPSR中,由于目标异常等级为EL1(taken to EL1),所以写入ELR_EL1以及SPSR_EL1中,在异常处理完成后,再将ELR_EL1以及SPSR_EL1中的值恢复到PC和PSTATE中。
Saving and restoring processor state

二,异常路由以及中断控制器

事实上,每种异常类型都有一个目标异常等级,有以下两种方式来指定:

  • 通过异常类型隐式地指定。
  • 由系统控制寄存器中的配置bit来指定。

总的来说,异常的目标异常等级要么是由架构实现定义的(固定,不可更改),要么就是软件使用路由控制来配置的。此外,异常的目标异常等级不能是EL0(taken to EL0)。

同步异常将根据与异常生成指令SVC、HVC和SMC相关联的规则进行路由。当系统实现了EL2或者EL3时,可以将其他类型的异常路由到EL2(Hypervisor)或EL3(Secure Monitor)。异常路由对IRQ、FIQ以及SError来说是独立设置的,如下图所示,在某个实现实例中,可以将所有的IRQ中断都路由到EL1中。

在这里插入图片描述

SCR_EL3, Secure Configuration Register

当EL3被实现时,安全配置寄存器SCR_EL3才能被访问。它主要用于配置当前处理器的安全状态,包括如下配置:

  • EL0,EL1和EL2的安全状态,可以是Secure,Non-secure以及Realm。(EL3肯定是Secure的)
  • 更低的异常等级的执行状态(AArch32还是AArch64)。
  • IRQ、FIQ,SError中断以及外部中止异常(External abort exceptions)是否要在EL3下处理。
  • 某些操作是否要在EL3下执行。

SCR_EL3是一个64-bit寄存器,它的各个bit如下图所示:
在这里插入图片描述

RW, bit [10], Execution state control for lower Exception levels.

在这里插入图片描述

HCE, bit [8],Hypervisor Call instruction enable. HVC指令使能

在这里插入图片描述

SMD, bit [7],Secure Monitor Call disable. 禁止使用SMC指令

在这里插入图片描述

EA, bit [3],External Abort and SError interrupt routing,用于控制是否将外部异常以及SError路由到EL3

在这里插入图片描述

FIQ, bit [2],IRQ, bit [1],用于控制IRQ和FIQ是否要路由到EL3

在这里插入图片描述
在这里插入图片描述

NS, bit [0],用于控制EL2,EL1,以及EL0是否处于Non-secure状态

在这里插入图片描述

上小节简单介绍了安全配置寄存器SCR_EL3的用来配置异常路由的相关bit。除了SCR_EL3,还有Hypervisor
Configuration Register HCR_EL2。SCR_EL3寄存器指定哪些异常被路由到EL3,而HCR_EL2寄存器同样指定哪些异常被路由到EL2。
通过配置这些寄存器,可以将不同的中断类型路由到不同的异常级别。例如,IRQ中断可能由EL1的操作系统处理,而SErrors通常是由运行在EL3的固件处理。
在SCR_EL3以及HCR_EL2中都有单独的控制bit,允许单独控制IRQ、FIQ和SError中断的路由。如果SCR_EL3和HCR_EL2中的配置发生冲突时,SCR_EL3的路由配置会覆盖掉HCR_EL2中的配置。此外,这些控制bit在reset后的值是未知的,需要由软件来初始化。
在ARM架构中,有一个独立的模块:Generic Interrupt Controller (GIC),ARM 通用中断控制器,用于中断的管理,优先级分配以及中断路由。

在之前介绍异步异常的时候提到过,异步异常可以暂时屏蔽并保持pending状态,直到异常被解除屏蔽并被获取。异常路由也会影响异常屏蔽,因为屏蔽的能力取决于当前和目标异常等级。

  • 路由到较高异常级别的异常无法被较低的EL屏蔽(Target EL > Current EL)。例如,如果中断在EL1中被屏蔽,并且一个中断被路由到EL2,那么EL1的屏蔽设置将不会影响EL2的操作。但是,当处理器从EL2退出时,EL2的中断可能已经被屏蔽,这仍然可能导致中断在进入EL2时被屏蔽。
  • 如果异常没有导致异常等级更改(Target EL == Current EL),那么路由到当前异常级别的异常可以被当前级别屏蔽。
  • 路由到较低异常级别的异常总是可以被屏蔽(Target EL < Current EL)
    Masking rules on Exception level change
    接收异常的异常级别(taken to)的执行状态由更高的异常级别决定。假设所有异常级别都已实现,下表显示了如何确定某个异常等级的执行状态(AArch32 or AArch64):
    Execution state determination according to target Exception level

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「C++ 内存管理篇 0」C和C++对内存的划分

目录 一、C和C对内存的划分 二、小测试 【题目】 【答案】 【解释】 一、C和C对内存的划分 1. 栈区 &#xff1a;存储非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 2. 共享区&#xff1a;用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存…

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环&#xff0c;认真贯彻落实国家有关政策&#xff0c;采取多种措施助力汽车产业发展&#xff0c;为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制&#xff0c;我国经济持续稳定…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

网络编程_TCP通信综合练习:

1 //client&#xff1a;&#xff1a; public class Client {public static void main(String[] args) throws IOException {//多次发送数据//创建socket对象,填写服务器的ip以及端口Socket snew Socket("127.0.0.1",10000);//获取输出流OutputStream op s.getOutput…

ChatGPT魔法1: 背后的原理

1. AI的三个阶段 1&#xff09; 上世纪50~60年代&#xff0c;计算机刚刚产生 2&#xff09; Machine learning 3&#xff09; Deep learning&#xff0c; 有神经网络&#xff0c; 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…

Eclipse - Colors and Fonts

Eclipse - Colors and Fonts References 编码最好使用等宽字体&#xff0c;Ubuntu 下自带的 Ubuntu Mono 可以使用。更换字体时看到名字里面带有 Mono 的基本都是等宽字体。 Window -> Preferences -> General -> Appearance -> Colors and Fonts -> C/C ->…

数据分析 — 动画图 pyecharts

目录 一、概念二、安装和导入三、绘图逻辑四、绘图1、柱状图2、折线图3、散点图4、饼图5、南丁格尔图6、Geo() 地理坐标第7、Map() 绘制区域8、词云图9、层叠图10、3D 图11、仪表板 一、概念 Pyecharts 是一个基于 Echarts 的 Python 可视化库&#xff0c;它通过 Python 生成 …

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

Linux第60步_“buildroot”构建根文件系统第2步_配置“buildroot下的busybox”并测试“buildroot”生成的根文件系统

1、查看“buildroot下的busybox”安装路径 打开终端 输入“ls回车” 输入“cd linux回车/”&#xff0c;切换到到“linux”目录 输入“ls回车”&#xff0c;查看“linux”目录下的文件和文件夹 输入“cd buildroot/回车”&#xff0c;切换到到“buildroot”目录 输入“ls…

MyBatisPlus 整合 SpringBoot 遇见的问题

【异常】&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’… SQL: SELECT id,oper_id,btch_id,udf1, FROM scan_cyber Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’; ,"messag…

【Web】CTFSHOW java反序列化刷题记录(部分)

目录 web846 web847 web848 web849 web850 web856 web857 web858 web846 直接拿URLDNS链子打就行 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.lang.reflect.F…

Eclipse - Switch Workspace

Eclipse - Switch Workspace References Switch Workspace References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

用GPT-4开启“人类宝藏”

“GPT-4开启人类宝藏”意味着下面几个层面的含义&#xff1a; 知识与信息的访问&#xff1a;GPT-4作为一款强大的语言模型&#xff0c;通过学习海量的数据和信息资源&#xff0c;可以近乎实时地提供人类历史积累的知识、经验与智慧。用户可以通过询问或交互方式获取这些信息&am…

数据库所在服务器磁盘满了怎么办?

大家好&#xff0c;我是G探险者。 给大家拜个晚年哈&#xff0c;节后上班第一天&#xff0c;打开电脑&#xff0c;发现数据库服务器连不上了。 幸亏&#xff0c;节后第一天上班的人不太多&#xff0c;领导还没来&#xff0c;我一番鼓捣解决了这个问题。 所以做个总结&#xff0…

Linux网络----防火墙

一、安全技术和防火墙 1、安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安…

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备

逆向服务器用了三天的时间&#xff0c;但此时觉得一切都值&#xff0c;又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分&#xff0c;上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…

Cannot resolve symbol ‘IWXAPI‘

问题 Android 集成 微信登录报错 Cannot resolve symbol IWXAPI详细问题 笔者在App的build.gradle中已添加相关依赖&#xff0c;并完成Sync gradle操作。 笔者Project的build.gradle核心代码 buildscript {repositories {jcenter() // 原有 jCenter 引用可继续保留…

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java)

1. 目的&#xff1a;简单监控pod 我想使用java监控k8s pod的资源的简单使用情况&#xff0c;但是k8s内部并没有采集资源的实现。 但是k8s提供了一套k8s的对接标准&#xff0c;只要适配这套标准&#xff0c;就可以通过kubelet采集资源数据&#xff0c;并且通过k8s api服务器输出…

Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列

写在开头 队列是Java中的一个集合接口&#xff0c;之前的文章已经讲解了List和Set&#xff0c;那么今天就来唠一唠它吧。队列的特点&#xff1a;存储的元素是有序的、可重复的。 队列的两大接口Queue vs Deque Queue 是单端队列&#xff0c;只能从一端插入元素&#xff0c;另…

使用CompletableFuture在主线程捕获子线程异常

场景&#xff1a;我们使用线程池的时候&#xff0c;假如说某个线程出现了异常此时我们需要将异常捕获打印出相应的异常日志 这个时候就可以用到CompletableFuture的exceptionally方法&#xff0c;其作用是返回一个新的CompletableFuture&#xff0c;如果原CompletableFuture以…