ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)

这里写目录标题

  • 一,同步异常的分析
    • 1.1 同步异常分析-异常链接寄存器ELR
    • 1.2 同步异常分析-异常综合寄存器ESR,Exception Syndrome Register
    • 1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register
  • 二, 同步异常的处理示例 Synchronous exception handling
  • 三, 异步异常的处理示例 Asynchronous exception handling

一,同步异常的分析

在文章ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types中提到过,同步异常是处理器在执行指令时产生的异常,是一种精确的,可以具体定位到是哪条指令导致异常的产生。下面笔者将介绍三个用于定位并分析同步异常产生的寄存器。

1.1 同步异常分析-异常链接寄存器ELR

在文章ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables中提到过,同步异常发生时,会将产生同步异常的那条指令的地址写入ELR,所以如果想知道是哪条指令导致异常的产生,软件在处理异常时可以读取ELR中的值进行分析。

1.2 同步异常分析-异常综合寄存器ESR,Exception Syndrome Register

ESR寄存器里保存着一些异常的诊断信息,比如异常产生的原因。在进入异常后,我们可以读取对应异常等级的ESR(ESR_EL1,ESR_EL2或者ESR_EL3),通过解析各个字段的数值所表示的含义,来分析出当前异常产生的原因。
在这里插入图片描述
拿ESR的EC, bits [31:26]举例,这个EC字段指示了当前异常产生的原因,比如当EC == 0b100010时,按照ARM文档的描述,我们可知当前异常是因为PC未对齐(地址不以0x0 0x4 0x8 0xc结尾)。
在这里插入图片描述
除了EC字段,还有IL字段,从该字段可知是32-bit长度还是16bit 长度的指令导致的异常:
在这里插入图片描述

1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register

FAR寄存器将为一些同步异常保存导致异常发生的地址,包括如下同步异常:

  • 指令中止异常(Instruction Abort exceptions), 此时ESR寄存器的EC 值为0x20 或者0x21,
    在这里插入图片描述

  • 数据中止异常,Data Abort exceptions, 此时ESR寄存器的EC 值为0x24 或者 0x25:
    在这里插入图片描述

  • PC对齐错误异常,PC alignment fault exceptions,此时ESR寄存器的EC 值为0x22。
    在这里插入图片描述

  • 调试异常的观察点异常,Watchpoint exceptions,此时ESR寄存器的EC 值0x34 或者0x35:
    在这里插入图片描述
    FAR寄存器中的保存的地址是指令获取或数据访问时,导致指令或数据中止的异常的地址。

二, 同步异常的处理示例 Synchronous exception handling

假设有这么一个场景:执行在EL0的AArch32 应用程序需要向执行在EL1的AArch64 操作系统请求一个堆的内存分配,它需要执行一个SVC指令,产生一个SVC同步异常,这将发生如下事件:

  • 当前的处理器状态PSTATE将会保存到SPSR_EL1中。
  • 产生异常指令(SVC)的下一条指令的地址将会被写入到ELR_EL1中。
  • 异常诊断信息(导致异常发生的原因)将会被记录到ESR_EL1寄存器中。
  • 目标执行状态取决于HCR_EL2.RW 位。
  • 当前的处理器状态PSTATE将会被更新:异常等级将会切到EL1,执行状态更行到AArch64
  • PC将会跳转到VBAR_EL1+ 600的异常向量,因为是同步异常,有来自低异常等级的异常等级切换,并且低的异常等级为AArch32,所以根据异常向量的选择要求,将选择VBAR_EL1+ 600处的异常向量作为异常处理器。
  • 在top exception handler中,在进行异常处理前,当前处理器的寄存器上下文将会被压入到SP_EL1中。
  • 在top exception handler中,根据ESR中的信息,知道当前异常为SVC异常,所以跳转到指定的SVC异常处理函数中。
  • 在SVC异常处理函数执行完成后,回到top exception handler。
  • 在top exception handler中,将之前压入到SP_EL1中的寄存器上下文恢复,并执行ERET指令。
  • ERET指令包括两个步骤:将SPSR_EL1的值恢复到PSTATE中(包括异常等级为EL0,执行状态为AArch32),然后将ELR_EL1中的值写入到PC中。

