【问题标题】:How can kernel module communicate with user-space process during rmmod?在 rmmod 期间内核模块如何与用户空间进程通信?
【发布时间】:2012-02-10 12:53:20
【问题描述】:

我有一个内核模块(实际上是一个伪设备驱动程序)和一个辅助用户空间进程。

我希望内核模块在rmmod过程中联系一个用户空间进程,触发用户空间进程做一些清理工作。我知道我可以从内核向用户进程发送一个信号来触发清理,但我确实需要发送一些其他信息来指导用户进程如何进行清理。 (如果重要的话,它是一个整数数组)。我假设我不能将任何信息与信号一起传递?

你们知道怎么做吗?我不能使用 ioctl,因为该设备对用户空间进程不可见,因为它正在被 rmmod'ed..

谢谢。

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    这样的设计不适合内核的工作方式。

    相反,您应该让模块将自身报告为正在使用,直到清理完成(因此导致rmmod 失败)。当你想卸载模块时,你应该触发用户空间清理,然后在完成时执行rmmod(可能使用某种用户空间脚本)。

    您可以通过让用户空间守护进程持有一个对内核模块提供的设备打开的文件描述符,并在用户空间清理发生后关闭它来实现这一点。

    【讨论】:

    • 为什么我想在 rmmod 期间这样做:我的模块是块设备驱动程序。所以只要我不执行 rmmod,它可能仍然需要 IO 请求。我真的需要在我进行清理时停止该设备上的那些 IO 活动。这就是为什么我想在 rmmod 运行...@caf
    • @yangsuli:所以您只需要用户空间进程首先请求设备静默(使发出的任何新 IO 失败,并阻塞直到任何未完成的 IO 完成);然后执行清理;然后请求 rmmod。
    • 好吧。我知道原则上我应该这样做......但我只是懒惰并希望内核在执行 rmmod 时为我这样做。这只是为了一些测试目的。在我的情况下,强制我的设备静默很难实现,因为我的驱动程序在内部维护了很多状态。我在这里寻找捷径...@caf
    • @yangsuli:啊——不,内核不会在 rmmod 上强制执行类似的操作。无论哪种方式,您都必须自己实现 - 在大多数情况下,如果用户空间进程仍然打开模块(因为它们的模块使用计数非零),模块将简单地拒绝卸载。如果你的模块允许自己在使用中被移除,它只会导致内核崩溃。
    • 这就是我的意思...如果我在执行 rmmod 时有出色的 IO,内核实际上会阻止我这样做...所以当我在 rmmod 函数中时,我可以放心没有人弄乱我的内部设备状态。但是,如果我只是简单地启动用户进程,我就不会感到那么安全了。 @caf
    猜你喜欢
    • 2016-01-21
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多