目录
1.linux中断分层概念
中断会打断内核中进程的正常调度和运行,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。所以中断处理程序中所有不要求立即完成的,在开中断的环境下,由中断后半段完成。
中断前半段主要完成尽可能少的比较紧急的功能,例如简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。这样,顶半部执行的速度就会很快,可以服务更多的中断请求。上半部处理硬件相关和非常紧急的操作(如读硬件数据),而下半部处理没有那么紧急的操作(将硬件数据放到队列等)。低优先级中断的上半部可以抢占高优先级中断的下半部。
Linux 系统实现底半部的机制主要有:三种:tasklet,工作队列和软中断。
软中断不同于软件中断,软中断发生的时机是从中断、调用或者异常返回用户空间之前,按照软中断在结构数组中定义的顺序依次执行。同一个软中断可以在不同CPU上并发执行。软中断执行过程中也不允许睡眠和进程切换。
tasklet基于软中断实现,在软中断结构数组中占用两项。当软中断执行到这两项时就会跳转到tasklet函数入口处,依次执行队列中的tasklet函数。同一个tasklet不能在不同CPU上并发执行,但是不同tasklet可以在不同CPU上执行。tasklet始终运行在被初始提交的同一处理器上。
工作队列是一种将任务推后执行的形式,他把推后的任务交由一个内核线程去执行。这样如果在中断函数中使用中断分层(工作队列方式),中断函数的第二部分会在进程上下文执行,它允许重新调度甚至睡眠。每个被推后的任务叫做“工作”,由这些工作组成的队列称为工作队列。工作队列的本质就是将工作交给内核线程处理,因此其可以用内核线程替换。但是内核线程的创建和销毁对编程者的要求较高,而工作队列实现了内核线程的封装,不易出错,所以推荐使用工作队列。
2.linux系统的驱动-设备-总线模型
从Linux2.6开始Linux加入了一套驱动管理和注册机制—platform平台总线驱动模型。
platform平台总线是一条虚拟总线,platform_device为相应的设备,platform_driver为相应的驱动。与传统的bus/device/driver机制相比,platform由内核统一进行管理,提高了代码的可移植性和安全性。所谓的platform_device并不是与字符设备、块设备和网络设备并列的概念,而是Linux系统提供的一种附加手段。Linux总线设备驱动模型的框架如下图所示: