关于内核对象的一些问题

时间:2011-09-15 07:42:16

标签: kernel-module netfilter

我正在编写Linux的内核对象(.ko文件,通常是设备驱动程序) 我必须使用一些机制来保护这个项目中的关键部分,但我对内核对象很困惑。

使用insmod将模块插入内核后,使用命令ps -A无法找到模块的进程。
这是否意味着IRQ将唤起模块进程,以便我必须使用互斥来同步它们?

另外
这有点不清楚,所以我想指出这个问题。这个内核对象用于包过滤,它基于netfilter 我的困惑是:每个数据包是否会启动我的模块进程,以便我必须使用互斥锁进行同步,或者当数据包到达本地网卡时会发生其他一些事情?

1 个答案:

答案 0 :(得分:1)

除非你在你的模块中启动kthread,否则ps -A中没有列出任何内容。内核对象不会启动任何进程,实际上插入和删除模块的函数都是在中断上下文中运行的(如果我没有使用它)。

无论如何,我假设你编写了一堆回调,用Netfilters注册它们,每次内核处理数据包时都会调用这些回调。这就是“启动流程的数据包”的含义。好吧,不,因为netfilter的注册回调也是从中断上下文运行的,因此这里没有进程概念。这意味着,根据您注册回调的挂钩点(本地输入,本地输出,转发...),每个数据包都可能触发中断。这就是为什么我个人认为你应该尝试在netfilter钩子中尽量少做代码。

最后,您不能在中断上下文中使用互斥锁或信号量,因为这将锁定整个内核。如果你真的需要在中断上下文中同步某些内容,你应该看一下名为spin locks http://www.mjmwired.net/kernel/Documentation/spinlocks.txt的东西。

希望这有帮助。

相关问题