在Linux中,中断处理程序的处理分为两个部分:上半部分和下半部分。
根据我的理解,中断处理程序的下半部分可以通过多种方式处理:softirq,tasklet,work-queue和timer-list。
我想知道Linux内核中的哪些函数处理这些下半部分的调度功能。
编辑:我调查了softirq和tasklet的内容,似乎这两个都是通过 __ do_softirq 处理的( http://lxr.linux.no/linux+v2.6.32.58/kernel/softirq.c#L207)功能。但是,我仍然看到处理程序执行中的许多路径通过Linux内核的 schedule() 函数,然后显示出分歧。我无法正确解释这些路径。
引导你走向这个功能的一些直觉:
待处理任务的调度(下半部分)应该由某个事件触发。内核事件可以是系统调用,也可以是中断。我认为触发下半部分的事件是中断而不是系统调用。
据我所知,这是中断到达后的步骤:
1.中断到达核心
2.上半部分中断处理程序运行
3.检查待处理队列以查看是否存在需要注意的任务。
4.如果有任何待处理任务,则执行它
我正在浏览所有OS处理程序的函数列表,并观察到许多处理程序的执行都通过Linux内核的 schedule() 函数传递。由于这个函数经常被许多中断处理程序调用,我想应该只从这个函数中调用下半部分的中断处理程序。
schedule()函数最后调用post_schedule()函数。我跟踪了这两个函数调用之间的所有函数。它们之间有许多不同的函数列表,使人怀疑下半部函数必须位于从schedule()到post_schedule()的路径上。但是,内核中不同MACROS和函数的绝对数量使得很难精确定位函数 跳转 到下半部分。
答案 0 :(得分:1)
设备驱动程序的中断处理程序的上半部分必须返回IRQ_HANDLED,IRQ_WAKE_THREAD或IRQ_NONE,以向中断子系统指示irq是否被处理。如果返回IRQ_WAKE_THREAD,则计划执行中断处理程序的线程下半部分。通常,下半部分优先于其他正常内核任务。有关详细信息,请参阅https://lwn.net/Articles/302043/