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

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。

相关文章:

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

这里写目录标题 一,同步异常的分析1.1 同步异常分析-异常链接寄存器ELR1.2 同步异常分析-异常综合寄存器ESR,Exception Syndrome Register1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register 二, 同步异常的处理示例 Synchronous ex…...

Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索

在今天的文章中,我们将重点介绍如何使用 LangChain 提供的基础设施在 Python 中构建 Elasticsearch agent。 该 agent 应允许用户以自然语言询问有关 Elasticsearch 集群中数据的问题。 Elasticsearch 是一个强大的搜索引擎,支持词法和向量搜索。 Elast…...

学习python的第7天,她不再开放她的听歌榜单

我下午登录上小号,打开聊天消息看到了她的回复,我很开心兴奋,可是她不再开放她的听歌榜单了,我感觉得到,我要失恋了。 “因为当年电视上看没有王菲版本的” “行”。 “那你以后还会开放听歌榜单吗?”我…...

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型 目录 多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍…...

低代码与大语言模型的探索实践

低代码系列文章: 可视化拖拽组件库一些技术要点原理分析可视化拖拽组件库一些技术要点原理分析(二)可视化拖拽组件库一些技术要点原理分析(三)可视化拖拽组件库一些技术要点原理分析(四)低代码…...

element导航菜单el-menu添加搜索功能

element导航菜单-侧栏&#xff0c;自带的功能没有搜索或者模糊查询。 找了找资料 找到一个比较可行的&#xff0c;记录一下&#xff1a; //index.vue的代码 <div style"overflow:auto"><el-menu :default-active"$route.path":default-openeds&…...

浅析SpringBoot框架常见未授权访问漏洞

文章目录 前言Swagger未授权访问RESTful API 设计风格swagger-ui 未授权访问swagger 接口批量探测 Springboot Actuator未授权访问数据利用未授权访问防御手段漏洞自动化检测工具 CVE-2022-22947 RCE漏洞原理分析与复现漏洞自动化利用工具 其他常见未授权访问Druid未授权访问漏…...

PostgreSQL内存上下文系统设计概述

PostgreSQL内存上下文系统设计概述 原文:src/backend/utils/mmgr/README 背景 我们在“内存上下文”中进行大部分内存分配&#xff0c;通常是AllocSets由src/backend/utils/mmgr/aset.c实现。在没有大量开销的情况下成功进行内存管理的关键是定义一组具有适当生命周期的有用…...

C++ 网络编程学习二

C 网络编程学习二 asio异步写操作asio异步读操作asio 异步echo服务端asio异步服务器中存在的隐患 asio异步写操作 async_write_some是异步写的函数&#xff1a;传入buffer和回调函数以及参数以后&#xff0c;发送后会调用回调函数。 void Session::WriteToSocketErr(const st…...

SpringMVC 学习(四)之获取请求参数

目录 1 通过 HttpServletRequest 获取请求参数 2 通过控制器方法的形参获取请求参数 3 通过 POJO 获取请求参数&#xff08;重点&#xff09; 1 通过 HttpServletRequest 获取请求参数 public String handler1(HttpServletRequest request) <form action"${pageCont…...

多模态表征—CLIP及中文版Chinese-CLIP:理论讲解、代码微调与论文阅读

我之前一直在使用CLIP/Chinese-CLIP&#xff0c;但并未进行过系统的疏导。这次正好可以详细解释一下。相比于CLIP模型&#xff0c;Chinese-CLIP更适合我们的应用和微调&#xff0c;因为原始的CLIP模型只支持英文&#xff0c;对于我们的中文应用来说不够友好。Chinese-CLIP很好地…...

Git本地分支关联远程分支

Git本地分支关联远程分支 本地分支相关操作 查看本地分支 git branch新建本地分支 git branch name切换本地分支 git checkout name新建本地分支并切换到该分支 git checkout -b name #或 git branch name删除本地分支 git branch -d name git branch -D name #强制删除远程分…...

[FT]chatglm2微调

1.准备工作 显卡一张&#xff1a;A卡&#xff0c;H卡都可以&#xff0c;微调需要一张&#xff0c;大概显存得30~40G吧环境安装&#xff1a; 尽量在虚拟环境安装&#xff1a;参见&#xff0c;https://blog.csdn.net/u010212101/article/details/103351853环境安装参见&#xff…...

AI赋能Oracle DBA:以自然语言与Oracle数据库互动

DBA AI助手&#xff1a;以自然语言与Oracle数据库互动 0. 引言1. AI赋能Oracle DBA的优势2. AI如何与Oracle数据库交互3. 自然语言查询的一些示例4. 未来展望 0. 引言 传统的Oracle数据库管理 (DBA) 依赖于人工操作&#xff0c;包括编写复杂的SQL语句、分析性能指标和解决各种…...

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true&#xff0c;blank true 允许为空price models.IntegerField(verbose_name"价…...

AD9226 65M采样 模数转换

目录 AD9220_ReadTEST AD9220_ReadModule AD9226_TEST_tb 自己再写个 260M的时钟&#xff0c;四分频来提供65M的时钟。 用 vivado 写的 AD9226_ReadTEST module AD9226_ReadTEST( input clk, input rstn,output clk_driver, //模块时钟管脚 input [12:0]IO_data, //模块数…...

远程控制桌面,让电脑办公更简单

随着科技的不断发展&#xff0c;远程办公已经成为了越来得越多企业和个人的选择。远程控制电脑办公&#xff0c;仅需1款软件即可轻松get&#xff01; 1.绿虫电脑管理软件 是一款功能强大的办公电脑管理软件&#xff0c;仅需安装在被控端电脑&#xff0c;主控端通过网页登录后…...

猫头虎分享已解决Bug || 网络连接问题:NetworkError: Failed to fetch

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

Layer1 明星项目 Partisia Blockchain 何以打造互操作、可创新的数字经济网络

我们的目标是创建一个以用户为中心的全新数字经济网络&#xff1a;在去信任化和公平透明的环境下&#xff0c;所有的隐私数据都能够得到天然保障&#xff0c;企业、用户等各角色的协作与共享将会更顺利地进行。 —— Partisia Blockchain 团队 作为一个以 Web3 安全为技术方向的…...

用CSS制作弧形卡片的三种创意方法!

在平时开发中&#xff0c;有时候会碰到下面这种“弧形”样式&#xff0c;主要分为“内凹”和“外凸”两种类型&#xff0c;如下 该如何实现呢&#xff1f;或者想一下&#xff0c;有哪些 CSS 属性和“弧形”有关&#xff1f;下面介绍 3 种方式&#xff0c;一起看看吧 一、borde…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...