如何检查代码以确保内核模块之间的依赖关系 - Linux Kernel?

时间:2014-04-25 12:00:02

标签: linux-kernel kernel linux-device-driver kernel-module

我有两个模块。我希望模块在执行insmod或rmmod时是相互依赖的。目前,我的module2依赖于module1。如果我插入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);

makefile -

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);

1 个答案:

答案 0 :(得分:2)

您可以在要使用导出符号的模块mod2中使用request_module 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 */

请勿忘记使用try_module_get()

增加模块引用计数