ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions

这篇具有很好参考价值的文章主要介绍了ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,异常处理相关概念

在介绍异常处理之前,有必要了解一些关于异常处理状态的术语:

  • 当处理器响应一个异常时,我们称该异常被获取了( taken )。
  • 处理器响应异常之前的状态被称为 taken from
  • 处理器响应异常之后的状态被称为 taken to

因此,当处理器识别到异常时,此时处理器处于 taken from。在异常之后的状态称为 taken to。
当异常处理完成后,处理器需要返回到异常发生前的状态,这个过程称为 exception return。并且在ARM架构中有专门的指令用于异常返回(ERET):

  • 处理器在执行异常返回指令之前的状态,称为 returns from。
  • 处理器在执行异常返回指令之后的状态,称为 retruns to。

如下图所示,为处理器异常状态转换 : EL0 -> EL1-> EL0的全过程:

  1. 先执行 SVC指令,从EL0切换到 EL1,这个过程也称为 taken a exception from EL0 to EL1.
  2. 在 EL1的exception handler里处理完异常。
  3. 处理完异常后执行 ERET(exception retrun)指令,从EL1返回到 EL0.此过程也称为 return a exception from EL1 to EL0.
    ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions,ARM,arm,异常处理,exception,AArch64,ARMv8

二,异常处理概述

当异常发生时,处理器会先保存处理器当前的状态(CPSR,也称为PSTATE)以及异常返回地址。然后进入一个特殊的状态来处理改异常。
当前处理器的状态信息来自于PSTATE寄存器,也就是CPSR,处理器会将异常发生前的PSTATE的值写入到SPSR(Saved Program Status Register)中。而异常返回的地址,将会写入到异常链接寄存器ELR(Exception Link Register)。
此外,对于同步异常以及SError异常,处理器还会更新异常综合寄存器ESR(Exception Syndrome Register),该寄存器记录了异常产生的原因。
总结如下,当异常发生并进入一个AArch64的异常等级(ELx)时,处理器会有如下操作:

  1. 在异常被处理前的PSTATE寄存器的内容会被写入到SPSR_ELx寄存器中。
  2. 异常返回地址会被写入到ELR_ELx寄存器中。

此外:

  1. 对于同步异常和SError异常,异常发生的原因也会被记录到ESR_ELx寄存器中。
  2. 对于地址相关的同步异常,比如MMU错误,导致异常发生的虚拟地址也会被写入到错误地址寄存器(Fault Address Register,FAR_ELx)中。

对任何给定异常的异常处理都从一个称为异常向量(exception vector)的固定内存地址开始,当异常发生时,处理器将会跳转到异常向量表的某个地方。

AArch64中的向量表与许多其他处理器体系结构不同,因为它们包含指令,而不是地址。每个条目最多包含32条指令;刚好足以执行基本堆叠和调用特定于异常的处理代码。

向量表的位置通常被配置为异常处理程序代码,以执行通用操作,并根据异常类型跳转到进一步的异常处理代码,如下图所示的top level 处理函数。这个top level向量代码被限制为32个字(word)大小。异常处理程序包含处理请求操作的代码,并可以从异常状态返回。
ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions,ARM,arm,异常处理,exception,AArch64,ARMv8
当一个异常被识别时,它同时也对应着一个异常等级EL,因此在处理异常的过程中,可以路由到一个不同的EL中。这也是处理器提高特权的唯一方法:通过异常等级切换,从低的异常等级切换到高的异常等级。同理,处理器若是想降低特权,惟一的方法就是通过异常返回,这意味着:

  • 当异常发生时,处理器的EL可以不变,或者提高。
  • 当异常返回时,处理器的EL可以不变,或者降低。

异常的目标异常等级可以和当前的异常等级保持一致,目标异常等级可以根据异常类型或者系统寄存器的配置bit隐式地指定。
需要注意的是,对于AArch64的EL0,我们只能产生异常从EL0切换到更高等级的异常,绝对不能通过产生异常的方式进入EL0,因此,异常向量表里也没有关于EL0的向量。
在之前的文章中 ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态我们提到过,处理器要想切换执行状态,只有两种方法:

  1. reset
  2. 异常等级切换或者返回。

在AArch32和AArch64之间的交互被称为 interprocessing。关于执行状态的改变,有如下规则需要牢记:

  1. 当从一个低的EL切换到更高的EL时,处理器的执行状态可以保持不变,或者切换到AArch64。
  2. 当从一个高的EL切换到更低的EL时,处理器的执行状态可以保持不变,或者切换到AArch32。

这也说明了:

  1. 如果某个异常等级正在使用AArch32,则比它更低的异常等级必须使用AArch32模式。
  2. 如果某个异常等级正在使用AArch64,则比它更高的异常等级必须使用AArch64模式。

