中断上下文
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 <Rt>,cpsr //读cpsr msr cpsr,<Rt> //写cpsr cps #xx //写立即数到cpsr中的M[4:0]
GICC基地址
4.1.3 CPU interface register ma (GIC官方手册)
三级流水线
-
取指令(pc)
-
译指令
-
执行指令
lr = pc = 当前执行指令+8 当前执行指令的下一条:lr-4
arm:PC=当前执行指令地址+8_armpc+8_aoXiaMi的博客-CSDN博客文章来源:https://www.toymoban.com/news/detail-660104.html
这里还看不太懂,先继续学算了文章来源地址https://www.toymoban.com/news/detail-660104.html
到了这里,关于基于IMX6ULLmini的linux裸机开发系列七:中断处理流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!