ksoftirqd 的下半部分位于中断或进程上下文中?

问题描述 投票:0回答:2

我一直在仔细阅读 Robert Love 写的《Linux Kernel Development》一书。

根据我的理解,软中断和微线程是在中断上下文中运行的。此外,ksoftirqd是一个在进程上下文中运行的内核线程。因此,我觉得非常令人困惑和难以思考如何使用 ksoftirqd(进程上下文)来运行软中断(中断上下文)。

linux-kernel interrupt-handling
2个回答
3
投票

我在阅读这本书时也有类似的问题,这里有一个链接可以澄清一些事情:参考这篇文章

“ksoftirqd 被实现为一组线程,每个线程都是 仅限于在特定 CPU 上运行。它们被安排在(在 非常高的优先级)由正常的任务调度程序执行。本次实施 优点是执行下半部分所花费的时间是 占系统任务。因此用户可以看到 机器因中断处理而过载,也许 采取补救措施。

尽管现在工作是在流程上下文中完成的,而不是在 下半部分上下文,ksoftirqd 设置了一个与以下内容相同的环境 在下半部分上下文中找到的。具体来说,它执行 启用本地中断和下半部分的软中断处理程序 本地禁用。作为下半部分运行的代码不需要 更改为 ksoftirqd 来运行它。”


0
投票

基于我对 kernel/softirq.c 的粗略阅读

run_ksoftirqd
,就像软中断的正常执行一样,调用
__do_softirq()

尽管如此,在本例中,

__do_softirq()
在任务上下文中运行,它被包装在
local_irq_disable/enable()
中。

因此,

__do_softirq()
的代码或调用将/不应该做出任何区别,无论它是由
ksoftirqd
调用、由硬件中断引发还是由调度程序运行。

© www.soinside.com 2019 - 2024. All rights reserved.