Linux kernel 执行的模块上下文

Linux kernel 执行的模块上下文,linux-kernel,network-programming,linux-device-driver,Linux Kernel,Network Programming,Linux Device Driver,我在linux中开发ipsec模块。请看两种不同的情况,当我的模块中的代码将被执行时 从进程上下文执行:应用程序生成一些流量通过网络传输,应用程序应该调用一些系统调用来传输数据,然后进程切换到内核空间,数据包通过linux的网络子系统,这里的一些人将执行我的模块,并在向网卡提供任务后全部完成。从流程上下文执行的所有这些步骤,在任何时刻,调度器都可以将流程从一个切换到另一个。下面是使用我的模块的第一个案例-来自流程上下文 从softirq上下文执行:当网卡接收到数据包时,它生成硬件中断,“准备”适

我在linux中开发ipsec模块。请看两种不同的情况,当我的模块中的代码将被执行时

从进程上下文执行:应用程序生成一些流量通过网络传输,应用程序应该调用一些系统调用来传输数据,然后进程切换到内核空间,数据包通过linux的网络子系统,这里的一些人将执行我的模块,并在向网卡提供任务后全部完成。从流程上下文执行的所有这些步骤,在任何时刻,调度器都可以将流程从一个切换到另一个。下面是使用我的模块的第一个案例-来自流程上下文

从softirq上下文执行:当网卡接收到数据包时,它生成硬件中断,“准备”适当的softirq运行。数据包经过linux的网络子系统(包括我的模块),直到某个应用程序得到它。这些步骤是从softirq上下文执行的,只能通过硬件中断中断,不能通过调度程序工作中断


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

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

来自Linux内核开发人员(Andrew Morton):

我们在内核中使用的一致模式是,调用方跟踪它们是否在可调度上下文中运行,如果需要,它们将通知被调用方。被叫人不会自己解决问题



但是,在
linux/preempt.h
中定义了几个函数(宏),用于检测当前调度上下文:
在_-atomic()
在_-interrupt()中。但是看看它们的用法。

这正是我想要的,谢谢。解释为什么我的驱动程序中需要这样的功能:我基于同步机制为CryptoApi编写驱动程序。当驱动程序得到查询时,它使用工作队列机制创建一个工作,并向被调用方返回特殊代码,表示“正在进行数据处理”。当然,被调用者在数据加密/解密完成时注册要转到的回调函数。上述工作为数据处理的硬件分配了任务。在调用回调函数之前,我需要知道系统中是否还存在进程,以防查询来自进程。但如果查询来自softirq,我将跳过存在性检查或根本不生成工作(不要使用CryptoApi的异步机制)。