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的功能描述表格:
在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:
SPSR,Saved Process Status Register
当异常发生时,处理器的PSTATE会被保存到对应的SPSR中,SPSR的作用相当于临时保存PSTATE的值,等到异常处理完成,执行了ERET指令后,SPSR的值将会重新写入到PSTATE中。
以下是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中。
二,异常路由以及中断控制器
事实上,每种异常类型都有一个目标异常等级,有以下两种方式来指定:
- 通过异常类型隐式地指定。
- 由系统控制寄存器中的配置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)。
接收异常的异常级别(taken to)的执行状态由更高的异常级别决定。假设所有异常级别都已实现,下表显示了如何确定某个异常等级的执行状态(AArch32 or AArch64):
相关文章:

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

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备
逆向服务器用了三天的时间,但此时觉得一切都值,又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分,上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…...

论文精读--对比学习论文综述
InstDisc 提出了个体判别任务,而且利用这个代理任务与NCE Loss去做对比学习从而得到了不错的无监督表征学习的结果;同时提出了别的数据结构——Memory Bank来存储大量负样本;解决如何对特征进行动量式的更新 翻译: 有监督学习的…...

文章复现 | 差异分析和PPI网络构建
原文链接:差异分析和PPI网路图绘制教程 写在前面 在原文中,作者获得285个DEG,在此推文中共获得601个DEG。小杜的猜想是标准化的水段不同的原因吧,或是其他的原因。此外,惊奇的发现发表医学类的文章在附件中都不提供相…...

入门级10寸加固行业平板—EM-I10J
亿道信息以其坚固耐用的智能终端设备而闻名,近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J 这是一款 10 英寸的平板电脑,主要运行 Windows 10操作系统,带有硬化塑料外壳,具有 IP65 防水防尘功能和 MIL-STD 8…...

gem5 garnet 合成流量: packet注入流程
代码流程 下图就是全部. 剩下文字部分是细节补充,但是内容不变: bash调用python,用python配置好configuration, 一个cpu每个tick运行一次,requestport发出pkt. bash 启动 python文件并配置 ./build/NULL/gem5.debug configs/example/garnet_synth_traffic.py \--num-cpus…...

java实现排序算法(上)
排序算法 冒泡排序 时间和空间复杂度 要点 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置下一轮冒泡,可以调整未排序的右边界,减少不必要比较 代码 public static int[] test(int[] array) {// 外层循环控制遍历次数for (int i 0; i <…...

「算法」滑动窗口
前言 算法需要多刷题积累经验,所以我行文重心在于分析解题思路,理论知识部分会相对简略一些 正文 滑动窗口属于双指针,这两个指针是同向前行,它们所夹的区间就称为“窗口” 啥时候用滑动窗口? 题目涉及到“子序列…...

Windows11(非WSL)安装Installing llama-cpp-python with GPU Support
直接安装,只支持CPU。想支持GPU,麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件: gitpythoncmakeVisual Studio Community (make sure you install t…...
rtt设备io框架面向对象学习-脉冲编码器设备
目录 1.脉冲编码器设备基类2.脉冲编码器设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.脉冲编码器设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的pulse_encoder.h定义…...
华为OD机试真题- 攀登者2-2024年OD统一考试(C卷)
题目描述: 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。地图表示为一维数组,数组的索引代表水平位置,数组的高度代表相对海拔高度。其中数组元素0代表地面。例如[0,1,4,3,1,0,0,1,2,3,1,2,1,0], 代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5和8,9,1…...

19.Qt 组合框的实现和应用
目录 前言: 技能: 内容: 1. 界面 2.槽 3.样式表 参考: 前言: 学习QCombox控件的使用 技能: 简单实现组合框效果 内容: 1. 界面 在ui编辑界面找到input widget里面的comboBoxÿ…...

【Linux】进程地址空间的理解
进程地址空间的理解 一,什么是程序地址空间二,页表和虚拟地址空间三,为什么要有进程地址空间 一,什么是程序地址空间 在我们写程序时,都会有这样下面的内存结构,来存放变量和代码等数据。 一个进程要执行…...

【Jvm】类加载机制(Class Loading Mechanism)原理及应用场景
文章目录 Jvm基本组成一.什么是JVM类的加载二.类的生命周期阶段1:加载阶段2:验证阶段3:准备阶段4:解析阶段5:初始化 三.类初始化时机四.类加载器1.引导类加载器(Bootstrap Class Loader)2.拓展类…...

Spring AOP的实现方式
AOP基本概念 Spring框架的两大核心:IoC和AOP AOP:Aspect Oriented Programming(面向切面编程) AOP是一种思想,是对某一类事情的集中处理 面向切面编程:切面就是指某一类特定的问题,所以AOP可…...

Linux------环境变量
目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…...
计算机视觉所需要的数学基础
计算机视觉领域中使用的数学知识广泛而深入,以下是一些关键知识点及其在计算机视觉中的应用: 线性代数: - 矩阵运算:用于图像的表示和处理,如图像旋转、缩放、裁剪等。 - 向量空间:用于描述图像中的…...

ChatGPT魔法1: 背后的原理
1. AI的三个阶段 1) 上世纪50~60年代,计算机刚刚产生 2) Machine learning 3) Deep learning, 有神经网络, 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…...
【c/c++】获取时间
在一些应用的编写中我们有时候需要用到时间,或者需要一个“锚点”来确定一些数的值。在c/c中有两个用来确定时间的函数:time/gettimeofday 一、time time_t time(time_t *timer);time 函数返回当前时间的时间戳(自 1970 年 1 月 1 日以来经…...

uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
方案:使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意:u-parse直接使用是不兼容小程序的,需要对u-parse进行改造: 1. 查看u-parse源码发现小程序走到以…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...