1. 中断
中断就是一些外设硬件发送通知给处理器的通道。外设可以不在cpu的干预下执行一些动作,在完成这些任务后通过中断通知CPU。每个中断都有一个系统唯一的中断号。
1.1 中断上半部和下半部
为了解决中断处理函数运行得快且完成尽量多的工作量的矛盾,我们一般把中断处理切为两部分。
- 上半部:会在接受到一个中断后立刻开始执行,但是只是做一些有严格时限的工作,例如中断应答和复位硬件,这些工作都是在所有中断被禁止的情况下完成的。
- 下半部:可以推迟的工作。比如网卡中断会在上半部分把网络数据拷贝到内存中,提高数据吞吐量。而网路数据协议的解析就可以放到下半部分区执行。
1.2 中断处理函数
中断处理函数利用request_irp()。
request_irp()函数可能会随眠,不能在中断上下文或者不允许阻塞的代码中调用改函数。
上半部的中断处理程序无须重入的,因为在执行的时候当前的所有中断线都是被禁止的。
- 共享中断处理程序
一个中断号可以注册多个中断处理函数来实现所有的设备共享这个中断。共享中断的处理函数会形成一个表,在中断来的时候都会执行这些链表中的函数,而这些中断处理函数需要能够区分这些设备是否真正产生了中断。
1.3 中断上下文
进程在进入内核时即进程上下文可以睡眠也可以调用调度程序。因为没有后备进程,中断上下文不可以睡眠。
1.4 中断控制和处理机制的实现
- /proc/interrupts:查看所注册的中断以及中断设备,控制器,中断次数等信息,可以通过cat这个文件查看内核中断的信息
2. 下半部和推后执行的工作
下半部的任务就是执行与终端处理密切相关但中断处理程序本身不执行的工作。
中断处理函数完成与硬件相关等的和时间密切相关的动作。而需要比较多的时间来处理的工作,比如网络数据的协议解析就留给下半部来执行。
上半部与下半部任务分配的经验:
如果一个任务对时间非常敏感,那就应该放到中断处理函数中执行
如果一个任务和硬件相关,那就应该放在中断处理函数中执行
如果一个任务要保证不被其他中断&#