Linux: 重新加载内核模块
Linux: re-loading kernel modules
我正在 GPU 内核模块上进行一些开发。它只在 'make modules' 而不是 'make' 上编译,所以我可以说它是一个动态加载的模块,在 Linux 启动时加载。我想在不安装全新内核的情况下快速重新编译并重新安装模块。可以简单地 'make modules' 然后替换 /lib/modules/... 中现有的 .ko 文件然后重新启动吗?如果没有(也许它正在使用中),我可以启动到不同的内核,进行替换,然后重新启动吗?是否有可能甚至只是 insmod 它?
It gets compiled only on 'make modules' and not on 'make', so I can say it is a dynamically loaded module that loads on Linux boot.
您应该检查模块的放置位置。它只能存储在 /lib/modules/...kernel-version../ 中,或者在 /lib/modules 和 initramfs (initrd) 中。在第二种情况下,您需要在 /lib/modules.
中更新 ko 后重新生成 initramfs 映像
I would like to rapidly recompile and reinstall the module without installing a whole new kernel. Is it ok to simply 'make modules' and then replace the existing .ko file in /lib/modules/... and then reboot?
是的,这允许更改 .ko 文件,即使在加载模块时也是如此。 (使用 init_module
加载模块是从 .ko ELF 文件的内存副本完成的,因此使用过的模块版本仍将使用旧数据)。
重新启动后,所有模块及其文件也都未使用。
Is it possible even to just insmod it?
不允许对已加载的模块执行 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
我正在 GPU 内核模块上进行一些开发。它只在 'make modules' 而不是 'make' 上编译,所以我可以说它是一个动态加载的模块,在 Linux 启动时加载。我想在不安装全新内核的情况下快速重新编译并重新安装模块。可以简单地 'make modules' 然后替换 /lib/modules/... 中现有的 .ko 文件然后重新启动吗?如果没有(也许它正在使用中),我可以启动到不同的内核,进行替换,然后重新启动吗?是否有可能甚至只是 insmod 它?
It gets compiled only on 'make modules' and not on 'make', so I can say it is a dynamically loaded module that loads on Linux boot.
您应该检查模块的放置位置。它只能存储在 /lib/modules/...kernel-version../ 中,或者在 /lib/modules 和 initramfs (initrd) 中。在第二种情况下,您需要在 /lib/modules.
中更新 ko 后重新生成 initramfs 映像I would like to rapidly recompile and reinstall the module without installing a whole new kernel. Is it ok to simply 'make modules' and then replace the existing .ko file in /lib/modules/... and then reboot?
是的,这允许更改 .ko 文件,即使在加载模块时也是如此。 (使用 init_module
加载模块是从 .ko ELF 文件的内存副本完成的,因此使用过的模块版本仍将使用旧数据)。
重新启动后,所有模块及其文件也都未使用。
Is it possible even to just insmod it?
不允许对已加载的模块执行 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