以上就是执行SVC指令从EL0进入到EL1进行异常处理,然后返回的一般流程。
上述场景还尚未考虑到安全状态的切换,如果是EL0+AArch32+Non-secure状态下,要进入到EL1+AArch64+secure状态进行某些操作,则处理流程将更加复杂。之前的文章提到过,Secure状态的切换必须经过EL3,所以要想实现此操作,中间还需要执行SMC指令进入到EL3。

三, 异步异常的处理示例 Asynchronous exception handling

异步异常,比如中断,是来自处理器外部的信号,或者SError,来自内存系统的的错误反馈。ARM没有规定异步异常应该什么时候发生,并且,关于异步异常与同步异常的优先级问题,如果同步异常和异步异常同时发生,那么处理器先处理哪一个,这个是由处理器的具体实现定义的。
假设有这么一个场景:当处理器在EL0 AArch32状态下执行用户程序时,发生了一个IRQ中断,假设HCR_EL2 和 SCR_EL3都以及被配置成将当前IRQ中断路由到EL1 AArch64状态下处理,下图为该中断的处理流程:
在这里插入图片描述

  • 当前的处理器状态PSTATE将会保存到SPSR_EL1中。
  • 中断发生时,第一条未被执行完成的指令的地址将会被写入到ELR_EL1中。
  • 异常诊断信息(导致异常发生的原因)将会被记录到ESR_EL1寄存器中。
  • 目标执行状态取决于HCR_EL2.RW 位。
  • 当前的处理器状态PSTATE将会被更新:异常等级将会切到EL1,执行状态更行到AArch64
  • PC将会跳转到VBAR_EL1+ 0x680的异常向量,因为是IRQ中断,有来自低异常等级的异常等级切换,并且低的异常等级为AArch32,所以根据异常向量的选择要求,将选择VBAR_EL1+ 0x680处的异常向量作为异常处理器。
  • 在top exception handler中,在进行异常处理前,当前处理器的寄存器上下文将会被压入到SP_EL1中。
  • 在top exception handler中,跳转到指定的IRQ异常处理函数中。
  • 在IRQ处理函数执行完成后,回到top exception handler。
  • 在top exception handler中,将之前压入到SP_EL1中的寄存器上下文恢复,并执行ERET指令。
  • ERET指令包括两个步骤:将SPSR_EL1的值恢复到PSTATE中(包括异常等级为EL0,执行状态为AArch32),然后将ELR_EL1中的值写入到PC中。

以上就是进行IRQ中断异常处理,然后返回的一般流程。需要注意的是,处理器或者说是IRQ handler并没有能力判断中断源,只是收到了IRQ中断信号,并开始IRQ中断处理。至于具体的中断源判断、中断优先级以及中断属性(edge/level, secure/non-sercure)配置的工作,由GIC来完成。通过读取GIC的IAR(Interrupt Acknowledge Registers)寄存器,处理器可以知道当前中断源的中断号。一旦中断被处理完成,处理器可以配置GIC的EOIR(End of Interrupt Register)寄存器,来通知GIC当前中断已经被处理完成,并且该中断的状态也随即会变成inactive。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wsl添加swap

机器的内存比较少,用wsl 写代码和编译的时候,发现内存不怎么够, 系统的可以分配的内存也不怎么够,需要增加点swap 来解决问题 方法比较简单,配置下.wslconfig 文件,添加下swap 就能解决这个问题 配置文件添…

JAVA的日志技术【详解】

1.使用日志技术的好处 可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。 可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。 2.日志技术的体系结构 3.Logback日志框架 logback-co…

第二节:Vben Admin 登录逻辑梳理和对接后端准备

系列文章目录 上一节:第一节:Vben Admin介绍和初次运行 文章目录 系列文章目录前言项目路径的概述一、登录逻辑梳理loginApi接口查看Mock 二、后端程序对接准备关闭Mock 总结 前言 第一节,我们已经配置了前端环境,运行起来了我们…

zabbix监控业务数据

前言 监控系统除了监控os和数据库性能相关的指标外,业务数据也是重点监控的对象。 一线驻场的运维同学应该深有体会,每天需要向甲方或者公司反馈现场的数据情况,正常情况下一天巡检两次,早上上班后和下午下班前各一次。监控项目…

探索水下低光照图像检测性能,基于YOLOv6全系列【n/s/m/l】参数模型开发构建海底生物检测识别分析系统

底这类特殊数据场景下的检测模型开发相对来说比较少,在前面的博文中也有一些涉及,感兴趣的话可以自行移步阅读即可: 试探索水下目标检测,基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBAM注意力…

