【发布时间】:2015-05-15 19:39:42
【问题描述】:
在Linux中,中断处理程序的处理分为上半部分和下半部分。
据我了解,中断处理程序的下半部分可以通过多种方式处理:softirq、tasklet、工作队列和计时器列表。
我想知道 Linux 内核中的哪些函数处理这些下半部分的调度函数。
编辑:我查看了 softirq 和 tasklet 的处理,似乎它们都是通过 __do_softirq (http://lxr.linux.no/linux+v2.6.32.58/kernel/softirq.c#L207) 函数处理的。但是,我仍然看到处理程序执行内部的许多路径通过 Linux 内核的 schedule() 函数,然后显示出分歧。我无法正确解释这些路径。
一些指导您使用此功能的直觉:
待处理任务(下半部分)的调度应该由某个事件触发。内核事件可以是系统调用,也可以是中断。我认为触发下半部分的事件是中断而不是系统调用。
据我所知,这是中断到达时遵循的步骤:
1.中断到达核心
2. 运行中断处理程序的上半部分
3. 检查待处理队列,看看是否有需要注意的任务。
4. 如果有待处理的任务,则执行它
我正在浏览所有操作系统处理程序的函数列表,并观察到许多处理程序的执行通过 Linux 内核的 schedule() 函数。由于这个函数经常被许多中断处理程序调用,我想中断处理程序的下半部分应该只在这个函数中调用。
schedule() 函数最后调用 post_schedule() 函数。我跟踪了这两个函数调用之间的所有函数。它们之间有许多不同的函数列表,这让人怀疑下半部分函数必须位于从 schedule() 到 post_schedule() 的路径上。然而,内核中不同 MACROS 和函数的数量之多使得很难确定调度程序从哪里跳转到下半部分的函数。
【问题讨论】:
-
在这里查看我的答案的下半部分:stackoverflow.com/a/28780792/2709018
标签: linux linux-kernel linux-device-driver interrupt device-driver