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

news2025/1/27 13:00:50

这里写目录标题

  • 一,同步异常的分析
    • 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。

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

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

相关文章

Maven jar 的查找及依赖版本确定

关于 jar 的查找,及使用版本的确定,及依赖的版本确认,避免 jar 冲突或版本不兼容 在使用 maven 构建项目时,需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖,这里以查找 mybatis 依赖为例&…

【LeetCode】升级打怪之路 Day 07:nSum 问题

今日题目: 15. 三数之和 | LeetCode18. 四数之和 | LeetCode454. 四数相加 II | LeetCode383. 赎金信 | LeetCode 目录 Problem 1:nSum 问题 【必会】LC 15. 三数之和 【classic, important】LC 18. 四数之和 【classic, important】 Problem 2&#xff…

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection 论文链接:https://arxiv.org/pdf/2012.04355.pdf 代码链接:https://github.com/yezhen17/3DIoUMatch 作者单位:Stanford University等 发表平台:…

Terra Photos再升级,春节照片整理新选择

今年春节那叫一个热闹非凡 像今年火到英国的英歌舞小马也看了好几场 照片、视频咔咔拍 想家的时候点开视频仿佛又回到了春节 什么? 你问我视频太多了不够存怎么办? 嘿你可别忘了我是做什么的 铁威马NAS来帮你 之前跟大家介绍过铁威马独家应用 Te…

Python中各种符号的意义

Python中的各种符号总结如下: 运算符 描述实例算术运算符加 - 两个对象相加a b 输出结果 30-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200/除 - x除以yb / a 输出结果 2%取模 - 返回…

uniapp的微信小程序授权头像昵称(最新版)

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈,小程序官方又整幺蛾子了。wx.getUserInfo接口收回,wx.getUserProfile接口也不让用。导致我的个人小程序:梦缘 的授权…

微服务-实用篇

微服务-实用篇 一、微服务治理1.微服务远程调用2.Eureka注册中心Eureka的作用:搭建EurekaServer服务Client服务注册服务发现Ribbon负载均衡策略配置Ribbon配置饥饿加载 3.nacos注册中心使用nacos注册中心服务nacos区域负载均衡nacos环境隔离-namespaceNacos和Eureka…

如何将本地项目上传到github上

将本地项目上传到github上有很多种方法,这里只讲述我认为最简单快捷的一种,先在github中创建一个仓库,接着在本地建文件夹,用命令行将项目推送到本地仓库,然后连接远程仓库,将本地项目推送到远程仓库上。要…

成功解决[!] CocoaPods could not find compatible versions for pod “sqflite“

当pod install时出现下面的错误: Analyzing dependencies [!] CocoaPods could not find compatible versions for pod "sqflite": In Podfile:sqflite (from .symlinks/plugins/sqflite/darwin)Specs satisfying the sqflite (from .symlinks/plugins…

【leetcode热题】杨辉三角 II

难度: 简单通过率: 41.1%题目链接:. - 力扣(LeetCode) 题目描述 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 在杨辉三角中,每个数是它左上方和右上方的数的和。 示…

基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

就业班 2401--2.26 Linux Day5--进程管理一

一、权限扩展 文件权限管理之: 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ----------------…

2024022601-数据库语言SQL

数据库语言SQL SQL的发展 1974年,由Boyce和Chamberlin提出 1975~1979,IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3) 非过程化语言 SQL语言进行数据库操作…

Android 框架设计模板

不同项目在使用该模板时多少会有出入,应以项目实际情况作为依据。 (该文档可以 .md 格式存放于项目根目录,或编写到readme 中) 项目描述 涉及如下方面 项目背景 (可引用项目立项书)项目需求 &#xff08…

小技巧:Nuxt处理全局组件的显示与隐藏

在Nuxt开发过程中,大家会遇到需要控制全局组件的显示与隐藏。比如说移动端的路由导航栏、头部的返回操作。。。 为了使切换页面的同时,确定是否展示全局组件,保证页面展示的平稳过渡。 下面是我在项目中用到一个办法,已实现。 …

formality:set_constant应用

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: formality:形式验证流程 scan mode func的功能检查需要把scan mode设置成0。

petalinux烧写image.ub报错

xinlinx SDK烧写petalinux生成的BOOT.BIN和image.ub时,BOOT.BIN烧写正常,image.ub烧写报错如下 Erase Operation failed. INFO: [Xicom 50-44] Elapsed time 0 sec.ERROR: Flash Operation Failed串口助手操作擦除flash如图: 解决方法&am…

【自然语言处理四-从矩阵操作角度看 自注意self attention】

自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看,self attention如何解决问题的?W^q^ W^k^ W^v^这三个矩阵怎么获…

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

ZTE E8820V2重启偶现5G wifi丢失问题

使用ZTE E8820V2设备时,发现设备在多次重启过程中会出现5G wifi信号丢失的情况。 1. 现象日志 使用老毛子固件,具体丢失时会出现相关log: 2. 问题原因: GPIO#19 是 PCIE reset 外,GPIO#26 也要 reset。 3. 解决方法: E8820V2/rt-n56u/trunk$ git diff linux-3.4.x…