我正在GPU内核模块上进行一些开发。它只能在'make modules'而不是'make'上编译,所以我可以说它是一个动态加载的模块,可以在Linux启动时加载。我想在不安装全新内核的情况下快速重新编译并重新安装模块。是否可以简单地“制作模块”然后替换/ lib / modules /中的现有.ko文件,然后重新启动?如果没有(也许它正在使用中)我可以启动到不同的内核,进行替换,然后重新启动吗?是否有可能只是insmod它?
答案 0 :(得分:1)
它仅在'make modules'而不是'make'上编译,所以我可以说它是一个动态加载的模块,可以在Linux启动时加载。
您应该检查模块的放置位置。它只能存储在/lib/modules/...kernel-version../,或者存储在/ lib / modules和initramfs(initrd)中。在第二种情况下,您需要在/ lib / modules中更新ko后重新生成initramfs映像。
我想在不安装全新内核的情况下快速重新编译并重新安装模块。是否可以简单地“制作模块”然后替换/ lib / modules /中的现有.ko文件,然后重新启动?
是的,即使加载了模块,也允许更改.ko文件。 (使用init_module
加载模块是从.ko ELF文件的内存中复制完成的,因此使用的模块版本仍将使用旧数据。)
重新启动时,您将无法使用所有模块及其文件。
是否有可能只是insmod它?
不允许执行已加载的模块insmod
(按名称比较 - 检查man finit_module
中的EEXIST错误)。您可以尝试使用不同的名称加载它,但较旧的模块具有硬件的所有权,较新的模块将无法访问PCI / PCIe设备。
因此,在插入较新版本之前,您应该按rmmod modulename
卸载旧模块。只能对未使用的模块进行卸载(man delete_module
,检查lsmod
输出中的使用计数器) - 根据您的情况,不应该有其他模块,任何进程都不应该使用它。卸载后,您可以insmod modulename.ko
或modprobe modulename.ko
。
重新启动将卸载旧模块并加载更新的模块。
如果是GPU驱动程序,你应该停止X.org服务器并停止使用图形的系统控制台(因此,你不能切换到文本控制台并以交互方式重新加载gpu模块;它可以通过ssh远程完成或与带有unbind / unload / load的shell脚本),请检查此问题https://askubuntu.com/questions/418296/fastest-way-to-reload-graphics-driver-module
sudo /etc/init.d/lightdm stop echo 0 > /sys/class/vtconsole/vtcon1/bind