人工智能在测绘行业的应用与挑战

目录 一、背景 二、AI在测绘行业的应用方向 1. 自动化特征提取 2. 数据处理与分析 3. 无人机测绘 4. 智能导航与路径规划 5. 三维建模与可视化 6. 地理信息系统(GIS)智能化 三、发展前景 1. 技术融合 2. 精准测绘 3. 智慧城市建设 4. 可…

【Java程序员面试专栏 算法思维】一 高频面试算法题:排序算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊排序算法,包括手撕排序算法,经典的TOPK问题以及区间合并,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间快速排序双指针+递归+基准值分…

2024年上半年第一次课

文章目录 一、加入课程QQ群(一)加入QQ群(二)加群要求 二、加入超星学习通(一)安装超星学习通(二)利用学习通签到(三)查看课程内容(四)…

算法分析-面试1-字符串

文章目录 前言一、分类:看看就行了二、字符串API:创建和初始化:查询操作:比较操作:修改操作:截取操作:分割操作:格式化操作:连接操作(Java 8 及以后&#xff…

静态时序分析:SDC约束命令set_load详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 set_load命令用于指定端口(port)或线网(net)的负载电容,该指令的BNF范式(有关BNF范式,可以参考以往文章)为&#…

JAVA毕业设计129—基于Java+Springboot+thymeleaf的物业管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootthymeleaf的物业管理系统(源代码数据库)129 一、系统介绍 本项目前后端分离,本系统分为管理员、小区管理员、用户三种角色 1、用户: 登…

基于Pytorch的猫狗图片分类【深度学习CNN】

猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解,基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型,源代码放在GitHub上,地址传送点击此处。项目大纲如下: 文章目录 一、问题描述二、数据集处理…

【GPTs分享】GPTs分享之Write For Me

Write For Me 是一个专门定制的GPT版本,旨在为用户提供高质量的文本内容创作服务。它适用于各种写作需求,从商业计划、学术文章到创意故事等。下面是从简介、主要功能、使用案例、优点和局限性几个方面对Write For Me 的详细介绍。 简介 Write For Me …

MySQL-主从复制

目录 1. 主从复制概述 1.1 如何提升数据库并发能力 1.2 主从复制的作用 2. 主从复制的原理 2.1 原理剖析 三个线程 复制三步骤 复制的问题 2.2 复制的基本原则 3. 一主一从架构搭建 3.1 准备工作 3.2 主机配置文件 3.3 从机配置文件 3.4 主机:建立账户…

每日五道java面试题之spring篇(六)

目录: 第一题 ApplicationContext通常的实现是什么?第二题 什么是Spring的依赖注入?第三题 依赖注入的基本原则第四题 依赖注入有什么优势?第五题 有哪些不同类型的依赖注入实现方式? 第一题 ApplicationContext通常的…

【hashmap】【将排序之后的字符串作为哈希表的键】【获取 HashMap 中所有值的集合】Leetcode 49 字母异位词分组

【hashmap】【将排序之后的字符串作为哈希表的键】【获取 HashMap 中所有值的集合】Leetcode 49 字母异位词分组 解法1 将排序之后的字符串作为哈希表的键解法2 在解法一的基础上加入了getOrDefault ---------------🎈🎈题目链接🎈&#x1f3…

groovy:XmlParser 读 Freeplane.mm文件,生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。 强大的节点功能,不仅仅节点的种类很多&#xff…

【管理咨询宝藏资料25】某能源集团五年发展战略报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料25】某能源集团五年发展战略报告 【关键词】战略规划、五年战略、管理咨询 【文件核心观点】 - LL应以快速做大做强为目标,专注…

CleanMyMac X2024告别硬盘空间不足,让您的Mac电脑极速如新

CleanMyMac X支持多种操作系统版本,包括macOS 10.10(Yosemite)、macOS 10.11(El Capitan)、macOS 10.12(Sierra)、macOS 10.13(High Sierra)、macOS 10.14(Mo…

查看笔记本电池健康状态-windows11

在 Windows 11 中获取详细的电池报告 Windows 11 中内置的 Powerfg 命令行选项来生成电池报告。 在任务栏上选择“搜索”,键入“cmd”,长按(或右键单击)“命令提示符”,然后选择“以管理员身份运行” ->“是”。 …