Linux kernel 如何在代码中进行检查以确保内核间模块依赖性-Linux内核?

Linux kernel 如何在代码中进行检查以确保内核间模块依赖性-Linux内核?,linux-kernel,kernel,linux-device-driver,kernel-module,Linux Kernel,Kernel,Linux Device Driver,Kernel Module,我有两个模块。我希望模块在执行insmod或rmmod时相互依赖。目前,我的模块2依赖于模块1。如果我先插入module1,然后插入module2,就可以了。另一方面,它的反面不起作用。这是合乎逻辑的解释。但是,我需要一个简洁的代码来避免这种依赖关系。如果我使用mod2的insmod,那么mod1应该自动成为insmod,或者其他解决这个问题的好方法。这是我的两个模块 static int multiplyMod1(int a, int b); /** Once the symbol is ex

我有两个模块。我希望模块在执行insmod或rmmod时相互依赖。目前,我的模块2依赖于模块1。如果我先插入module1,然后插入module2,就可以了。另一方面,它的反面不起作用。这是合乎逻辑的解释。但是,我需要一个简洁的代码来避免这种依赖关系。如果我使用mod2的insmod,那么mod1应该自动成为insmod,或者其他解决这个问题的好方法。这是我的两个模块

static int multiplyMod1(int a, int b);
/** Once the symbol is exported, check in /proc/kallsyms **/
/** Call multiplyMod1 from other module **/
/** Ensure that this symbol doesn't exist somewhere **/
EXPORT_SYMBOL(multiplyMod1);

static int multiplyMod1(int a, int b)
{
  return a*b;
}

static int mod1_init(void)
{
    printk(KERN_ALERT "Hello mod1..Init\n");
    return 0;
}

static void mod1_exit(void)
{
    printk(KERN_ALERT "Goodbye..mod1\n");
}

module_init(mod1_init);
module_exit(mod1_exit);
生成文件-

obj-m += mod1.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules modules_install

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
这是我的第二个模块。这取决于模块1

/**确保mod1为insmod,以便multiplyMod1符号可用**/

extern int multiplyMod1(int,int);

static int mod2_init(void)
{
    printk(KERN_ALERT "Hello mod2..Init\r\n");
    printk(KERN_ALERT "The Multiplication result from Mod2 is..%d\r\n",multiplyMod1(49,7));
    return 0;
}

static void mod2_exit(void)
{
    printk(KERN_ALERT "Goodbye..mod2\r\n");
}

module_init(mod2_init);
module_exit(mod2_exit);
您可以在module
mod2
中使用API,在该模块中您希望使用导出的符号,如果以前未加载,则会按需加载所需的模块

在模块
mod2

static int __init module_two_init_module(void)
{
        int ret;
        const char *name;
        struct module * fmodule;
        pr_info("Module two started");
        name = "module_one";
        /* This will find module is loaded or not */
        fmodule = find_module(name); 
        if (fmodule == NULL) {
                ret = request_module(name);
                if (ret == 0) {
                        pr_info("Module one loaded");
                }
        }
        /* Do rest of code here */

不要忘记使用

增加模块引用计数,您需要modprobe来完成此操作。安装您的模块;德普莫德;modprobe这个try\u模块是什么?您能详细说明一下吗?在模块
mod2
中,您将使用模块
mod1
导出的符号,因此您需要增加模块
mod1
的引用计数。这将防止在使用
mod2
时意外/故意移除
mod1