Linux设备驱动程序 之 中断

中断

中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据;硬件设备生成中断并不考虑与处理器的始终同步,中断可能随时产生,内核随时都有可能被中断打断;

不同设备的中断不同,而每个中断都对应一个唯一的中断值,这些中断值通常称为中断请求IRQ线;中断号并不一定是严格定义的,也可能是动态分配的,如PCI设备;

异常

异常与中断不同,它的产生必须考虑与处理器时钟同步;实际上,异常也常常被称为同步中断;在处理器执行到又编程失误而导致的错误指令的时候,就会产生一个异常;许多处理器体系结构处理异常与中断的方式类型;因此,内核对它们的处理也很类似;

中断处理程序

在响应一个特定中断的时候,内核会执行一个函数,这个函数叫中断处理程序或者中断服务例程;产生中断的每个设备都有一个相应的中断处理程序;中断处理器程序与其他内核函数的区别在于,中断处理程序是被内核调用来响应中断的,它们要运行于中断上下文中,通常,中断上下文也成为原子上下文,该上下文执行的代码不可阻塞;

中断可能随时发生,因此中断处理程序也就随时可能执行;所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快的恢复中断代码执行,对于硬件和操作系统来讲,缩短响应和处理时间都极为重要;

上半部和下半部

中断处理被分为两个部分,中断处理程序是上半部–接收到一个中断,就立即开始执行,但只做严格时限的工作,例如对接收的中断进行应答或者复位硬件,这些工作都是所有中断被禁止的情况下完成的;能够允许被稍后完成的工作会退出到下半部;此后合适的时机,下半部会被开中断执行;

以网卡为例,当网卡接收来自网络的数据包时,需要通知内核数据包到了;因此,网卡立即发出中断,内核通过执行我那个口已注册的中断处理程序来做出应答;中断开始执行,通知硬件,拷贝最新的网络数据包到内存,然后读取网卡更多的数据包,这些都是重要,紧迫而又与硬件相关的工作,如果这些工作执行时间过长,就会导致网卡缓存溢出,从而产生丢包;当网络数据包被拷贝到系统内存后,中断任务执行完成,这时将控制权交给原本运行的程序;处理数据包的其他工作在随后的下半部中进行;

中断上下文

当执行一个中断处理程序时,内核处于中断上下文;

在进程上下文中,可以通过current宏关联当前进程;此外,因为进程是以进程上下文的形式连接到内核的,因此,进程上下文中可以睡眠,也可以调度程序;

中断上下文与进程并没有什么关系,与current宏也是不相干的;因为没有后备进程,所以中断上下文不可以睡眠,一些睡眠函数都不能在中断上下文中使用;

中断上下文具有严格的时间显示,因为它打断了代码;正因为这种异步的恩正,所以所有的中断处理程序必须尽可能快速、简洁;尽量把工作从中断处理程序中分离出来,放在下半部执行,因为下半部可以再更合适的时间运行;

原文地址:https://www.cnblogs.com/wanpengcoder/p/11761728.html