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

浅析ARMv8体系结构:异常处理机制

文章目录

    • 概述
    • 异常类型
      • 中断
      • 终止Abort
      • 复位Reset
      • 系统调用
    • 异常处理流程
      • 异常入口
      • 异常返回
        • 异常返回地址
      • 堆栈选择
    • 异常向量表
      • 异常向量表的配置
    • 同步异常解析
    • 相关参考

概述

异常处理指的是处理器在运行过程中发生了外部事件,导致处理器需要中断当前执行流程转而去处理异常事件的一种机制。在Intel处理器的术语中,中断与异常被分开来描述,但在ARMv8体系结构中,异常和中断统一被称为异常处理。

异常类型

在ARMv8体系结构中,广义上的异常可以分成同步异常和异步异常两种,其中:

  • 同步异常:指处理器执行某条指令而直接导致的异常,往往需要在异常处理函数里处理该异常之后,处理器才能继续执行;
  • 异步异常:指异常触发的原因与处理器当前正在执行的指令无关的异常。异步异常通常包括中断以及系统错误引起的异常。

ARMv8体系结构的异常来源于特定的几类事件,分别为中断、终止(Abort)、复位和系统调用。

中断

在ARM64处理器中,中断请求分成普通中断请求(Interrupt Request, IRQ)和快速中断请求(Fast Interrupt Request, FIQ)两种。其中,FIQ的优先级要高于IRQ。在芯片内部,分别有连接到处理器内部的IRQ和F1Q两根中断线。通常系统级芯片内部会有一个中断控制器,众多 的外部设备的中断引脚会连接到中断控制器 ,由中断控制器负责中断优先级调度,然后发送中断信号给ARM处理器。
在这里插入图片描述

终止Abort

终止主要有指令终止(instruction abort)和数据终止(data abort)两种。它们通常是指访 问内存地址时发生了错误(如缺页等),处理器内部的MMU捕获这些错误并且报告给处理器。 指令终止是指当处理器尝试执行某条指令时发生了错误,而数据终止是指使用加载或者存 储指令读写外部存储单元时发生了错误 。

复位Reset

复位(reset)操作是最高特权等级的异常,并且不能被屏蔽。复位操作通常用于让CPU复位引脚产生复位信号,让CPU进入复位状态,并重新启动。

系统调用

系统调用允许应用程序通过特殊指令提升运行时的特权等级或请求高异常等级的程序所提供的服务。ARMv8定义的系统调用指令包括以下三类:

  • SVC指令:用于应用程序请求操作系统服务的管理员调用(Supervisor Call);
  • HVC指令:用于客户操作系统请求虚拟机管理服务的虚拟机管理器调用(Hypervisor Call);
  • SMC指令:用于在非安全状态请求安全状态服务的安全监视器调用(Secure Monitor Call)。

异常处理流程

ARMv8处理器执行程序时,只有进入异常处理或者从异常返回时才能够切换异常等级。进入异常处理时,异常等级可以保持不变或者提升,但不允许降低;相反,从异常返回时,异常等级可以保持不变或者降低,但不允许提升。
在这里插入图片描述

异常入口

当一个异常发生时,CPU会感知到异常,并跳转到目标异常等级执行异常处理。在进入异常处理时,CPU会自动执行以下操作:

  • 将PSTATE寄存器的值保存到对应目标异常等级的SPSR_ELx寄存器中;
  • 将异常返回地址保存在对应目标异常等级的ELR_ELx寄存器中;
  • 把PSTATE寄存器里的D、A、I、F标志位都设置为1,相当于把调试异常、SError、IRQ以及FIQ都关闭;
  • 对于同步异常或系统错误异常,CPU会将异常的原因写入ESR_ELx寄存器中;
  • 对于同步异常,把错误地址保存在FAR_ELx寄存器中;
  • 切换SP寄存器为目标异常等级的SP_Elx或者SP_EL0寄存器;
  • 从异常发生现场的异常等级切换到目标异常等级,然后跳转到异常向量表里。

