我有两个模块。我希望模块在执行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);
答案 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()
增加模块引用计数