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

这篇具有很好参考价值的文章主要介绍了浅析ARMv8体系结构:异常处理机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

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

异常类型

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

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

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

中断

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

终止Abort

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

复位Reset

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

系统调用

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

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

异常处理流程

ARMv8处理器执行程序时,只有进入异常处理或者从异常返回时才能够切换异常等级。进入异常处理时,异常等级可以保持不变或者提升,但不允许降低;相反,从异常返回时,异常等级可以保持不变或者降低,但不允许提升。
浅析ARMv8体系结构:异常处理机制,# Arm体系结构,ARM,异常,中断

异常入口

当一个异常发生时,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”来标记。
    浅析ARMv8体系结构:异常处理机制,# Arm体系结构,ARM,异常,中断

异常向量表

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

浅析ARMv8体系结构:异常处理机制,# Arm体系结构,ARM,异常,中断
浅析ARMv8体系结构:异常处理机制,# Arm体系结构,ARM,异常,中断

每张异常向量表都可以分为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寄存器来设置异常向量表的地址。
浅析ARMv8体系结构:异常处理机制,# Arm体系结构,ARM,异常,中断

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

同步异常解析

ARMv8体系结构中有一个与访问失效相关的寄存器——异常综合信息寄存器(Exception Syndrome Register, ESR )。
浅析ARMv8体系结构:异常处理机制,# Arm体系结构,ARM,异常,中断

当异常发生时,软件通过读取ESR_ELx以知道当前发生异常的类型,然后再解析ISS字段。不同的异常类型有不同的ISS编码,需要根据异常类型解析ISS字段。
浅析ARMv8体系结构:异常处理机制,# Arm体系结构,ARM,异常,中断文章来源地址https://www.toymoban.com/news/detail-708814.html

相关参考

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

到了这里,关于浅析ARMv8体系结构:异常处理机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    在文章ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types中提到过,同步异常是处理器在执行指令时产生的异常,是一种精确的,可以具体定位到是哪条指令导致异常的产生。下面笔者将介绍三个用于定位并分析同步异常产生的寄存器。 在文章ARMv8-AArch64 的异常处理模型

    2024年03月27日
    浏览(31)
  • ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types

    异常(Exception)通俗点来讲,就是系统在正常运行的时候出现的非正常事件,这个非正常事件会导致系统状态更改或者其他错误,为了确保系统功能能正常运行,需要一些带有特权的软件代码(exception handler)来采取一些补救措施或者更新系统状态,这个过程被称为异常处理

    2024年01月21日
    浏览(25)
  • ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables

    目录 一,AArch64 异常向量表  二,栈指针以及SP寄存器的选择 三,从异常返回   异常向量表 (vector tables) 是一组存放于普通内存( normal memory) 空间的,用于处理不同类型异常的指令(exception handler)。 当异常发生时,处理器需要跳转到对应的异常处理器(exception handler)

    2024年02月22日
    浏览(39)
  • ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态

    在了解AArch64异常等级模型之前,有必要先理解特权的概念。现代软件被开发成不同的模块,每个模块对系统和处理器资源有不同的访问级别。比如操作系统内核和用户应用程序的划分。操作系统内核需要高级别的权限来访问系统资源,然而应用程序应当被限制其配置系统的能

    2024年02月03日
    浏览(29)
  • 详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)

    目录 一.异常的概念 二.异常的体系结构 三.异常的处理 异常处理思路 LBYL:Look Before You Leap EAFP: It\\\'s Easier to Ask Forgiveness than Permission 异常抛出throw 异常的捕获 提醒声明throws  try-catch捕获处理 finally的作用 四.自定义异常类 有一句话说的很好 ”程序员不是在写BUG就是在改BUG”

    2024年02月05日
    浏览(30)
  • 【ARMv8 异常模型入门及渐进 1 -- 处理器运行模式及EL3/EL2/EL1学习】

    下篇文章:ARMv8 异常模型入门及渐进 2 - 通用寄存器介绍 在ARM v7架构中的ARM核用 PL 的方式定义执行等级。在ARMv8中ARM核的执行等级划分如下图所示。 表 1-1 ARM v8中一个ARM core 运行时可能具有两种状态:分别为 secure world normal world。 两种状态下都有其对应的 EL0 , EL1 。 而 EL3 是

    2024年02月15日
    浏览(33)
  • [ARM汇编]ARM体系结构简介—1.2.1 ARM处理器的历史与发展

    ARM(Advanced RISC Machine,先进的精简指令集计算机)处理器是一种广泛应用于嵌入式系统的处理器架构,具有低功耗、高性能、低成本等特点。接下来,我们将介绍 ARM 处理器的历史与发展。 ARM 处理器的历史 ARM 处理器的历史可以追溯到 1983 年,当时英国的 Acorn 电脑公司为了

    2024年02月09日
    浏览(34)
  • ARMv8-A 与异常相关的指令

    最近一直在学习 ARMv8-A 的东西,记录一下与异常相关的指令。下面的内容基于AArch64讨论,暂不考虑 AArch32。 与异常生成相关的指令如下所示。下面主要学习 SVC 和 HVC 。 1. SVC SVC (Supervisor Call) 产生一个路由到 EL1 的异常,可以调用系统服务这些。此时, ESR_ELx.EC = 0x15 。 2. HVC

    2024年02月21日
    浏览(33)
  • ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)

    目录 1,异常等级(Exception Level) 2,Execution states,执行状态 AArch64的异常等级 AArch32的异常等级: 3,异常等级切换  4,执行状态切换(AArch64 = AArch32) 5,状态切换后的寄存器状态 Registers at AArch32 PSTATE at AArch32 6,指令集的切换:Switching between the instruction sets 在ARMv8中,存在

    2024年02月13日
    浏览(38)
  • UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

            所有的操作系统都为运行在其上的程序提供服务,比如:执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等         从严格意义上来说,操作系统可被定义为一种软件,它控制计算机硬件资源,提供程序运行的环境。我们通常将这种软件称为

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包