在不重新启动的情况下插入内核模块时出错后无法删除或重新插入内核模块

Cir*_*郝海东 5 linux kernel-modules

我正在学习如何创建内核模块,并且一切正常:我编译、插入了.kowith sudo insmod cheat.ko,并且printkinit 函数(由 设置module_init)中的消息正确出现在/etc/log/syslog. 然后我对模块进行了更改,使用 将其删除sudo rmmod cheat.ko,重新插入,printk消息又恢复了。

然后,当我尝试一个新功能时,屏幕变得像一个 tty,到处都是错误消息,我做了 ctrl-alt-f2 ctrl-alt-f7(我在 ubuntu 上),然后我回到了 X 服务器。

我取消了对源文件的最新修改,重新编译,但现在的问题是我无法重新插入模块来再次测试,除非我重新启动,这对测试来说太烦人了。

如何在不重新启动的情况下重新插入修改后的模块?

我的尝试和我得到的信息:

编辑

正如其他人所说,使用虚拟机。我强烈建议你使用Vagrant来管理它。

编辑 2

不,Vagrant 适用于新手,请改用 QEMU + Buildroot:https : //github.com/cirosantilli/linux-kernel-module-cheat

Gil*_*il' 8

Linux 内核只愿意卸载模块,如果它们的module_exit函数成功返回。如果模块的某些功能崩溃,内核可能能够恢复,但模块被锁定在内存中。有可能翻遍内核数据结构并将模块强行标记为不可加载(尝试修补module_exit函数以不执行任何操作),但这是有风险的。最好的办法是重新启动。

测试内核模块的正常方法是在虚拟机中。不要在您的开发机器上测试模块。与物理机相比,VM 的优势在于您可以将 VM 状态保存在准备测试的配置中,并根据需要多次恢复,从而节省了测试之间的启动时间。