我正在编写Linux的内核对象(.ko文件,通常是设备驱动程序) 我必须使用一些机制来保护这个项目中的关键部分,但我对内核对象很困惑。
使用insmod
将模块插入内核后,使用命令ps -A
无法找到模块的进程。
这是否意味着IRQ将唤起模块进程,以便我必须使用互斥来同步它们?
另外
这有点不清楚,所以我想指出这个问题。这个内核对象用于包过滤,它基于netfilter
我的困惑是:每个数据包是否会启动我的模块进程,以便我必须使用互斥锁进行同步,或者当数据包到达本地网卡时会发生其他一些事情?
答案 0 :(得分:1)
除非你在你的模块中启动kthread,否则ps -A
中没有列出任何内容。内核对象不会启动任何进程,实际上插入和删除模块的函数都是在中断上下文中运行的(如果我没有使用它)。
无论如何,我假设你编写了一堆回调,用Netfilters注册它们,每次内核处理数据包时都会调用这些回调。这就是“启动流程的数据包”的含义。好吧,不,因为netfilter的注册回调也是从中断上下文运行的,因此这里没有进程概念。这意味着,根据您注册回调的挂钩点(本地输入,本地输出,转发...),每个数据包都可能触发中断。这就是为什么我个人认为你应该尝试在netfilter钩子中尽量少做代码。
最后,您不能在中断上下文中使用互斥锁或信号量,因为这将锁定整个内核。如果你真的需要在中断上下文中同步某些内容,你应该看一下名为spin locks http://www.mjmwired.net/kernel/Documentation/spinlocks.txt的东西。
希望这有帮助。