Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 如何使用find_模块?_Linux Kernel_Kernel Module - Fatal编程技术网

Linux kernel 如何使用find_模块?

Linux kernel 如何使用find_模块?,linux-kernel,kernel-module,Linux Kernel,Kernel Module,如何使用linux内核的find_module()函数? 文档中说“必须持有模块互斥” 这是否意味着我应该获得 之前我的模块代码中有一个锁 搜索指向另一个的指针 当此互斥锁被锁定时 非模块内核代码 上下文 我正在调试一组协同工作的内核模块 模块A调用模块B的函数。在模块A的函数C中的某个点,模块B的使用计数无效。我发现模块B的函数中没有发生这种情况。我想从C调试模块B的使用计数。为此,我将使用它来获取指向B的指针。1)是的。调用find\u module() 2) 它不在模块代码之外使用 例如:

如何使用linux内核的
find_module()
函数? 文档中说“必须持有模块互斥”

  • 这是否意味着我应该获得 之前我的模块代码中有一个锁 搜索指向另一个的指针
  • 当此互斥锁被锁定时 非模块内核代码
  • 上下文

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

    模块A调用模块B的函数。在模块A的函数C中的某个点,模块B的使用计数无效。我发现模块B的函数中没有发生这种情况。我想从C调试模块B的使用计数。为此,我将使用它来获取指向B的指针。

    1)是的。调用
    find\u 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);
    

    我建议在代码中多加一点防御性:

    #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);
    }
    
    #包括
    #包括
    int do_my_work(无效)
    {
    结构模块*mod;
    字符名称[模块名称];
    int ret,强制=0;
    如果(!有能力(CAP|U系统|U模块)|模块|禁用)
    返回-EPERM;
    /*设置名称,yada yada*/
    名称[模块名称\u LEN-1]='\0';
    /*除非您绝对需要不间断的等待,否则请执行此操作*/
    如果(互斥锁可中断(&模块互斥锁)!=0){
    ret=-EINTR;
    出去走走;
    }
    mod=查找模块(名称);
    如果(!mod){
    ret=-enoint;
    出去;
    }
    如果(!list_empty(&mod->modules_which_use_me)){
    /*调试它*/
    }
    输出:
    互斥解锁(模块互斥);
    出站:
    返回(ret);
    }
    
    内核在对模块的各种操作中获取模块_互斥体。它们都位于/kernel/module.c中,并且是:

    • 单独初始化每个模块以及所有模块时(例如,在引导时)
    • 删除模块
    • 等待模块被无人引用(使用)
    • 当/proc文件系统需要一个模块列表时(oprofile和co.使用此列表)
    • 跟踪点相关代码中;迭代并更新跟踪点