目标:

初步认识:干啥的,从图看出组成部分,说清楚最简单的流程

补充细节:整理成表格的知识(或许我会看手册把寄存器也贴出来)

凝练关键问题与重要知识(或许是总结,不一定能凝练出重点,或许有案例,看我死没死)

 

Linux系统下CPU需要解决的问题:

1.如何获取外设中断,私有中断,软件中断(可能我会讨论这些中断的必要性),以及中断之间如何处理

2.获得中断后,如何执行处理函数

中断使能与获取:

GIC获取外设的各种中断以及软件中断,分发给处理器,这里涉及到中断优先级,仲裁器(GIC_D),接口器(GIC_C),通过接口分给处理器。 

image

这里涉及到几个问题,外设中断使能知道是哪个中断清楚中断

 

GIC获取外设的各种中断以及软件中断,分发给处理器,这里涉及到中断优先级,仲裁器(GIC_D),接口器(GIC_C)

 

image

 

中断处理:

为了平衡中断的实时响应性(需要快速处理)和复杂性(可能需要较长时间处理、甚至访问可能睡眠的资源),Linux 将中断处理分成了两个部分:

中断处理的“上半部” 

硬件中断发生时,CPU 立即从当前模式(通常是用户模式或 SVC 模式)切换到 IRQ 模式,并执行注册在该中断号上的“上半部”函数,期间禁用中断。

 

中断处理的“下半部” 

通常在 SVC 模式 (内核态) 下执行。虽然仍在内核态,但它不再处于严格的中断上下文。在执行下半部时,中断通常是再次被允许的,并且下半部可以睡眠/阻塞,通常以tasklet。

Linux不用FIQ,只用到了IRQ,在IRQ模式记录中断,SVC模式处理。

image

 中断屏蔽:INTMSK

 INTPND: 最终发送给 ARM CPU 的中断信号,有且只有一个

INTMOD:配置中断源是 IRQ 还是 FIQ。

image

 如何获取到中断处理:

中断向量表:

计算公式:IDT基地址 + (中断向量号 × 每个描述符的大小)