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 服务器。
我取消了对源文件的最新修改,重新编译,但现在的问题是我无法重新插入模块来再次测试,除非我重新启动,这对测试来说太烦人了。
如何在不重新启动的情况下重新插入修改后的模块?
我的尝试和我得到的信息:
cat /etc/log/syslog: 对我来说唯一相关的信息是:
BUG: unable to handle kernel NULL pointer dereference at 00000003
Run Code Online (Sandbox Code Playgroud)
所以这似乎是问题的原因,然后我得到了一个糟糕的:
Oops: 0002 [#1] SMP
Run Code Online (Sandbox Code Playgroud)
可怕的调试信息紧随其后,但似乎没有什么能帮助我重新插入模块。
sudo insmod cheat.ko:命令只是挂起,什么都不输出,我可以继续使用该终端模拟器的唯一方法是用 c-c
sudo rmmod cheat:
Error: Module cheat is not currently loaded
Run Code Online (Sandbox Code Playgroud)sudo modprobe -r cheat.ko
FATAL: Module cheat.ko not found.
Run Code Online (Sandbox Code Playgroud)lsmod | grep cheat:
cheat 19009 -2
Run Code Online (Sandbox Code Playgroud)
它有一个非常可疑的-2使用计数......
cat /proc/modules | grep cheat
cheat 19009 1 - Loading 0x00000000 (OF+)
Run Code Online (Sandbox Code Playgroud)
有趣,所以模块仍在加载...
编辑
正如其他人所说,使用虚拟机。我强烈建议你使用Vagrant来管理它。
编辑 2
不,Vagrant 适用于新手,请改用 QEMU + Buildroot:https : //github.com/cirosantilli/linux-kernel-module-cheat
Linux 内核只愿意卸载模块,如果它们的module_exit函数成功返回。如果模块的某些功能崩溃,内核可能能够恢复,但模块被锁定在内存中。有可能翻遍内核数据结构并将模块强行标记为不可加载(尝试修补module_exit函数以不执行任何操作),但这是有风险的。最好的办法是重新启动。
测试内核模块的正常方法是在虚拟机中。不要在您的开发机器上测试模块。与物理机相比,VM 的优势在于您可以将 VM 状态保存在准备测试的配置中,并根据需要多次恢复,从而节省了测试之间的启动时间。
| 归档时间: |
|
| 查看次数: |
16563 次 |
| 最近记录: |