基于IMX6ULLmini的linux裸机开发系列七:中断处理流程

中断上下文

cpu通过内核寄存器来运行指令并进行数据的读写处理的,它在进入中断前一个时刻的具体值,称为中断上下文

中断上下文是指CPU在进入中断之前保存的寄存器状态和其他相关信息。当CPU接收到中断请求时,它会保存当前正在执行的指令的状态,并将寄存器的值切换到一个特定的上下文中,以便处理中断。(保护现场)

中断上下文包括了CPU寄存器的值、程序计数器(PC)的值、堆栈指针(SP)的值,以及其他与中断处理相关的状态信息。这些信息被保存在内存中的特定位置,通常称为中断向量表或中断描述符表。

当中断处理程序完成后,CPU会从中断上下文中恢复之前的寄存器状态,继续执行被中断的程序或任务。这种上下文切换的过程称为中断处理过程

具体流程

  • 初始化 IRQ 模式栈指针:在进入中断之前,需要为 IRQ 模式分配一个栈空间,并将栈指针初始化到该空间。

  • 进入 IRQ 模式:CPU 切换到 IRQ 模式,以便执行中断处理程序。

  • CPSR 寄存器:保存当前运行状态的 CPSR 寄存器的值,以便在中断处理完成后恢复。

  • 保存现场:将当前正在执行的指令的上下文保存到栈中。这包括保存通用寄存器、保存 LR(链接寄存器,保存返回地址)、保存 SPSR(保存当前程序状态寄存器)等。

  • 获取中断编号:读取中断控制器(GIC)相关寄存器中的值,以获取触发中断的编号。

  • 读取 GIC 基地址和 GICC 基地址:从系统配置中获取 GIC(中断控制器)的基地址和 GICC(GIC CPU Interface)的基地址。

  • GICC_IAR 寄存器:读取 GICC_IAR 寄存器,该寄存器保存着最高优先级中断的编号。

  • 执行中断处理函数:根据中断编号,在 IRQ 中断服务表中找到对应的中断处理函数,并执行该函数。

  • 还原现场:从栈中恢复之前保存的现场信息,包括恢复通用寄存器、恢复 LR、恢复 SPSR 等。

  • 返回原程序:根据之前保存的返回地址,从中断处理程序返回到原来被中断的程序继续执行。

cpsr寄存器

  • bit31:负数标记位

  • bit30:零标志位

  • ...

  • M[4:0]:运行模式控制位

    • 10000:User 模式

    • 10001:FIQ 模式

    • 10010:IRQ 模式

    • 10011:SVC模式

    • 10111:Abort模式

    • 11011:Undef模式

    • 11111:System模式

    • 10110:Monitor模式

    • 11010:Hyp模式

mrs ,cpsr //读cpsr
msr cpsr, //写cpsr
cps #xx //写立即数到cpsr中的M[4:0]

基于IMX6ULLmini的linux裸机开发系列七:中断处理流程_第1张图片

GICC基地址

4.1.3 CPU interface register ma (GIC官方手册)

三级流水线

  • 取指令(pc)

  • 译指令

  • 执行指令

  • 基于IMX6ULLmini的linux裸机开发系列七:中断处理流程_第2张图片

lr = pc = 当前执行指令+8
当前执行指令的下一条:lr-4

基于IMX6ULLmini的linux裸机开发系列七:中断处理流程_第3张图片

基于IMX6ULLmini的linux裸机开发系列七:中断处理流程_第4张图片

arm:PC=当前执行指令地址+8_armpc+8_aoXiaMi的博客-CSDN博客

这里还看不太懂,先继续学算了

你可能感兴趣的:(linux,运维,服务器)