6

find_module()Linuxカーネルの機能の使い方は?ドキュメントには、「module_mutex を保持する必要がある」と記載されています。

  1. 別のモジュールへのポインターを検索する前に、モジュール コードでロックを取得する必要があるということですか?
  2. このミューテックスがモジュール以外のカーネル コードによってロックされるのはいつですか?

環境

連携して動作する一連のカーネル モジュールをデバッグしています。

モジュール A は、モジュール B の関数を呼び出します。モジュール A の関数 C のある時点で、モジュール B の使用カウントが無効になります。これはモジュール B の関数では発生していないと判断しました。C からモジュール B の使用カウントをデバッグしたいと思います。これを行うには、find_module()を使用して B へのポインターを取得します。

4

2 に答える 2

1

私はあなたのコードでもう少し防御的であることを提案します:

#include <linux/module.h>
#include <linux/capability.h>

int do_my_work(void)
{
    struct module *mod;
    char name[MODULE_NAME_LEN];
    int ret, forced = 0;

    if (!capable(CAP_SYS_MODULE) || modules_disabled)
        return -EPERM;

    /* Set up the name, yada yada */
    name[MODULE_NAME_LEN - 1] = '\0';

    /* Unless you absolutely need an uninterruptible wait, do this. */
    if (mutex_lock_interruptible(&module_mutex) != 0) {
        ret = -EINTR;
        goto out_stop;
    }

    mod = find_module(name);
    if (!mod) {
        ret = -ENOENT;
        goto out;
    }

    if (!list_empty(&mod->modules_which_use_me)) {
        /* Debug it. */
    }

out:
    mutex_unlock(&module_mutex);
out_stop:
    return(ret);
}

module_mutexは、モジュールのさまざまな操作でカーネルによって取得されます。それらはすべて/kernel/module.cにあり、次のとおりです。

  • 各モジュールを個別に初期化する場合、およびすべてのモジュールを初期化する場合(たとえば、起動時)。
  • モジュールの削除
  • モジュールが誰にも参照(使用)されないまで待機します。
  • / procファイルシステムがモジュールのリストを必要とする場合(oprofileとco。はこれを利用します)。
  • トレースポイント関連のコード。トレースポイントの反復と更新。
于 2010-07-28T08:20:47.423 に答える
0

1) はい。呼び出すmodule_mutex前にモジュールに入るfind_module()

2)モジュールコードの外では使用されていません

例:

struct module *mod;

mutex_lock(&module_mutex);

mod = find_module("MODULE_NAME");

if(!mod) {
    printk("Could not find module\n");
    return;
}

mutex_unlock(&module_mutex);
于 2010-07-23T20:22:02.727 に答える