我一直在仔细阅读 Robert Love 写的《Linux Kernel Development》一书。
根据我的理解,软中断和微线程是在中断上下文中运行的。此外,ksoftirqd是一个在进程上下文中运行的内核线程。因此,我觉得非常令人困惑和难以思考如何使用 ksoftirqd(进程上下文)来运行软中断(中断上下文)。
我在阅读这本书时也有类似的问题,这里有一个链接可以澄清一些事情:参考这篇文章
“ksoftirqd 被实现为一组线程,每个线程都是 仅限于在特定 CPU 上运行。它们被安排在(在 非常高的优先级)由正常的任务调度程序执行。本次实施 优点是执行下半部分所花费的时间是 占系统任务。因此用户可以看到 机器因中断处理而过载,也许 采取补救措施。
尽管现在工作是在流程上下文中完成的,而不是在 下半部分上下文,ksoftirqd 设置了一个与以下内容相同的环境 在下半部分上下文中找到的。具体来说,它执行 启用本地中断和下半部分的软中断处理程序 本地禁用。作为下半部分运行的代码不需要 更改为 ksoftirqd 来运行它。”
基于我对 kernel/softirq.c 的粗略阅读
run_ksoftirqd
,就像软中断的正常执行一样,调用__do_softirq()
。
尽管如此,在本例中,
__do_softirq()
在任务上下文中运行,它被包装在 local_irq_disable/enable()
中。
因此,
__do_softirq()
的代码或调用将/不应该做出任何区别,无论它是由ksoftirqd
调用、由硬件中断引发还是由调度程序运行。