【问题标题】:Some question about kernel object关于内核对象的一些问题
【发布时间】:2011-11-17 15:35:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: kernel-module netfilter


    【解决方案1】:

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2011-04-09
      • 1970-01-01
      • 2018-05-24
      • 2013-07-07
      相关资源
      最近更新 更多