0

netdevice通知をキャプチャし、その値をメッセージログファイルに出力する簡単なコードを作成しました...コードは次のとおりです。

#include <linux/notifier.h>
#include <asm/kdebug.h> 
#include <linux/netdevice.h>
#include <linux/inetdevice.h>

int my_dev_event_handler (struct notifier_block *self,unsigned long val, void *data)
{
    printk (KERN_INFO "my_dev_event: Val=%ld, Interface=%s\n", val,((struct net_device *) data)->name);
    return 0;
}

static struct notifier_block my_dev_notifier = {
.notifier_call = my_dev_event_handler,
};

static int __init
my_init (void)
{
printk(KERN_ALERT "***Module Loaded***\n");
register_netdevice_notifier (&my_dev_notifier); 

   return 0;
}

static void __exit my_end(void)
{
    printk(KERN_ALERT "***Module Unloaded***\n");
}

module_init(my_init);
module_exit(my_end);

このコードはコンパイルして正しく実行され、デバイスが起動/停止するたびに「my_dev_event:...」行を出力します...しかし、デバイスが起動/停止するとシステム全体がフリーズすることがあります...ここで 2 つの質問があります。1- システムがフリーズするのはなぜですか? このコードに何か問題がありますか?2-デバイスが接続/切断されたときにカーネルモジュールに通知するより良い方法がある場合...

4

1 に答える 1

2

私が見る唯一の問題はmy_end、ノーティファイアの登録を解除しないことです。
これにより、モジュールをアンロードした後にクラッシュまたはフリーズが発生する可能性があります。これは、コードへのポインターが Linux データ構造に残っているが、コードが存在しないためです。

別の方法について-これらの通知を取得する正しい方法を使用していると思います。

于 2012-06-18T12:52:24.153 に答える