ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables

目录

一,AArch64 异常向量表

 二,栈指针以及SP寄存器的选择

三,从异常返回


 

一,AArch64 异常向量表

异常向量表(vector tables)是一组存放于普通内存(normal memory)空间的,用于处理不同类型异常的指令(exception handler)。

当异常发生时,处理器需要跳转到对应的异常处理器(exception handler)来处理异常。异常处理器充当调度代码,识别异常的原因,然后调用相关的处理程序代码(异常处理子程序)来处理异常。

  • exception vector:在内存中存储异常处理器(exception handler)的位置称为异常向量。
  • exception vector tables :异常向量统一存放的区域称为异常向量表。
每个异常级别都有它自己的向量表,其基地址由它自己的向量基地址寄存器(Vector Base Address Register) VBAR_EL<x>定义,其中<x>为1、2或3。需要注意的是,没有针对EL0的向量表,因为异常永远不会在EL0中被处理。VBAR的值需要由软件进行初始化,它们在reset后的值是未定义的。
所有的向量表都使用相同的格式,对不同的异常类型和异常来源,有着不同的异常处理器(异常向量) ,并且,针对每种异常类型,在距离向量基地址的固定偏移量处(0x80)都有一个异常向量。
异常向量的区分和选择取决于如下因素:
  • 异常的类型,比如有(SError, FIQ, IRQ以及同步异常)。
  • 当前异常等级以及目标异常等级(The Exception levels the exception is being taken from and to)。
  • 当前支持的执行状态(AArch32或者AArch64)
  • 所使用的栈指针寄存器(SP_EL0还是SP_ELx)

下表为AArch64的异常向量表格式:

Address

Exception type

Description

VBAR_ELn + 0x000

Synchronous

Current EL with SP0

+ 0x080

IRQ/vIRQ

+ 0x100

FIQ/vFIQ

+ 0x180

SError/vSError

+ 0x200

Synchronous

Current EL with SPx

+ 0x280

IRQ/vIRQ

+ 0x300

FIQ/vFIQ

+ 0x380

SError/vSError

+ 0x400

Synchronous

Lower EL using AArch64

+ 0x480

IRQ/vIRQ

+ 0x500

FIQ/vFIQ

+ 0x580

SError/vSError

+ 0x600

Synchronous

Lower EL using AArch32

+ 0x680

IRQ/vIRQ

+ 0x700

FIQ/vFIQ

+ 0x780

SError/vSError

从这张表我们可以知道,这些向量被分为两组,每一组又被分为两个子组: 

  • 异常等级有变化(准确来说是异常等级提高,从低等级进入到更高等级,Exception from Lower EL)
    • 低等级是AArch32状态
    • 低等级是AArch64状态
  • 异常等级无变化
    • 异常使用SP_ELx。
    • 异常使用SP_EL0。

在VBAR_ELn 的向量基地址已知的情况下,当发生异常时,处理器可以根据当前的状态以及异常的类型,找到对应的异常向量进行异常处理。

如下图所示,为一个简单的异常处理流程图,当异常发生时,处理器会跳到对应异常向量中,首先将易失寄存器,也就是当前处理器的寄存器上下文保存到栈中。然后调用针对当前异常类型的异常处理函数进行处理。在异常处理完之后,再将之前保存在栈中的寄存器上下文恢复。最后执行ERET指令,从异常中返回。

AArch64的异常向量有32 个word的空间(128 bytes),可以存放32条指令,可以用于栈操作(寄存器上下文的压栈以及出栈)、调用特定异常处理函数以及ERET指令。

 

 二,栈指针以及SP寄存器的选择

 在上节中提到过异常向量的选择因素中有一项所使用的栈指针寄存器(SP_EL0还是SP_ELx)。当处理器执行在AArch64状态下时,ARM架构允许软件为当前的异常等级选择栈指针寄存器:

  • SP_EL0(需要配置PSTATE的SP)。
  • SP_ELx,x为当前的异常等级(默认情况)。

比如处理器当前处于EL1,默认情况下是使用SP_EL1作为当前的SP寄存器,但是也可以配置成使用SP_EL0。基于此配置,异常向量也被多分成了两组(使用SP_EL0还是SP_ELx)。

当异常发生时,默认情况下,会自动使用目标异常等级的SP_ELx作为栈指针寄存器。但是栈指针寄存器的选择可以通过配置PSTATE来实现,另外必须遵守如下规则:

  • 如果当前处于EL0,则处理器使用EL0的栈指针寄存器:SP_EL0。
  • 如果处于EL1,EL2或者EL3时,处理器使用的栈指针寄存器受到PSTATE.SP位控制
    • ​​​​​​​​​​​​​​如果PSTATE.SP=0,则处理器使用SP_EL0。
    • 如果PSTATE.SP=1(默认情况下为1,在warm reset后,SP也为1),则处理器使用SP_ELx。

 为什么会有SP_EL0和SP_ELx的选择配置呢?

