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

ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions

异常处理模型详解之异常处理概述

  • 一,异常处理相关概念
  • 二,异常处理概述

一,异常处理相关概念

在介绍异常处理之前,有必要了解一些关于异常处理状态的术语:

  • 当处理器响应一个异常时,我们称该异常被获取了( taken )。
  • 处理器响应异常之前的状态被称为 taken from
  • 处理器响应异常之后的状态被称为 taken to

因此,当处理器识别到异常时,此时处理器处于 taken from。在异常之后的状态称为 taken to。
当异常处理完成后,处理器需要返回到异常发生前的状态,这个过程称为 exception return。并且在ARM架构中有专门的指令用于异常返回(ERET):

  • 处理器在执行异常返回指令之前的状态,称为 returns from。
  • 处理器在执行异常返回指令之后的状态,称为 retruns to。

如下图所示,为处理器异常状态转换 : EL0 -> EL1-> EL0的全过程:

  1. 先执行 SVC指令,从EL0切换到 EL1,这个过程也称为 taken a exception from EL0 to EL1.
  2. 在 EL1的exception handler里处理完异常。
  3. 处理完异常后执行 ERET(exception retrun)指令,从EL1返回到 EL0.此过程也称为 return a exception from EL1 to EL0.
    在这里插入图片描述

二,异常处理概述

当异常发生时,处理器会先保存处理器当前的状态(CPSR,也称为PSTATE)以及异常返回地址。然后进入一个特殊的状态来处理改异常。
当前处理器的状态信息来自于PSTATE寄存器,也就是CPSR,处理器会将异常发生前的PSTATE的值写入到SPSR(Saved Program Status Register)中。而异常返回的地址,将会写入到异常链接寄存器ELR(Exception Link Register)。
此外,对于同步异常以及SError异常,处理器还会更新异常综合寄存器ESR(Exception Syndrome Register),该寄存器记录了异常产生的原因。
总结如下,当异常发生并进入一个AArch64的异常等级(ELx)时,处理器会有如下操作:

  1. 在异常被处理前的PSTATE寄存器的内容会被写入到SPSR_ELx寄存器中。
  2. 异常返回地址会被写入到ELR_ELx寄存器中。

此外:

  1. 对于同步异常和SError异常,异常发生的原因也会被记录到ESR_ELx寄存器中。
  2. 对于地址相关的同步异常,比如MMU错误,导致异常发生的虚拟地址也会被写入到错误地址寄存器(Fault Address Register,FAR_ELx)中。

对任何给定异常的异常处理都从一个称为异常向量(exception vector)的固定内存地址开始,当异常发生时,处理器将会跳转到异常向量表的某个地方。

AArch64中的向量表与许多其他处理器体系结构不同,因为它们包含指令,而不是地址。每个条目最多包含32条指令;刚好足以执行基本堆叠和调用特定于异常的处理代码。

向量表的位置通常被配置为异常处理程序代码,以执行通用操作,并根据异常类型跳转到进一步的异常处理代码,如下图所示的top level 处理函数。这个top level向量代码被限制为32个字(word)大小。异常处理程序包含处理请求操作的代码,并可以从异常状态返回。
Top-level handler
当一个异常被识别时,它同时也对应着一个异常等级EL,因此在处理异常的过程中,可以路由到一个不同的EL中。这也是处理器提高特权的唯一方法:通过异常等级切换,从低的异常等级切换到高的异常等级。同理,处理器若是想降低特权,惟一的方法就是通过异常返回,这意味着:

  • 当异常发生时,处理器的EL可以不变,或者提高。
  • 当异常返回时,处理器的EL可以不变,或者降低。

异常的目标异常等级可以和当前的异常等级保持一致,目标异常等级可以根据异常类型或者系统寄存器的配置bit隐式地指定。
需要注意的是,对于AArch64的EL0,我们只能产生异常从EL0切换到更高等级的异常,绝对不能通过产生异常的方式进入EL0,因此,异常向量表里也没有关于EL0的向量。
在之前的文章中 ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态我们提到过,处理器要想切换执行状态,只有两种方法:

  1. reset
  2. 异常等级切换或者返回。

在AArch32和AArch64之间的交互被称为 interprocessing。关于执行状态的改变,有如下规则需要牢记:

  1. 当从一个低的EL切换到更高的EL时,处理器的执行状态可以保持不变,或者切换到AArch64。
  2. 当从一个高的EL切换到更低的EL时,处理器的执行状态可以保持不变,或者切换到AArch32。

这也说明了:

  1. 如果某个异常等级正在使用AArch32,则比它更低的异常等级必须使用AArch32模式。
  2. 如果某个异常等级正在使用AArch64,则比它更高的异常等级必须使用AArch64模式。

比如处理器在EL3中正在使用AArch32,则可以推断出此时处理器的EL0、EL1以及EL2也只能使用AArch32,而不能是AArch64。
在ARMv9-A架构和一些ARMv8-A架构中,AArch32状态只在EL0中被支持,并且不能通过产生异常的方式进入EL0。这说明,在这种情况下如果想改变EL0的执行状态,只能使用规则2,从一个更高的异常等级返回到EL0,支持处理器的执行状态可以保持不变(AArch64),或者切换到AArch32。

由于可以通过切换异常等级的方式从AArch32进入到AArch64,所有AArch64的异常处理函数可能需要访问AArch32的寄存器,AArch32的通用寄存器是直接映射到AArch64通用寄存器中的,这样AArch64的异常处理函数就可以直接访问AArch32的通用寄存了,映射关系如下:
AArch32 to AArch64 register mappings
当从AArch32切换到AArch64时,之前在AArch32状态下无法访问的那些寄存器将会保留它们之前在AArch64状态下的值。对于那些既可以在AArch32和AArch64下访问的寄存器:

  • 高32bit:未知,可能为0。
  • 低32bit:映射到AArch32寄存器的值。

