linux卸载模块驱动程序,Linux设备驱动程序 之 装载和卸载模块
前置說明
本文例子中涉及兩個模塊hello.ko和world.ko,其中hello導出符號供world使用;
insmod
該命令將模塊的代碼和數(shù)據(jù)裝入內核,然后使用內核的符號表繼續(xù)模塊中任何未解析的符號。insmod不會修改模塊的磁盤文件,而僅僅修改內存中的副本。insmod可以接受一些命令行選項,并且可以再模塊鏈接到內核之前給模塊中的整數(shù)和字符串變量賦值。
按照順序加載,通過;
1 [root@localhost export]# insmodhello.ko2 [root@localhost export]# insmod world.ko
先加載world.ko,不通過,因為world找不到從a中引用的符號;
1 [root@localhost export]# insmodworld.ko2 insmod: ERROR: could not insert module world.ko: Unknown symbol in module
modprobe
與insmod類型,modprobe也用來將模塊裝入內核,區(qū)別在于,modprobe會考慮要加載的模塊是否引用了一些當前內核中不存在的符號,如果有這類引用,modprobe會在當前模塊搜索路徑中查找定義了這些符號的其他模塊,如果找到了這些依賴模塊,它會同時將這些模塊也裝載到內核。這種情況下使用insmod會失敗,并在系統(tǒng)日志文件中記錄”unresolved symbols”消息;
在使用modprobe時,在配置文件中加入 modules_install行和clean行;
1 ifneq ($(KERNELRELEASE),)2 obj-m :=hello.o world.o3 # module-objs :=file1.o file2.o4 else
5 KERNELDIR ?=/lib/modules/$(shell uname -r)/build6 PWD :=$(shell pwd)7 default:8 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules9 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install10 clean:11 rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers12 $(MAKE) -C $(KERNELDIR) M=$(PWD) clean13 endif
加載模塊world,成功;
1 [root@localhost export]# modprobe world
lsmod查看,可見依賴的模塊hello也被加載進內核;
1 [root@localhost export]# lsmod
2 Module Size Used by3 world 16384 0
4 hello 16384 1 world
rmmod
rmmod用于從內核中移除模塊;如果內核模塊仍然在使用狀態(tài),或者內核被配置為禁止移除模塊,則無法移除該模塊;配置內核并支持在模塊忙的時候仍能移除模塊是可能的;但是,重新引導系統(tǒng)是更合適的辦法;
先移除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.ko2 rmmod: ERROR: Module hello is in use by: world
lsmod
lsmod用于列出當前裝載到內核中的所有模塊,包括一些其他信息,其通過讀取/proc/modules來獲取這些信息;
1 [root@localhost export]# lsmod
2 Module Size Used by3 world 16384 0
4 hello 16384 1 world
總結
以上是生活随笔為你收集整理的linux卸载模块驱动程序,Linux设备驱动程序 之 装载和卸载模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux信号处理函数可中断么,linu
- 下一篇: linux 不同ip 相同mac arp