Linux kernel 在rmmod期间,内核模块如何与用户空间进程通信?

Linux kernel 在rmmod期间,内核模块如何与用户空间进程通信?,linux-kernel,Linux Kernel,我有一个内核模块(实际上是一个伪设备驱动程序)和一个辅助用户空间进程 我希望内核模块在rmmod过程中联系用户空间进程,触发用户空间进程进行一些清理工作。我知道我可以从内核向用户进程发送一个信号来触发清理,但是我确实需要发送一些其他信息来指导用户进程如何进行清理。(如果需要的话,这是一个整数数组)。我想我不能随信号传递任何信息 你们知道怎么做吗?我不能使用ioctl,因为设备在rmmod'ed时对用户空间进程不可见 谢谢。这样的设计不适合内核的工作方式 相反,您应该使模块报告本身处于使用状态,直

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

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

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


谢谢。

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

相反,您应该使模块报告本身处于使用状态,直到完成清理(从而导致
rmmod
失败)。当您想要卸载模块时,应该触发用户空间清理,然后在完成后执行
rmmod
(可能是使用某种用户空间脚本)


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

为什么要在rmmod期间执行此操作:我的模块是一个块设备驱动程序。因此,只要我不执行rmmod,它可能仍然需要IO请求。我真的需要在我进行清理时停止该设备上的IO活动。这就是为什么我想在rmmod运行函数中执行它@caf@yangsuli:因此,您只需要用户空间进程首先请求设备自行停止(使发布的任何新IOs失败,并阻塞,直到任何未完成的IOs完成);然后进行清理;然后请求rmmod.Well。我知道原则上我应该这样做…但我只是变得懒惰了,希望内核在做rmmod时能帮我做到这一点。这只是为了一些测试目的。在我的例子中,强制我的设备停止运行是很难实现的,因为我的驱动程序在内部维护了很多状态。我在这里找一条捷径@caf@yangsuli:Ahh-不,内核不会在rmmod上强制执行类似的操作。无论哪种方式,您都必须自己实现——在大多数情况下,如果用户空间进程仍然打开模块(因为它们的模块使用计数为非零),模块将拒绝卸载。如果你的模块允许自己在使用中被删除,那只会导致内核崩溃。这就是我的观点…如果在我执行rmmod时有未完成的IO,内核实际上会阻止我这样做…所以当我使用rmmod函数时,我可以放心,没有人会弄乱我的内部设备状态。然而,如果我只是启动用户进程,我就不会感到如此安全@咖啡馆