Linux设备驱动程序 之 装载和卸载模块
前置说明
本文例子中涉及两个模块hello.ko和world.ko,其中hello导出符号供world使用;
insmod
该命令将模块的代码和数据装入内核,然后使用内核的符号表继续模块中任何未解析的符号。insmod不会修改模块的磁盘文件,而仅仅修改内存中的副本。insmod可以接受一些命令行选项,并且可以再模块链接到内核之前给模块中的整数和字符串变量赋值。
按照顺序加载,通过;
1 [root@localhost export]# insmod hello.ko 2 [root@localhost export]# insmod world.ko
先加载world.ko,不通过,因为world找不到从a中引用的符号;
1 [root@localhost export]# insmod world.ko 2 insmod: ERROR: could not insert module world.ko: Unknown symbol in module
modprobe
与insmod类型,modprobe也用来将模块装入内核,区别在于,modprobe会考虑要加载的模块是否引用了一些当前内核中不存在的符号,如果有这类引用,modprobe会在当前模块搜索路径中查找定义了这些符号的其他模块,如果找到了这些依赖模块,它会同时将这些模块也装载到内核。这种情况下使用insmod会失败,并在系统日志文件中记录”unresolved symbols”消息;
在使用modprobe时,在配置文件中加入 modules_install行和clean行;
1 ifneq ($(KERNELRELEASE),) 2 obj-m :=hello.o world.o 3 # module-objs := file1.o file2.o 4 else 5 KERNELDIR ?=/lib/modules/$(shell uname -r)/build 6 PWD :=$(shell pwd) 7 default: 8 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 9 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 10 clean: 11 rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers 12 $(MAKE) -C $(KERNELDIR) M=$(PWD) clean 13 endif
加载模块world,成功;
1 [root@localhost export]# modprobe world
lsmod查看,可见依赖的模块hello也被加载进内核;
1 [root@localhost export]# lsmod 2 Module Size Used by 3 world 16384 0 4 hello 16384 1 world
rmmod
rmmod用于从内核中移除模块;如果内核模块仍然在使用状态,或者内核被配置为禁止移除模块,则无法移除该模块;配置内核并支持在模块忙的时候仍能移除模块是可能的;但是,重新引导系统是更合适的办法;
先移除world.ko,再移除hello.ko,成功;
[root@localhost export]# rmmod world.ko
[root@localhost export]# rmmod hello.ko
先移除模块hello.ko,产生错误,因为hello在被world使用;
1 [root@localhost export]# rmmod hello.ko 2 rmmod: ERROR: Module hello is in use by: world
lsmod
lsmod用于列出当前装载到内核中的所有模块,包括一些其他信息,其通过读取/proc/modules来获取这些信息;
1 [root@localhost export]# lsmod 2 Module Size Used by 3 world 16384 0 4 hello 16384 1 world
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix