ARM架构(四)——异常中断和中断控制器(GIC)③

1 Arm的异常向量表

1.1 一些术语

  1. 异常等级(Exception Levels):ARMv9保留了ARMv8中的四个异常等级(EL0至EL3),每个等级提供不同级别的特权和对系统资源的访问权限。其中,EL0通常是用户模式,EL1是操作系统内核模式,EL2用于虚拟化技术中的宿主机操作系统,而EL3是最高等级,通常用于安全相关的功能 。
  2. 执行状态(Execution States):ARMv9支持两种执行状态,AArch64和AArch32。处理器可以在异常等级之间切换时改变执行状态,但只能从AArch32切换到AArch64,反之则不行。这意味着64位层可以承载32位层,但32位层不能承载64位层 。
  3. 安全状态(Security States):ARMv9支持两种安全状态,安全状态(Secure State)和非安全状态(Non-secure State)。在安全状态下,处理器可以执行受信任的代码,并访问所有物理地址空间,包括安全和非安全的。而非安全状态下的处理器只能访问非安全物理地址空间和资源 。
  4. 异常处理:当异常发生时,处理器会保存当前状态,包括程序计数器(PC)和程序状态寄存器(PSTATE),然后跳转到对应的异常处理程序。异常处理程序在处理完毕后,会通过特定的指令(如ERET)返回到异常发生前的状态 。
  5. 异常向量表:ARMv9使用异常向量表来确定异常处理程序的入口地址。每个异常等级都有自己的向量表,包含要执行的指令。当异常发生时,处理器会从这个表中获取跳转地址 。
  6. 异常类型:ARMv9体系结构中的异常可以分为同步异常和异步异常。同步异常是由当前执行的指令引起的,而异步异常则是由外部事件触发的 。
  7. 特权:ARMv9体系结构中的特权级别决定了软件能够访问哪些处理器资源。特权与异常等级紧密相关,高异常等级具有更高的特权 。
  8. 异常等级切换:在ARMv9中,异常等级的切换只能在发生异常或从异常返回时进行。当发生异常时,异常等级可以增加或保持不变;而从异常返回时,异常等级可以降低或保持不变 。

1.2 AArch64向量表

当使用AArch64将异常带到exception级别时,向量表是正常内存的一个区域,其中包含随后用于处理异常的指令。当发生异常时,核心需要能够执行与该异常对应的处理程序。处理程序充当分派代码,识别异常的原因,然后调用相关处理程序代码来处理异常。在内存中存储处理程序的位置称为异常向量。在AArch64中,异常向量存储在异常向量表中。
每个Exception级别都有自己的vector表,其基地址由自己的vector基地址寄存器VBAR_EL定义,其中为1、2或3。请注意,EL0没有专用的向量表,因为永远不会将异常带到EL0。
所有向量表都使用相同的格式。根据异常的类型和异常的来源,有不同的异常类别条目。每个异常类别都有一个异常向量,位于距向量基址的固定偏移量处
所使用的表项取决于以下因素:
异常的类型(SError, FIQ, IRQ, Synchronous)
•异常的产生和到达的异常级别
•需要支持的执行状态
•正在使用的堆栈指针

1.2 异常向量表切换规则:

(1)如果发生异常后并没有exception level切换,并且发生异常之前使用的栈指针是SP_EL0,那么使用第一组异常向量表。
(2)如果发生异常后并没有exception level切换,并且发生异常之前使用的栈指针是SP_EL1/2/3,那么使用第二组异常向量表。
(3)如果发生异常导致了exception level切换,并且发生异常之前的exception level运行在AARCH64模式,那么使用第三组异常向量表。
(4)如果发生异常导致了exception level切换,并且发生异常之前A的exception level运行在AARCH32模式,那么使用第四组异常向量表
在这里插入图片描述

想要实现ARM的这套异常机制,就需要实现两件事情:
5. 需要开辟一块内存。这个内存按照这个ARM的异常向量表的格式,这个顺序和对齐方式实现这个异常向量表。
6. 把这个异常向量表放到对应的VBLR_ELx寄存器基地址地址中。
(1)这个地址写的是虚拟还是物理?(2) 这个表填了这么多东西,这个表的物理内存是连续还是不连续,

2、linux kernel的中断处理

2.1Linux Kernel中的异常向量表的实现

在这里插入图片描述
打开Linux源码查看linux中的异常向量表如何实现(在线查看linux源码在线查看Linux源码):
1.进入目录arch/arm64/kernel,打开hand.S文件,搜索【快捷键:ctrl+f 】:vectors,定位到下图所示位置:
在这里插入图片描述
2.进入arch/arm64/kernel目录,打开entry.S文件,搜索:vectors,定位到下图所示位置:
在这里插入图片描述

2.2 Linux kernel对中断的处理

在这里插入图片描述
中断产生之后,就会去查看中断向量表,然后调用对应的GIC中断函数,到了中断函数中,就会读寄存器,然后进行处理,首先读到你的硬件中断号之后,在调用到中间层,中间层去通过硬件终端号知道啊你的软件中断号,然后根据软件中断号找到你的中断处理程序hander函数,
在这里插入图片描述

2.3 Linux Kernel中断相关的API

在这里插入图片描述
linux中的中断API(部分):
request_irq()
request_threaded_irq()
free_irq()
disable_irq()
enable_irq()
irq_set_irq_type()
irq_set irq_wake()
irq_set_handler_data()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值