ARM64体系的异常与中断(1)

举报
云舒云卷 发表于 2020/05/18 11:31:37 2020/05/18
【摘要】 上一章中我们介绍了与 ARM 体系结构有关的一些基础知识,这一章我们将介绍 openEuler 中异常与中断的相关知识。首先我们从处理器的视角出发,介绍一下 ARM64 体系中的异常与中断。

一、ARM64 体系中的异常

在计算机术语中,异常通常指在程序运行过程中发生的异常事件[1]。ARM64 体系中的异常可以分为同步异常和异步异常。同步异常是由正在运行的指令或指令运行的结果造成的异常[3],而异步异常则不必由运行的指令造成从而可以在程序运行中的任意时刻发生。

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行[2]。在 ARM64 体系中中断包含外部中断请求(IRQ)和快速中断请求(FIQ)。外部中断请求是普通优先级的中断请求,快速中断请求是高优先级的中断请求。

外部中断请求和快速中断请求属于异步异常的范畴,除此之外异步异常还包含系统错误(SError)。系统错误是由硬件错误出发的异常,例如将脏数据从缓存行写回内存时异步触发的数据中止异常[3]。

软件中断是一类特殊的中断,它是一条 CPU 指令,用以陷入中断[4]。软件中断指令可以用于实现用户模式中对操作系统中特权模式的程序的调用,如 ARM 的 SWI 指令。软件中断常用于实现系统调用。

在异常发生时,CPU 将保存异常现场和下一条将执行的指令的地址。然后 CPU 跳转到异常处理程序的入口处并运行异常处理程序。异常处理程序运行完成之后,CPU 会恢复之前保存的异常现场,并跳转到异常发生时的下一条指令或异常发生的指令处继续执行。

ARM 体系的主要异常中断如下表所示[3,5]:

异常中断种类
含义
复位(reset) 在系统加电或系统复位时,系统产生复位异常中断,程序跳转到复位中断处理程序处执行。
未定义指令(Undefined Instruction) ARM 处理器或协处理器遇到未定义指令时产生未定义指令异常中断。未定义指令异常中断可以用于仿真浮点向量运算。
系统调用(System Call) 在ARM64 体系中,异常级别 EL0 使用 svc 指令陷入异常级别 EL1;异常级别 EL1 使用 hvc 指令陷入异常级别 EL2;异常级别 EL2 使用smc指令陷入异常级别 EL3。
指令预取中止(Prefetch Abort ) 当处理器预取指令时,若被预取指令的虚拟地址没有映射到物理地址或处理器没有访问被预取指令的地址的权限,则发生指令预取中止异常中断。
数据访问中止(Data Abort) 当数据访问指令访问的虚拟地址没有映射到物理地址或该指令对其访问的地址没有访问权限时,将会产生数据访问中止异常中断。
外部中断请求(IRQ) 当处理器的外部中断请求引脚有效,而且 CPSR 寄存器的I控制位被清除时( ARMv8-A 架构中 CPSR 寄存器被 PSTATE 替代,PSTATE 的I位为IRQ Mask Bit),处理器产生外部中断请求(IRQ)异常中断。
快速中断请求(FIQ) 当处理器的快速中断请求引脚有效,而且 CPSR 寄存器的F控制位被清除时( ARMv8-A 架构中 CPSR 寄存器被 PSTATE 替代,PSTATE 的F位为FIQ Mask Bit),处理器产生外部快速中断请求(FIQ)异常中断。

存储异常处理程序的内存位置称为异常向量,通常把所有异常向量放在一张表中,该表称为异常向量表。ARM64 处理器的异常级别 EL1、EL2 和 EL3 分别有自己的异常向量表,异常向量表的起始虚拟地址则放在向量基准地址寄存器 VBAR_ELn 中。ARM64 异常级别 n 的异常向量表如下表所示[3]:

偏移地址(以VBAR_ELn中地址为基址的偏移) 异常类型 说明
0x000 同步异常 当前异常级别生成的异常,使用异常级别0的栈指针寄存器SP_EL0。
0x080 外部中断请求
0x100 快速中断请求
0x180 系统错误
0x200 同步异常 当前异常级别生成的异常,使用当前异常级别的栈指针寄存器SP_ELn。
0x280 外部中断请求
0x300 快速中断请求
0x380 系统错误
0x400 同步异常 64位应用程序在异常级别(n-1)生成的异常。
0x480 外部中断请求
0x500 快速中断请求
0x580 系统错误
0x600 同步异常 32位应用程序在异常级别(n-1)生成的异常。
0x680 外部中断请求
0x700 快速中断请求
0x780 系统错误

二、结语

本期我们介绍了ARM64体系中的异常,下一期我们将介绍ARM64体系中的中断和ARM的通用中断控制器。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。