ARMv8系列 异常处理/中断处理

1.1ARMv8异常等级

EL0:非特权模式,例如应用程序

EL1:特权模式,例如OS内核

EL2:虚拟化监控程序,例如hypervisor

EL3∶安全模式,例如secure monitor

1.2 同步/异步 异常

同步exc:CPU执行某条指令而直接导致的异常,往往需要在异常handle函数里处理该异常之后,CPU才能继续执行(比如系统调用,MMU引发的缺页异常,SP和PC对齐检查,未分配的指令)

异步exc:与当前CPU正在执行指令无关的异常,中断(物理中断,虚拟中断)就是异步异常的一种

1.3异常入口

当异常发生时刻,CPU硬件做了哪些事情?

PSTATE保存到SPSR_ELx。

返回地址保存ELR_ELx。

PSTATE寄存器里的DAIF域都设置为1,相当于把调试异常、系统错误(SError)、 IRQ中断以及FIQ中断都关闭了。

更新了ESR_ELx寄存器,里面包含了同步异常发生的原因

SP执行SP_ELx。

切换到对应的EL,然后跳转到异常向量表里执行。

当异常发生后,操作系统需要做哪些事情? 

异常向量表的每个表项会保存一个舁常处理的跳转函数,然后跳转到恰当的异常处理函数并处理异常。

1.4异常返回

当异常处理完成后,执行eret语句,这条指令会完成如下工作

从ELR_ELx寄存器中恢复Pc指针。

从SPSR_ELx寄存器恢复处理器的状态。

1.5 异常返回地址

返回地址两个寄存器:

1.5.2 X30

子函数的返回地址。使用ret指令来返回。

1.5.1 ELR_Elx:

1.异常返回地址。使用eret指令来返回

2.对于不是system call的同步异常,返回的是触发同步异常的那一条指令

3.对于system call,它是返回svc指令的下一条指令。

1.6 栈的选择

每个EL对应有其SP:SP_ELX(X:0 1 2 3)

栈必须16字节对齐,异常发生,并跳转到目标异常等级时,硬件会自动选择SP_ELX

1.7异常向量表

定义:当异常发生时,处理器必须跳转和执行异常相关的处理指令。异常相关的处理指令通常存储在内存中,这个存储位置称为异常向量。

每个EL都有自己的异常向量表,EL0除外,异常向量表的基地址需要设置到VBAR_ELx寄存器中,触发异常会跳转到基地址+偏移量的异常向量里

1.8 保存异常上下文

栈框: Linux内核中定义了一个struct pt_regs的数据结构来描述内核栈上保存寄存器的排列信息,通常用于保存中断上下文等信息。

1.9 EL2切到EL1

  1. 保存EL2的状态:在切换到EL1之前,Hypervisor需要保存当前的CPU状态,包括寄存器、程序计数器(PC)等,以便在将来返回到EL2时能够恢复。
  2. 配置EL1的寄存器:Hypervisor需要设置EL1的寄存器,包括栈指针(SP)、异常向量表基地址(VBAR_EL1)等,以确保操作系统内核能够正确运行。
  3. 设置SPSR_EL2:Hypervisor需要设置Saved Program Status Register (SPSR_EL2),以指定切换到EL1后的处理器状态。通常,SPSR_EL2会包含以下信息:目标异常级别(EL1)处理器状态(如ARM或Thumb模式)中断屏蔽位(如DAIF位)
  4. 设置ELR_EL2:Hypervisor需要设置Exception Link Register (ELR_EL2),以指定切换到EL1后要执行的指令地址。这通常是操作系统内核的入口点。
  5. 执行ERET指令:最后,Hypervisor执行ERET(Exception Return)指令。ERET指令会根据ELR_EL2和SPSR_EL2的内容,将处理器从EL2切换到EL1,并跳转到ELR_EL2指定的地址继续执行。

2.中断处理

2.1 概念

ARM核心两个和中断相关的管脚: nlRQ和nFlQ,每个CPU核心有一对这样的中断相关的管脚

PSTATE状态中有两个比特位和中断相关:

l:用来屏蔽IRQ中断

F:用来屏蔽FIQ中断

GIC控制器

2.2 中断处理过程

2.3 中断现场(中断上下文)

保存

恢复

#没有实习经历,还有机会进大厂吗##我的实习日记##嵌入式Linux##牛客创作赏金赛#
全部评论

相关推荐

评论
2
4
分享

创作者周榜

更多
牛客网
牛客企业服务