在Linux中,中断处理程序的处理分为两个组件:上半部分和下半部分。
从我的理解中,可以通过多种方式处理中断处理程序的底部:softirq,tasklet,work-quesue和timer-list。
我想知道Linux内核中的哪个功能处理这些下半部的时间表功能。
编辑:我研究了Softirq和Tasklet的Halndling,似乎它们都通过 __ do_softirq (http://lxr.linux来处理。no/linux v2.6.32.58/kernel/softirq.c#l207)功能。但是,我仍然看到处理程序执行中的许多路径,这些路径通过Linux内核的 schedule()函数,然后显示差异。我无法正确解释这些道路。
一些指导您达到此功能的直觉:
某些事件应触发待处理任务的安排(下半部)。内核事件可以是系统调用,也可以是中断。我认为触发下半部分的事件是中断而不是系统调用。
这是中断到达时遵循的步骤:
1.中断到达核心
2.中断处理程序的上半部分运行
3.检查未决的队列以查看是否有需要注意的任务。
4.如果有任何待处理任务,请执行
我正在浏览所有OS处理程序的功能列表,并观察到许多处理程序通过Linux内核的 scheparion()函数的执行。由于此功能经常从许多中断处理程序中调用,因此我想中断处理程序的下半部分仅应在此功能中调用。
schedule()函数在末尾调用postrongchedule()函数。我跟踪了这两个函数调用之间的所有功能。它们之间有许多不同的功能列表,这引起了人们的怀疑,即下半部分必须位于从附表()到postrongchedule()的路径上。但是,内核中的大量不同宏和功能数量确实使很难查明调度程序跳到下半部分的功能。
> 。设备驱动程序的中断处理程序的上半部分必须返回irq_handled,irq_wake_thread或irq_none,以指示IRQ是否处理或不处理IRQ的中断子系系统。如果返回IRQ_WAKE_THREAD,则计划执行中断处理程序的螺纹底部半部分。通常,底部半半优先于其他正常内核任务。有关更多详细信息,请参见https://lwn.net/articles/302043/