Drivers
無法刪除可載入模組
我正在嘗試了解 Linux 設備驅動程序。我正在嘗試從命令行使用insmod安裝模組。插入後,我嘗試刪除載入的模組,但失敗並出現錯誤,
could not remove module hello: Device or resource busy
我找到了這個連結,但它似乎沒有提供有效的答案。
下面是
hello.c
模組的 C 程式碼 ( ):#include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ #include <linux/init.h> /* Needed for the macros */ static int data __initdata = 3; #ifdef USE_OLDER_NAMING int init_module(void) { printk(KERN_INFO "Hello world 1.\n"); return -1; } void cleanup_module(void) { printk(KERN_INFO "Goodbye world 1.\n"); } #else static int __init my_init(void) { printk(KERN_ALERT "Hello Module Inserted : %d \n",data); return 0; } static void __exit my_exit(void) { printk(KERN_ALERT "Hello Module removed : %d \n",data); return; } module_init(my_init); module_exit(my_exit); #endif
我正在使用以下 Makefile 編譯此模組:
obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
編譯後,我使用命令安裝模組
sudo insmod ./hello.ko
。我可以在/proc/modules
. 的輸出cat /proc/modules | grep hello
是hello 12490 0 - Live 0x0000000000000000 (POF)
。當我簽入時
dmesg
,我可以看到日誌Hello Module Inserted : 3
。當我嘗試刪除模組時,出現以下錯誤rmmod: ERROR: ../libkmod/libkmod-module.c:769 kmod_module_remove_module() could not remove 'hello': Device or resource busy rmmod: ERROR: could not remove module hello: Device or resource busy
的輸出
cat /proc/modules | grep hello
是hello 12422 0 - Unloading 0x0000000000000000 (POF-)
我的問題是如何刪除該模組?序列/程式碼有什麼問題?
首先,您的my_exit函式中有一個 return 語句導致了這個問題。
至於解除安裝部分,如果你想強制刪除一個模組,那麼你必須在核心中啟用**CONFIG_MODULE_FORCE_UNLOAD 。**否則,您必須重新啟動系統。