2011-09-15 59 views
1

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

在使用insmod将我的模块插入内核后,我找不到使用命令ps -A的模块进程。
这是否意味着该IRQ将唤起模块处理,使我不得不使用互斥同步它们?

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

回答

1

除非你的模块会出现什么,据我知道ps -A列在开始KTHREAD。内核对象不会启动任何进程,事实上,插入和删除模块的函数都在中断上下文中运行(如果我不是自定义的话)。

无论如何,我假设你已经设定了一堆回调,与Netfilters和每一个数据包是由内核这些回调将被称为处理时间注册它们。这就是你的意思是“一个包开始一个过程”。嗯,不,因为netfilter的注册回调也是从中断上下文运行的,因此这里没有过程概念。这意味着,根据您注册回调的哪个钩点(本地in,本地out,前向...),每个数据包都可能触发中断。这就是为什么我个人认为你应该尽量让你的代码在netfilter钩子中尽可能少。

最后,你不能使用互斥也不信号灯在中断上下文,因为这将锁定整个内核。如果你真的需要在中断环境中同步某些东西,你应该看看自旋锁http://www.mjmwired.net/kernel/Documentation/spinlocks.txt

希望这会有所帮助。