异常向量表通常由操作系统在启动时进行设置,异常向量表的每个项都会保存一条跳转指令,CPU根据异常类型跳转到恰当的异常处理函数并处理异常。

异常返回

当操作系统的异常处理完成后,执行ERET指令即可从异常返回。ERET指令会自动完成如下工作:

  • 从SPSR_ELx寄存器中恢复PSTATE寄存器的状态;
  • 从ELR_ELx寄存器中恢复PC指针。

异常返回地址

ARMv8处理器使用ELR_ELx寄存器存放异常返回的地址,即发生异常那一瞬间的地址,它可能是在用户空 间中扇地址,也可能是在内核空间中的地址,不管它在哪个空间,执行ERET指令就可以返回异常现场。

既然ELR_Elx保存了异常返回地址,那么这个返回地址是指向发生异常时的指令还是下一条指令呢?我们需要区分不同的情况:

  • 如果是异步异常(中断),返回地址指向第一条还没执行或由于中断没有成功执行的指令;
  • 如果是除系统调用的同步异常,比如数据异常、访问了没有映射的地址等,返回的是触发同步异常的那条指令;
  • 如果是系统调用,返回的是系统调用指令(例如SVC指令)的下一条指令。

堆栈选择

在ARMv8体系结构中,每个异常等级都有对应的栈指针(SP)寄存器,记为SP_ELx。当CPU运行在任何一个异常等级时,可以配置SP使用SP_EL0或者对应等级的SP_ELx寄存器。

ARMv8通过SPSel寄存器来配置异常等级使用的SP寄存器,当SPSel寄存器中的SP字段设置为0表示在所有的异常等级中,使用SP_EL0作为SP寄存器;设置为1表示使用SP_ELx作为SP寄存器。

  • 当配置SP_EL0作为SP寄存器时,可以使用后缀“t”来标记;
  • 当配置SP_ELx作为栈指针时,可以使用后缀“h”来标记。
    在这里插入图片描述

异常向量表

异常向量表用于存储异常发生时需要执行处理程序的地址,对于ARM64处理器的异常等级EL1、EL2和EL3都有自己的异常向量表。每个异常向量表有16项,每项的长度是128字节,可以存放32条指令。对于异常向量表的每一项定义如下:

在这里插入图片描述
在这里插入图片描述

每张异常向量表都可以分为4组,每组包含4项,依次对应同步异常、IRQ、FIQ和系统错误这四种异常的处理入口。对于异常向量的选择,则取决于异常发生的异常等级、异常将使用的堆栈指针以及所处的执行状态(AArch64或AArch32)等因素,具体来说

  • 如果异常发生于当前异常等级并且使用SP_EL0堆栈指针,则使用第1组异常向量;
  • 异常发生于当前异常等级并且使用SP_EL1、SP_EL2或SP_EL3堆栈指针,则使用第2组异常向量;
  • 如果异常发生于比当前异常等级更低的异常等级,且执行状态为AArch64,则使用第3组异常向量;
  • 如果异常发生于比当前异常等级更低的异常等级,且执行状态为AArch32,则使用第4组异常向量。

异常向量表的配置

ARMv8体系结构提供了一个向量基址寄存器(Vector Base Address Register)VBAR_ELx寄存器来设置异常向量表的地址。
在这里插入图片描述

  • 除EL0之外,每个EL都有自己的异常向量表;
  • 异常向量表的基地址需要设置到VBAR_ELx中;
  • 异常向量表的起始地址必须以2 KB字节对齐;
  • 每个表项可以存放32条指令,一共128字节。

同步异常解析

ARMv8体系结构中有一个与访问失效相关的寄存器——异常综合信息寄存器(Exception Syndrome Register, ESR )。
在这里插入图片描述

