Drivers

無法刪除可載入模組

  • June 17, 2019

我正在嘗試了解 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 hellohello 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 hellohello 12422 0 - Unloading 0x0000000000000000 (POF-)

我的問題是如何刪除該模組?序列/程式碼有什麼問題?

首先,您的my_exit函式中有一個 return 語句導致了這個問題。

至於解除安裝部分,如果你想強制刪除一個模組,那麼你必須在核心中啟用**CONFIG_MODULE_FORCE_UNLOAD 。**否則,您必須重新啟動系統。

引用自:https://unix.stackexchange.com/questions/524166