关于AArch64寄存器的详细描述,可以参考文档: AArch64 Instruction Set Architecture guide.

相关文章:

ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions

异常处理模型详解之异常处理概述 一,异常处理相关概念二,异常处理概述 一,异常处理相关概念 在介绍异常处理之前,有必要了解一些关于异常处理状态的术语: 当处理器响应一个异常时,我们称该异常被获取了&a…...

Ubuntu 18.04上安装cuDNN 8.9.6.50:一站式指南

Content 一、前言二、准备工作三、安装步骤1. 启用本地仓库2. 导入CUDA GPG密钥3. 更新仓库元数据4. 安装运行时库5. 安装开发者库6. 安装代码示例7. 另外一种安装办法 四、验证安装1. 验证cuDNN版本2. 测试示例代码 五、总结 一、前言 在深度学习领域,高效的计算资…...

Microsoft Word 超链接

Microsoft Word 超链接 1. 取消超链接2. 自动超链接2.1. 选项2.2. 校对 -> 自动更正选项2.3. Internet 及网络路径替换为超链接 References 1. 取消超链接 Ctrl A -> Ctrl Shift F9 2. 自动超链接 2.1. 选项 2.2. 校对 -> 自动更正选项 ​​​ 2.3. Internet…...

SparkJDBC读写数据库实战

默认的操作 代码val df = spark.read.format("jdbc").option("url", "jdbc:postgresql://localhost:5432/testdb").option("user", "username").option("password", "password").option("driver&q…...

代码随想录 -- 数组

文章目录 二分查找题目描述题解 移除元素题目描述题解:暴力解法题解:双指针法 有序数组的平方题目描述题解:暴力解法题解:双指针法 长度最小的子数组题目描述题解:暴力解法题解:滑动窗口(双指针…...

【国产MCU】-CH32V307-基本定时器(BCTM)

基本定时器(BCTM) 文章目录 基本定时器(BCTM)1、基本定时器(BCTM)介绍2、基本定时器驱动API介绍3、基本定时器使用实例CH32V307的基本定时器模块包含一个16 位可自动重装的定时器(TIM6和TIM7),用于计数和在更新新事件产生中断或DMA 请求。 本文将详细介绍如何使用CH32…...

Node.js开发-fs模块

这里写目录标题 fs模块1) 文件写入2) 文件写入3) 文件移动与重命名4) 文件删除5) 文件夹操作6) 查看资源状态7) 相对路径问题8) __dirname fs模块 fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动等,还有文件内容的写入、读取&#xff…...

探索Nginx:强大的开源Web服务器与反向代理

一、引言 随着互联网的飞速发展,Web服务器在现代技术架构中扮演着至关重要的角色。Nginx(发音为“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx因其卓越的性能、稳定性和灵活性&…...

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

【从Python基础到深度学习】1. Python PyCharm安装及激活

前言: 为了帮助大家快速入门机器学习-深度学习,从今天起我将用100天的时间将大学本科期间的所学所想分享给大家,和大家共同进步。【从Python基础到深度学习】系列博客中我将从python基础开始通过知识和代码实践结合的方式进行知识的分享和记…...

片上网络NoC(3)——拓扑指标

目录 一、概述 二、指标 2.1 与网络流量无关的指标 2.1.1 度(degree) 2.1.2 对分带宽(bisection bandwidth) 2.1.3 网络直径(diameter) 2.2 与网络流量相关的指标 2.2.1 跳数(hop coun…...

二叉树 ---- 所有结点数

普通二叉树的结点数: 递归法: 对二叉树进行前序or后序遍历: typedef struct Tree {int data;Tree* leftChild;Tree* rightChild; }tree,*linklist; //计算普通二叉树的结点数 int nodenums(linklist node) {if(node nullptr) return 0; …...

步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储

博客原文 文章目录 前言集群环境nfs 环境搭建pod 挂载 nfs架构图 pvc 方式挂载 nfs架构图 storageclass 方式动态申请 pv架构图 参考 前言 持久化卷(Persistent Volume, PV)允许用户将外部存储映射到集群,而持久化卷申请(Persist…...

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十...

Modelsim10.4安装

简介(了解,可跳过) modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速…...

Java基于微信小程序的医院核酸检测服务系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

VC++ 绘制折线学习

win32 有三个绘制折线的函数; Polyline,根据给定点数组绘制折线; PolylineTo,除了绘制也更新当前位置; PolyPolyline,绘制多条折线,第一个参数是点数组,第二个参数是一个数组、指…...

速盾:dns解析和cdn加速的区别与联系

DNS解析和CDN加速是两种不同的网络技术,但在网站访问过程中起到了相互协作的作用。 首先,DNS解析(Domain Name System)是将域名转换为IP地址的过程。当用户输入一个网址时,计算机会先向本地DNS服务器发送一个查询请求…...

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(3) 保存表格数据

对上两篇篇的工作C Qt框架开发| 基于Qt框架开发实时成绩显示排序系统(1)-CSDN博客和C Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示-CSDN博客继续优化,增加一个保存按钮,用于保存成绩数据…...

ChatGPT 4:新特性与优势

ChatGPT 4:新特性与优势 一、引言 ChatGPT 4是一款备受瞩目的人工智能模型,它以其强大的语言生成能力和智能回答能力,为用户提供了更高效、更便捷的对话体验。为了能够充分享受ChatGPT 4的各项功能,本文将向您详细介绍其新特性&…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...