当异常发生时,软件通过读取ESR_ELx以知道当前发生异常的类型,然后再解析ISS字段。不同的异常类型有不同的ISS编码,需要根据异常类型解析ISS字段。
在这里插入图片描述

相关参考

  • 《ARM64体系结构编程与实践》

相关文章:

浅析ARMv8体系结构:异常处理机制

文章目录 概述异常类型中断终止Abort复位Reset系统调用 异常处理流程异常入口异常返回异常返回地址 堆栈选择 异常向量表异常向量表的配置 同步异常解析相关参考 概述 异常处理指的是处理器在运行过程中发生了外部事件,导致处理器需要中断当前执行流程转而去处理异…...

Golang开发--Goroutine的使用

Go 语言天生支持并发编程,提供了丰富的原语和工具来编写并发程序。Goroutine 是 Go 语言中的轻量级执行单位。它们是由 Go 运行时(runtime)管理的,并且能够在单个线程上运行成千上万个 Goroutine。创建 Goroutine 非常高效&#x…...

【Linux】package ‘python-yaml‘ has no installation candidate 如何解决

要解决此问题,可以尝试以下几个步骤: 确保系统已经更新到最新版本。可以使用以下命令进行系统更新: sudo apt update sudo apt upgrade确保您的软件源列表中包含了正确的软件源。可以使用以下命令编辑软件源列表: sudo nano /etc/…...

Selector选择器在AspNetCore中的用法

Selector选择器在AspNetCore中的用法 背景 项目编辑过程中会选择其所属的上级项目,而上级项目在数据结构中是以ParentID的方式表达,而非Project类型,用户不会记录也不应该记录ID值,因此应提供Selector项目下拉框供用户选择。 但…...

anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter

Win11查看安装的Python路径及安装的库 anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter 介绍开源包管理系统和环境管理系统 ,包括多种语言的包安装,运行,更新,删除,最重要的是可以解…...

java八股文面试[多线程]——锁的分类

1.1 可重入锁、不可重入锁 Java中提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是可重入锁。 重入:当前线程获取到A锁,在获取之后尝试再次获取A锁是可以直接拿到的。 不可重入:当前线程获取到A锁&…...

儿童安全门和围栏,以及游戏围栏等美国站要求的合规标准是什么?

儿童安全门和围栏 儿童安全门和围栏用于在门口(如门道)内设置围栏,或用作自支撑围栏,将幼儿可能在其中活动的区域围起来。这些商品可能由塑料、金属、乙烯树脂或木制组件等材料制成。此政策包括但不限于可扩展围栏、伸缩安全门和…...

kafka配合ElasticStack技术栈的搭配使用

今日内容: - kafka生产环境调优; - kafka配合ElasticStack技术栈的搭配使用; - zookeeper集群部署; - zookeeper的ACL; - zookeeper的调优; - PB级别项目; - ES8集群搭建/elk; (待定...) 订阅1个的topic: 老男孩: 10 多个不同的主题…...

对极几何与三角化求3D空间坐标

一&#xff0c;使用对极几何约束求R,T 第一步&#xff1a;特征匹配。提取出有效的匹配点 void find_feature_matches(const Mat &img_1, const Mat &img_2,std::vector<KeyPoint> &keypoints_1,std::vector<KeyPoint> &keypoints_2,std::vector&l…...

英语语法笔记

1.英语五大句型 主谓&#xff08;主语动词&#xff09; 主谓宾&#xff08;主语动词宾语&#xff09; 主谓宾宾&#xff08;主语动词简接宾语直接宾语&#xff09; 主谓宾补&#xff08;主语动词宾语宾语补语&#xff09; 主系表&#xff08;主语系动词主语补语&#xff09; 1…...

ES6的面向对象编程以及ES6中的类和对象

一、面向对象 1、面向对象 &#xff08;1&#xff09;是一种开发思想&#xff0c;并不是具体的一种技术 &#xff08;2&#xff09;一切事物均为对象&#xff0c;在项目中主要是对象的分工协作 2、对象的特征 &#xff08;1&#xff09;对象是属性和行为的结合体 &#x…...

