模块执行上下文

module context of execution

我在 linux 从事 ipsec 模块的工作。看看我的模块中的代码将被执行的两种不同情况。

从进程上下文执行:应用程序生成一些流量通过网络传输,应用程序应调用一些系统调用来传输数据,然后进程切换到内核 space 并且数据包通过 linux 的网络子系统,这里有些地方会执行我的模块,把任务交给网卡后就全部结束了。所有这些步骤都是从进程上下文执行的,并且在任何时候调度程序都可以将进程从一个进程切换到另一个进程。以下是使用我的模块的第一个案例 - 来自进程上下文。

从softirq上下文执行:当网卡收到数据包时产生硬件中断,"prepare"将softirq分配给运行。数据包通过 linux 的网络子系统(包括我的模块)直到某个应用程序得到它。这些步骤从 softirq 上下文执行,只能被硬件中断中断,而不能被调度程序工作中断。

问题是:如何在模块中以编程方式确定从哪个上下文模块执行?它可以是 struct task_struct 的某个元素或某个系统调用或其他东西。我自己找不到。

使函数的控制流依赖于它是否在中断上下文中执行被认为是不好的做法

Citation 来自 Linux 内核开发者 (Andrew Morton):

The consistent pattern we use in the kernel is that callers keep track of whether they are running in a schedulable context and, if necessary, they will inform callees about that. Callees don't work it out for themselves.


但是,linux/preempt.h 中定义了几个函数(宏)用于检测当前调度上下文:in_atomic()in_interrupt()。但请参阅that LWN article了解它们的用法。