主要是因为EL0是应用层,一般的应用程序都在EL0上运行,因此给SP_EL0分配的栈空间一般都非常大。如果异常处理时有比较大的栈空间需求,SP_EL0是更好的选择,软件可以通过设置PSTATE.SP=0,让其他异常等级上的程序工作使用SP_EL0。

三,从异常返回

当异常处理完成后,处理器需要恢复到异常发生前的状态,需要:

  • 恢复所有的之前压入栈的寄存器上下文。
  • 执行ERET指令。

ERET指令主要干了两件事:

  • SPSR_EL<x>寄存器里的值恢复到PSTATE。
  • 将ELR_EL<x>里保存的地址恢复到PC寄存器,相当于处理器跳转到ELR_EL<x>中的地址。

SPSR_EL<x>和ELR_EL<x>的x是目标异常等级,也就是(taken to和returned from的异常等级),SPSR_EL<x>寄存器里也同样保存着执行状态控制bit,如果想要改变处理器的执行状态,其中一个方法就是在ERET指令之前,将想要的执行状态(AArch32或者AArch64)提前写入SPSR_ELx。需要注意的是,写入SPSR_ELx的执行状态需要和SCR_EL3.RW 或者HCR_EL2.RW配置相对应,不然会产生非法的异常返回。

ERET主要是将SPSR_EL<x>和ELR_EL<x>的值更新到PSTATE和PC寄存器,为了让处理器不会进入未定义的状态,这两个更新操作是原子性的(不会被打断),而且对处理器来说是不可见的。

下图是ERET指令的伪代码,通过对伪代码进行分析,可以知道,虽然ERET的两个更新操作是原子性的,但是也有先后顺序:先更新SPSR,再更新PC 。

 

 

 

 对于ELR的使用,有一点要特别注意:ELR中保存的地址与异常类型有关。

  • 对于同步的异常服务调用指令,比如SVC、HVC以及SMC。假设执行了SMC指令进入到EL3,ELR_EL3中保存的是SMC的下一条指令。
  • 对于其他的同步异常,ELR保存的是产生异常的那条指令的地址。
  • 对于异步异常,ELR中保存的是当异常发生时,第一条还没有被执行完成的指令的地址。

当然异常处理程序软件也可以再适当的时候修改ELR寄存器里的内容,确保处理器在ERET指令后能回到正确的程序流中。

下图是ARMv7的各类型异常的首选异常返回地址:

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

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

相关文章

视频号视频下载(如何把视频号中的视频下载下来)

在如今的信息时代&#xff0c;热点创作者和科技创作者们的素材库越来越丰富&#xff0c;视频号作为一种新兴的媒体形式&#xff0c;其中蕴含的优质内容更是不可或缺。但是&#xff0c;如何将心仪的视频号视频下载下来&#xff0c;进行二次创作并在其他平台发布呢&#xff1f;今…

Vue+SpringBoot打造开放实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

Kafka集群详解

Kafka集群的目标 1、高并发 2、高可用&#xff08;防数据丢失&#xff09; 3、动态伸缩 Kafka集群规模如何预估 吞吐量&#xff1a; 集群可以提高处理请求的能力。单个Broker的性能不足&#xff0c;可以通过扩展broker来解决。 磁盘空间&#xff1a; 比如&#xff0c;如…

Ansible user 模块 该模块主要是用来管理用户账号

目录 参数语法验证创建用户删除用户验证 删除用户 参数 comment  # 用户的描述信息 createhome  # 是否创建家目录 force  # 在使用stateabsent时, 行为与userdel –force一致. group  # 指定基本组 groups  # 指定附加组&#xff0c;如果指定为(groups)表示删除所有…

Nest.js权限管理系统开发(二)连接MySQL、Redis

安装MySQL及相关依赖 下载dmg文件安装 前往MySQL :: Download MySQL Community Server下载最新版本的MySQL。 打开系统设置&#xff0c;拉到最下方可以看到MySQL&#xff0c;打开看到两个绿点表示安装成功&#xff0c;也可以在这里修改MySQL密码。 配置环境变量 打开终端配…

Windows中的Git Bash运行conda命令:未找到命令的错误(已解决)

在windows中的Gitbash中 打开激活conda环境&#xff0c;并运行&#xff08;前提是你先安装好git&#xff08;自己去官网下载&#xff09;&#xff09;。 要能够在Gitbash上运行Conda&#xff0c; 临时配置 如果你只是临时用一下&#xff0c;就是临时爽一把&#xff0c;那就按…

独立站建站全攻略:从0到1打造专属在线商业平台

独立站建站全攻略&#xff1a;从0到1打造专属在线商业平台 随着互联网的普及和发展&#xff0c;越来越多的企业和个人开始认识到拥有一个独立站的重要性。独立站不仅可以提升品牌形象&#xff0c;还能为企业带来更多的流量和潜在客户。本文将为大家详细介绍独立站建站的全过程…

