《linux内核设计与实现》阅读笔记 第五章 中断和中断处理程序

时间:2022-09-13 16:55:24

一个设备可以引发多个中断对应多个中断处理程序。
中断处理应该尽快完成,但实际情况并不是这么理想,所以分为上半部和下半部
上半部只做有严格时限的工作,其他放到下半部做。

注册中断处理程序request_irq, 该函数会睡眠 P55
释放中断线free_irq
编写中断程序 P57

中断处理程序通常为static,中断处理程序中尽量将工作推个下半部,中断处理程序无须可重入,因为当一个中断处理程序在
处理时相应的中断总线在所有处理器上就会被屏蔽,但其他的中断总线是可以处理的。

中断线可以共享,一个中断线上可以有多个处理程序,但中断产生时系统回依次调用该总线上的中断处理程序,因此处理程序必须区

分到底是不是自己对应的设备产生了中断,如果不是则应马上退出。P58

中断上下文:
因为没有进程的背景(无法调度),所以不能使用current宏,也不能睡眠,不能调用会导致睡眠的函数,中断处理函数必须简洁,

迅速,尽量将工作移到下半部来处理,中断处理程序没有独立的栈,使用被中断进程的栈或是idle进程的栈

中断从硬件到内核的过程P61
通过do_IRQ函数计算出中断号,使用mask_and_ack_8259A禁止这条线上的中断传递,然后调用中断处理程序P61

中断信息:/proc/interrupts(不显示没有安装中断处理程序的中断信息)

第一列:中断线
第二列:接受中断数目的记数器,每个CPU对应一列
第三列:描述

代码具体在fs/proc中
中断控制:P63

激活当前处理器的中断:local_irq_disable()相当于X86的cli
禁止当前处理器的中断:locak_irq_enable()相当于X86的sti

unsigned long flags;
local_irq_save(flags);保存当前的中断状态
local_irq_restore(flags);恢复原来的中断状态

控制某个中断线的函数:

void disable_irq(unsigned int irq);禁止该中断线向系统上所有处理器传递中断,该函数在当前中断线对应的所有处理程序退出
后才返回
void disable_irq_nosync(unsigned int irq);禁止该中断向系统上所有处理器的传递,直接返回
void enable_irq(unsigned int irq);打开中断线
void synchronize_irq(unsigned int irq);等待一个特定的中断处理程序的退出
如果disable_irq调用了两次 则enable_irq也要调用两次才能真正将中断线打开。
在新的系统中存在共享中断线的情况,因此以上接口尽量不要使用。

获取中断系统的状态:P65