首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模块执行上下文

模块执行上下文
EN

Stack Overflow用户
提问于 2017-05-10 11:35:10
回答 1查看 550关注 0票数 0

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

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

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

问题是:如何在模块中以编程方式确定要从哪个上下文模块执行?它可以是struct task_struct的一些元素,也可以是syscall或其他什么东西。我一个人找不到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-10 12:12:52

它被认为是一个坏实践,它使一个函数的控制流取决于它是否在中断环境中执行。

来自Linux内核开发人员(Andrew )的引文

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43891329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档