代码随想录day32--动态规划理论基础

什么是动态规划 动态规划简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点一定要和贪心区别出来&#xff0c;贪心没有状态推导&#xff0c;而是直接从局部直接…

【深度学习】主要提出者【Hinton】中国大会最新演讲【通往智能的两种道路】

「但我已经老了&#xff0c;我所希望的是像你们这样的年轻有为的研究人员&#xff0c;去想出我们如何能够拥有这些超级智能&#xff0c;使我们的生活变得更好&#xff0c;而不是被它们控制。」 6 月 10 日&#xff0c;在 2023 北京智源大会的闭幕式演讲中&#xff0c;在谈到如…

opengles 顶点坐标变换常用的矩阵(九)

文章目录 前言一、opengles 常用的模型矩阵1. 单位矩阵2. 缩放矩阵3. 位移矩阵4. 旋转矩阵二、第三方矩阵数学库1. glm1.1 ubuntu 上安装 glm 库1.2 glm 使用实例1.2.1 生成一个沿Y轴旋转45度的4x4旋转矩阵, 代码实例如下1.2.2 生成一个将物体移到到Z轴正方向坐标为5处的4x4 vi…

K线实战分析系列之七:行情顶部的看跌信号——黄昏星形态

K线实战分析系列之七&#xff1a;行情顶部的看跌信号——黄昏星形态 一、黄昏星形态二、黄昏线总结 一、黄昏星形态 二、黄昏线总结 黄昏星的高点形成阻力位&#xff0c;启明星的低点形成支撑位中间的星线实体与第一根K线的实体跳空区域比较宽&#xff0c;第三根K线覆盖了第一…

SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示

目录 前言 一、加入DWZ J-UI框架 二、实现登录页面 三、实现主页面菜单显示 前言 大家好&#xff01;写文章之前先列出几篇相关文章。本文内容也在其项目中接续实现。 一. SSM项目集成Spring Security 4.X版本&#xff08;使用spring-security.xml 配置文件方式&#xff…

旅游组团自驾游拼团系统 微信小程序python+java+node.js+php

随着社会的发展&#xff0c;旅游业已成为全球经济中发展势头最强劲和规模最大的产业之一。为方便驴友出行&#xff0c;寻找旅游伙伴&#xff0c;更好的规划旅游计划&#xff0c;开发一款自驾游拼团小程序&#xff0c;通过微信小程序发起自驾游拼团&#xff0c;吸收有车或无车驴…

CentOS安装Redis教程

CentOS安装Redis教程 一、Redis安装包压缩文件下载二、把下载好的Redis安装包压缩文件上传到服务器三、Redis安装四、Redis相关配置五、运行redis并指定配置文件 一、Redis安装包压缩文件下载 下载地址&#xff1a;Redis官网 省事链接奉上&#xff1a;Redis 6.2.14网盘下载链接…

在Linux服务器上部署一个单机项目

目录 一、jdk安装 二、tomcat安装 三、MySQL安装 四、部署项目 一、jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2. 解压安装包 这里需要解压到usr/local目录下&#xff0c;在这里我新建一个文件夹保存解压后的文件 [r…

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…

5.2.鸿蒙LiteOS-M los_dispatch

目录 一、cortex-m4 los_dispatch.S代码分析坚持就有收获 一、cortex-m4 los_dispatch.S代码分析 .syntax unified #.syntax [unified | divided], 指定arm 汇编语法规则 .arch armv7e-m #指定平台, 与命令行参数-march同样的作用 .fpu fpv4-sp-d16 #指定浮点运算…

第九篇【传奇开心果系列】python文本和语音相互转换库技术点案例示例:SpeechRecognitio库开发会议记录和转录工具经典案例

传奇开心果博文系列 系列博文目录python文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、SpeechRecognition库多种语音识别引擎支持示例代码四、SpeechRecognition库实时语音转录示例代码五、SpeechRecognitio库转录文本中提取关键词…

GPT Pilot - 编写 95% 代码的开发工具!

在这篇博客介绍了GPT-pilot的研发细节&#xff0c;原作者将探讨GPT Pilot的技术内核 —— 一款基于GPT-4编写的开发工具&#xff0c;可以生成生产使用代码的应用。 你有没有想过&#xff0c;95%的应用代码&#xff0c;可以由AI编写&#xff0c;就像《钢铁侠》里的贾维斯一样&a…

DAY30--learning English

一、积累 1.budget 2.fabulous 3.strait 4.jut 5.grater 6.fillet 7.fin 8.decay 9.cartilage 10.gill 11.convex 12.concave 13.tender 14.trim 15.workload 16.knuckle 17.crevice 18.skew 19.membrane 20.delicate 二、练习 1.牛津原译 Budget /ˈbʌdʒɪt/ 1.[ CU]the…