ConfigMaps in K8s

摘要 ConfigMaps是Kubernetes&#xff08;K8s&#xff09;中用于存储应用程序配置信息的一种资源对象。它将key-value对存储为Kubernetes集群中的一个资源&#xff0c;并可以在Pod中以卷或环境变量的形式使用。 ConfigMaps的设计目的是将应用程序配置与应用程序本身解耦。它可…...

《机器人学一(Robotics(1))》_台大林沛群 第 6 周 【轨迹规划_直线转折处抛物线平滑】Quiz 6

步骤&#xff1a; 1、 编程 将PPT 的例子 跑一遍&#xff0c; 确保代码无误 2、根据题目 修改 相关参数 文章目录 求解代码_Python 解决的问题&#xff1a; 线段间转折点 的 速度 不连续 解决方法&#xff1a; 将直线段 两端 修正为 二次方程式 二次项圆滑 求解代码_Python …...

关于vscode的GitLens插件里的FILE HISTORY理解

最近在用vscode的GitLens插件开发项目遇到这个疑问&#xff0c;先看图&#xff1a; 每当我点击FILE HISTORY 一个commit时&#xff0c;正常来说显示器会自动将点击的提交版本和它上一个提交版本进行比较&#xff0c;如果单纯这么理解的话就错了&#xff0c;因为GitLens的File …...

通过idea实现springboot集成mybatys

概述 使用springboot 集成 mybatys后&#xff0c;通过http请求接口&#xff0c;使得通过http请求可以直接直接操作数据库&#xff1b; 完成后端功能框架&#xff1b;前端是准备上小程序&#xff0c;调用https的请求接口用。简单实现后端框架&#xff1b; 详细 springboot 集…...

力扣(LeetCode)算法_C++——移位字符串分组

给定一个字符串&#xff0c;对该字符串可以进行 “移位” 的操作&#xff0c;也就是将字符串中每个字母都变为其在字母表中后续的字母&#xff0c;比如&#xff1a;“abc” -> “bcd”。这样&#xff0c;我们可以持续进行 “移位” 操作&#xff0c;从而生成如下移位序列&am…...

Vue2 与Vue3的区别?面试题

Vue 2和Vue 3是Vue.js框架的不同版本&#xff0c;在面试中经常涉及到它们之间的区别。以下是Vue 2和Vue 3的主要区别&#xff1a; 性能提升&#xff1a;Vue 3在性能方面进行了优化。Vue 3引入了更高效的Diff算法&#xff0c;提高了渲染性能。此外&#xff0c;Vue 3还进行了代码…...

java代码:Random和Scanner应用的小例子-猜数字小游戏

//java代码&#xff1a;Random和Scanner应用的小例子-猜数字小游戏 package com.test; import java.util.Random; import java.util.Scanner; /* * 需求&#xff1a;猜数字小游戏。 * 系统产生一个1-100之间的随机数&#xff0c;请猜出这个数据是多少? * * 分析…...

python调用git出错:ImportError: Failed to initialize: Bad git executable.

报错信息 #报错信息 Traceback (most recent call last): File “”, line 1, in File “C:\Python27\lib\site-packages\git_init_.py”, line 85, in raise ImportError(‘Failed to initialize: {0}’.format(exc)) ImportError: Failed to initialize: Bad git executab…...

【C语言】入门——指针

目录 ​编辑 1.指针是什么 2.指针类型和指针运算 2.1指针-整数 2.2指针-指针 2.3指针的关系运算 3.野指针 3.1野指针成因 &#x1f44d;指针未初始化&#xff1a; &#x1f44d;指针越界访问&#xff1a; &#x1f44d;指针指向空间释放&#xff1a; 3.2如何规避野指针 …...

【PCL中Ptr释放问题 aligned_free 的2种解决方法】

