【问题标题】:module context of execution模块执行上下文
【发布时间】:2017-05-10 11:35:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linux-kernel network-programming linux-device-driver


    【解决方案1】:

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

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

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


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

    【讨论】:

    • 这是我要求的,谢谢。并解释为什么我的驱动程序需要这样的功能:我为 CryptoApi 基于异步机制编写驱动程序。当驱动程序得到查询时,它使用工作队列机制创建一个工作并将特殊代码返回给被调用者,这意味着“正在进行数据处理”。当数据加密/解密完成时,被调用者当然会注册回调函数。上述工作将分配给硬件进行数据处理。在调用回调函数之前,我需要知道系统中是否还存在进程,以防查询来自进程。
    • 但是如果查询来自softirq,我将跳过存在检查或根本不产生工作(不要使用CryptoApi的异步机制)。
    猜你喜欢
    • 2013-12-27
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多