Linux:重新加载内核模块

时间:2016-06-10 23:59:03

标签: linux linux-kernel linux-device-driver

我正在GPU内核模块上进行一些开发。它只能在'make modules'而不是'make'上编译,所以我可以说它是一个动态加载的模块,可以在Linux启动时加载。我想在不安装全新内核的情况下快速重新编译并重新安装模块。是否可以简单地“制作模块”然后替换/ lib / modules /中的现有.ko文件,然后重新启动?如果没有(也许它正在使用中)我可以启动到不同的内核,进行替换,然后重新启动吗?是否有可能只是insmod它?

1 个答案:

答案 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.komodprobe 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