如何使用find_module?

时间:2010-07-20 11:55:44

标签: linux-kernel kernel-module

如何使用linux内核的find_module()函数? 文档说“必须持有module_mutex”。

  1. 这是否意味着我应该获得 锁定我的模块代码之前 寻找另一个指针?
  2. 当此互斥锁被锁定时 非模块内核代码?
  3. 上下文

    我正在调试一组协同工作的内核模块。

    模块A模块B的调用功能。在模块A的功能C中的某一点,模块B的使用计数无效。我determined这不是模块B的功能。我想从C调试模块B的使用次数。为此,我将使用find_module()来获取指向B.

2 个答案:

答案 0 :(得分: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。使用它)。
  • 在跟踪点相关代码中;迭代并更新跟踪点。

答案 1 :(得分:0)