Linuxデバイスドライバを理解しようとしています。以下を使用してモジュールをインストールしようとしています。モジュールの挿入コマンドラインから。挿入後にロードされたモジュールを削除しようとしましたが、エラーが原因で失敗しました。
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-)
私の質問は、このモジュールを削除する方法です。シーケンス/コードにはどのような問題がありますか?
答え1
まず、あなたの返品明細書に私の出口この問題を引き起こす機能です。
取り外し部分の場合は、モジュールを強制的に取り外すには有効にする必要があります。CONFIG_MODULE_FORCE_UNLOADカーネルから。それ以外の場合は、システムを再起動する必要があります。