PCL中Ptr释放问题 aligned_free解决方法1解决方法2解决方法1 添加avx指令&#xff0c;参考这篇博客https://blog.csdn.net/qq_60609496/article/details/123900817 解决方法2 我按照方法1尝试添加了avx或者sse等&#xff0c;都不行&#xff0c;我是要做一个静态库的时候链接…...

基于ChatGPT与飞书开放平台构建企业级智能聊天机器人实践指南

1. 项目概述&#xff1a;当ChatGPT遇上飞书&#xff0c;打造你的专属智能工作伙伴 最近在折腾一个挺有意思的项目&#xff0c;叫“chatgpt-for-chatbot-feishu”。简单来说&#xff0c;这就是一个桥梁&#xff0c;一个能让OpenAI的ChatGPT模型&#xff0c;直接接入到飞书&…...

3步掌握ADB驱动安装:Windows平台最简Android连接方案

3步掌握ADB驱动安装&#xff1a;Windows平台最简Android连接方案 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.com/gh_mirrors/la/Lat…...

FPGA驱动ADS1256的ADC精度优化实战(三)

1. 硬件连接优化&#xff1a;从杜邦线到PCB布局的精度跃升 第一次用杜邦线连接FPGA和ADS1256时&#xff0c;我测得的电压误差居然有30mV&#xff0c;这让我差点怀疑人生。后来把万用表直接怼到ADC引脚上&#xff0c;才发现杜邦线本身就有5-8mV的压降波动。这种看似微不足道的干…...

三量子比特控制旋转门:挑战与创新协议设计

1. 三量子比特控制旋转门的核心挑战在量子计算领域&#xff0c;多量子比特门是实现复杂量子算法的关键构建模块。其中&#xff0c;三量子比特控制旋转门(C2Ry)作为一种基本的多量子比特操作&#xff0c;能够根据两个控制量子比特的状态对目标量子比特执行条件旋转&#xff0c;在…...

内容创作平台集成多个AI模型提升内容多样性的实践

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 内容创作平台集成多个AI模型提升内容多样性的实践 对于内容创作平台而言&#xff0c;用户的偏好千差万别&#xff0c;内容的类型也…...

僧伽罗文语音本地化迫在眉睫!斯里兰卡新《数字服务法》2024年10月生效前,你必须掌握的7项ElevenLabs合规配置

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;僧伽罗文语音本地化的法律动因与技术紧迫性 斯里兰卡《官方语言法》&#xff08;No. 33 of 1956&#xff09;及2023年修订的《国家数字包容战略》明确要求&#xff1a;所有面向公众的政府数字服务必须支…...

深入解析vsync:基于版本化状态流的高并发同步原语

1. 项目概述&#xff1a;一个被低估的同步利器如果你在开发中经常需要处理跨进程、跨线程的数据同步&#xff0c;或者为状态管理中的竞态条件头疼&#xff0c;那么nicepkg/vsync这个项目很可能就是你一直在寻找的“瑞士军刀”。乍一看这个标题&#xff0c;它像是一个普通的版本…...

钱学森物理大一统:宇宙速度阶梯尺 全套公版正式文档(带可计算代码)

宇宙速度阶梯尺 全套公版正式文档 &#xff08;无版权全开源全民通用可直接印刷发布/平台投稿/社区分发&#xff09; 开篇总纲 定名&#xff1a;本源速度阶梯尺 核心主旨&#xff1a;大道至简&#xff0c;以地球天然标准音速为万物速度本源基底&#xff0c;以宇宙真空光速为速度…...

Steam库存管理革命:5分钟掌握批量操作终极指南

Steam库存管理革命&#xff1a;5分钟掌握批量操作终极指南 【免费下载链接】Steam-Economy-Enhancer 中文版&#xff1a;Enhances the Steam Inventory and Steam Market. 项目地址: https://gitcode.com/gh_mirrors/ste/Steam-Economy-Enhancer Steam Economy Enhancer…...