浅析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体系结构编程与实践》

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程:“AI绘画:Stable Diffusion 终极宝典:从入门到精通 ” 尽管如此,还有读者反馈说,尽管已经成功安装,但生成的图片与我展示的结果相去甚远。真实感和质感之…

中间件环境搭建配置过程解读

中间件环境搭建 目录 中间件环境搭建xampp 搭建环境Tomcat环境配置安装mysql连接mysql 问题解决 xampp 搭建环境 安装xampp服务集成环境工具 官网地址下载项目压缩包,将项目文件夹放在xampp安装目录的htdocs文件夹下初始化xampp:运行目录内的setup_xamp…

如何解决分库分表主键问题?

分析&回答 从问题角度出发:我们需要一个全局唯一的 id 来支持,排序问题等。这都是你实际生产环境中必须考虑的问题。可以先看下我们之前的文章分布式系统唯一ID如何生成? 雪花算法和雪花算法的变种是大家常用的 喵呜面试助手&#xff1…

企业架构LNMP学习笔记11

Nginx配置文件的介绍: #nginx子进程启动用户 #user nobody; #子进程数量 一般调整为cpu核数或者倍数 worker_processes 1; #错误日志定义 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#进程pid 存储文件…

Solidity 小白教程:5. 变量数据存储和作用域 storage_memory_calldata

Solidity 小白教程:5. 变量数据存储和作用域 storage_memory_calldata Solidity 中的引用类型 引用类型(Reference Type):包括数组(array),结构体(struct)和映射(mapping&#xff…

使用boost::geometry::union_ 合并边界(内、外):方案二

使用boost::geometry::union_ 合并边界&#xff08;内、外&#xff09;&#xff1a;方案二 typedef boost::geometry::model::d2::point_xy<double> boost_point; typedef boost::geometry::model::polygon<boost_point> boost_Polygon;struct Point {float x;floa…

牛客网刷题

牛客网刷题-C&C 2023年9月3日15:58:392023年9月3日16:37:01 2023年9月3日15:58:39 2023年9月3日16:37:01 整型常量和实型常量的区别

5G智能网关如何解决城市停车痛点难点

2023年上半年&#xff0c;我国汽车新注册登记1175万辆&#xff0c;同比增长5.8%&#xff0c;88个城市汽车保有量超过100万辆&#xff0c;北京、成都等24个城市超过300万辆。随着车辆保有量持续增加&#xff0c;停车难问题长期困扰城市居民&#xff0c;也导致城市路段违停普遍、…

vscode搭建springboot开发环境

前言 idea好用到但是收money&#xff0c;eclipse免费但是界面有点丑&#xff0c;所以尝试使用vscode开发springboot 提前准备 安装jdk&#xff0c;jdk需要大于11 安装vscode 安装maven 安装插件 主要是下面的插件 Extension Pack for JavaSpring Boot Extension PackDepe…

Node爬虫项目精简版 wallhaven网站实操 2023.8.29

练习地址&#xff1a; https://wallhaven.cc/toplist const express require(express); const axios require(axios); const cheerio require(cheerio); const schedule require(node-schedule); const fs require(fs);async function downloadImage(url) {const response…

Rstudio开不开了怎么办?R is taking longer to start than usual

Rstudio Server 启动时卡死 在使用 linux 服务器版 RstudioServer 的过程中&#xff0c;发现出现了一个问题&#xff0c;导致没有办法正常载入工作页面&#xff0c;网页提示信息是“R is taking longer to start than usual”&#xff0c;直接翻译过来就是“这次启动 R 会比平…

Emmet 使用笔记小结

Emmet 使用笔记小结 最近在跟视频走 CSS 的教程&#xff0c;然后要写很多的 HTML 结构&#xff0c;就想着总结一下 Emmet 的语法。 Emmet 是一个工具可以用来加速 HTML 和 CSS 的开发过程&#xff0c;不过 emmet 只支持 HTML & XML 文件结构&#xff0c;所以我个人觉得对…

腾讯云免费SSL证书申请流程_2023更新教程

2023腾讯云免费SSL证书申请流程&#xff0c;一个腾讯云账号可以申请50张免费SSL证书&#xff0c;免费SSL证书为DV证书&#xff0c;仅支持单一域名&#xff0c;申请腾讯云免费SSL证书3分钟即可申请成功&#xff0c;免费SSL证书品牌为TrustAsia亚洲诚信&#xff0c;腾讯云百科分享…

【经济研究】论文《经济ZC不确定性与创新》数据复现

数据简介&#xff1a;当前宏观经济面临较大下行压力&#xff0c;需要“稳中求进”兼顾经济高质量发展与经济增速等多种目标&#xff0c;这就不可避免地导致各种经济ZC的频繁调整&#xff0c;产生不确定性风险。在此背景下&#xff0c;经济政策不确定性上升如何影响企业决策&…

ISO/IEC标准组织介绍(三十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

华为静态路由配置实验(超详细讲解+详细命令行)

系列文章目录 华为数通学习&#xff08;7&#xff09; 前言 一&#xff0c;静态路由配置 二&#xff0c;网络地址配置 AR1的配置&#xff1a; AR2的配置&#xff1a; AR3的配置&#xff1a; 三&#xff0c;测试是否连通 AR1的配置: 讲解&#xff1a; AR2的配置&#…

2020ICPC南京站

K K Co-prime Permutation 题意&#xff1a;给定n和k&#xff0c;让你构造n的排列&#xff0c;满足gcd(pi, i)1的个数为k。 思路&#xff1a;因为x和x-1互质&#xff0c;1和任何数互质&#xff0c;任何数和它本身不互质 当k为奇数时&#xff0c;p11&#xff0c;后面k-1个数…

yum 、rpm、yumdownloader、repotrack 学习笔记

1 Linux 包管理器概述 rpm的使用&#xff1a; rpm -ivh filename.rpm#这列出该packageName&#xff08;包名&#xff09;安装的所有文件列表。 rpm -ql packageName #查询已安装的该packageName的详细信息&#xff0c;包括版本、发布日期等。 rpm -qi packageName #列出该pac…

如何在,Linux中安装Luajit2.*

1.文件下载The LuaJIT Project 2.将下载文件上传到对应的服务器&#xff1a;例如/opt 3.进入对应的文件夹 4.make PREFIX/usr/local&#xff0c;设置安装路径 5.make install&#xff0c;编译安装 6.进入安装目录&#xff0c;cd /usr/local/include/luajit-2.0 7.luajit -v…

【Stable Diffusion安装】支持python3.11 window版

前言 主要的安装步骤是参考B站播放量第一的视频&#xff0c;但是那位阿婆主应该是没有编程经验&#xff0c;只强调使用3.10&#xff0c;而python最新版本是3.11。 理论上来说&#xff0c;只是一个小版本的不同&#xff0c;应该是可以安装成功了。自己摸索了下&#xff0c;挺费…