Linux kernel 如何使用find_模块?
如何使用linux内核的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) 它不在模块代码之外使用 例如:
find_module()
函数?
文档中说“必须持有模块互斥”
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.使用此列表)
- 跟踪点相关代码中;迭代并更新跟踪点