我在linux上为ipsec工作模块。当我的模块中的代码将被执行时,请查看两种不同的情况。
从进程上下文执行:应用程序生成一些流量通过网络传输,应用程序应该调用一些系统调用来传输数据,然后处理切换到内核空间和数据包通过linux的网络子系统,有些会在这里执行我的模块,并且所有在完成网卡任务后完成。从进程上下文和任何时刻调度程序执行的所有这些步骤都可以将进程从一个切换到另一个。以下是使用我的模块的第一种情况 - 来自流程上下文。
从softirq上下文执行:当网卡接收数据包时,它会产生硬件中断,其中"准备"适当的softirq运行。并且数据包通过linux的网络子系统(包括我的模块)直到某些应用程序得到它。这些步骤从softirq上下文执行,只能由硬件中断中断,但不能由调度程序工作中断。
问题是:我如何以编程方式确定模块中正在执行的上下文模块?它可以是struct task_struct的某个元素,也可以是某些系统调用或其他内容。我自己找不到它。
答案 0 :(得分:0)
将函数的控制流视为是否在中断上下文中执行,将其视为不良做法。
来自Linux内核开发人员(Andrew Morton)的我们在内核中使用的一致模式是调用者跟踪它们是否在可调度的上下文中运行,并且如果需要,它们将通知被调用者。被接受者不会为自己解决问题。
但是,linux/preempt.h
中定义了几个用于检测当前调度上下文的函数(宏):in_atomic()
,in_interrupt()
。但请参阅that LWN article了解其用法。