比如处理器在EL3中正在使用AArch32,则可以推断出此时处理器的EL0、EL1以及EL2也只能使用AArch32,而不能是AArch64。
在ARMv9-A架构和一些ARMv8-A架构中,AArch32状态只在EL0中被支持,并且不能通过产生异常的方式进入EL0。这说明,在这种情况下如果想改变EL0的执行状态,只能使用规则2,从一个更高的异常等级返回到EL0,支持处理器的执行状态可以保持不变(AArch64),或者切换到AArch32。

由于可以通过切换异常等级的方式从AArch32进入到AArch64,所有AArch64的异常处理函数可能需要访问AArch32的寄存器,AArch32的通用寄存器是直接映射到AArch64通用寄存器中的,这样AArch64的异常处理函数就可以直接访问AArch32的通用寄存了,映射关系如下:
ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions,ARM,arm,异常处理,exception,AArch64,ARMv8
当从AArch32切换到AArch64时,之前在AArch32状态下无法访问的那些寄存器将会保留它们之前在AArch64状态下的值。对于那些既可以在AArch32和AArch64下访问的寄存器:

  • 高32bit:未知,可能为0。
  • 低32bit:映射到AArch32寄存器的值。

关于AArch64寄存器的详细描述,可以参考文档: AArch64 Instruction Set Architecture guide.文章来源地址https://www.toymoban.com/news/detail-829662.html

到了这里,关于ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ARMV8-aarch64的虚拟内存(mmutlbcache)介绍-概念扫盲

    ARMV8-aarch64的虚拟内存(mmutlbcache)介绍-概念扫盲

    🔥 博客主页 : 小羊失眠啦. 🎥 系列专栏 : 《C语言》 《数据结构》 《C++》 《Linux》 《Cpolar》 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 思考: 1、cache的entry里都是有什么? 2、TLB的entry里都是有什么? 3、MMU操作的页表中的entry中都是有什么? L1和L3表中的entry中分别都是有什么

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

    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日
    浏览(18)
  • 交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

    交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

    1.交叉编译是什么,为什么要交叉编译 编译:在一个平台上生成在该平台上的可执行代码 交叉编译:在一个平台上生成在另一个平台上的可执行代码 交叉编译的例子:如51单片机的可执行代码(hex文件)是在集成环境keil上面编译完成的,我们只需要将编译好的可执行代码下

    2024年02月15日
    浏览(29)
  • Yocto系列讲解[技巧篇]92 - armv8 aarch64兼容armv7 32位程序运行环境

    Yocto系列讲解[技巧篇]92 - armv8 aarch64兼容armv7 32位程序运行环境

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力!

    2024年01月24日
    浏览(11)
  • 如何在armv6 armv7 armv8(aarch64)嵌入式板子上面安装nginx服务器,支持H265码流

    如何在armv6 armv7 armv8(aarch64)嵌入式板子上面安装nginx服务器,支持H265码流

    为什么要在板子瑞芯微rv1126核心板上面安装nginx服务器,是因为我的项目需要用到拉到连接在板子上面的摄像头,由于是摄像头是直连摄像头的只能通过板子上面的wifi热点设备,先连接这个热点才能获取到这个网络摄像头,那么就需要板子做一个推流的服务器让摄像头的画面

    2024年02月15日
    浏览(12)
  • 带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

    带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

    带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库,编译出的库适合香橙派,这时候交叉编译可执行程序的平台和链接库的格式也是正确的 ,然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置,但是现在还没有学习过,后面学了补上 此时如果把wiringPi库拿到Ubuntu上进

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

    【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日
    浏览(80)
  • 浅析ARMv8体系结构:异常处理机制

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

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

    2024年02月09日
    浏览(42)
  • Armv8-R AArch32 architecture概念学习

    Armv8-R AArch32 architecture概念学习

    该博客主要为个人学习,通过阅读官网手册整理而来(个人觉得阅读官网的英文文档非常有助于理解各个IP特性)。若有不对之处请参考 参考文档 ,以官网文档为准。 阅读该文章,可以先查看AArch64 Exception Model学习,再来看该文章会非常简单 该体系结构只有AArch32执行状态。

    2024年01月21日
    浏览(6)
  • ARMv8 - 安全机制 - 异常等级

    ARMv8 - 安全机制 - 异常等级

    ARMv8架构处理器有一套异常等级(Exception level)机制,分成4个等级(EL0 ~ EL3)。 处理器运行时会处于其中的某个等级并且可以进行等级切换。 每个异常等级都拥有一些自己版本的特殊寄存器,例如:system ctrl 寄存器(sctlr_el1,sctlr_el2 …),程序状态寄存器(SPSR_EL1,SPSR_EL

    2024年02月13日
    浏览(13)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包