首页 > 解决方案 > 在内核模块 module1.ko 之前加载依赖于 module1.ko 的内核模块 module2.ko

问题描述

如何在 module1.ko 之前在内核中加载 module2.ko。module2.ko 依赖于 module1.ko,因为 module1.ko 有函数的定义,而 module2.ko 有它的调用。我在 module2.c 中插入了一个条件来检查 module1 是否加载到内核中。如果它被加载,它将执行该功能,否则它应该打印一条错误消息。我在下面提到了我的代码。

模块1.c:

#include <linux/module.h>     /* Needed by all modules */ 
#include <linux/kernel.h>     /* Needed for KERN_INFO */ 
#include <linux/init.h>       /* Needed for the macros */ 
#include <linux/fs.h>         // Needed by filp
#include <asm/uaccess.h> 

MODULE_LICENSE("Test");
int mul(void) 
{
    printk("Running module1.c\n"); 
    int a=2,b=620;
    int ans = 0;
    ans = a * b; 
    printk("The value sent to module1.c = %d\n", ans); 
    return ans; 
}

EXPORT_SYMBOL(mul);


static int start(void) 
{
    return 0;
} 



static void end(void) 
{ 
    printk(KERN_INFO "Goodbye.\n");
} 

module_init(start); 
module_exit(end); 

模块2.c:

#include <linux/module.h>     /* Needed by all modules */ 
#include <linux/kernel.h>     /* Needed for KERN_INFO */ 
#include <linux/init.h>       /* Needed for the macros */ 
#include <linux/fs.h>         // Needed by filp


MODULE_LICENSE("Test"); 
MODULE_AUTHOR("Ali"); 
MODULE_DESCRIPTION("Making two dependent Modules");  
MODULE_VERSION("0.1"); 
  
void display(void){
    printk("Running module2.c\n");
}
static int hello_start(void) 
{
    int res = 0;
    display();
    int fd;
    fd = filp_open("/sys/module/module1", O_RDONLY, 0);
    printk(KERN_INFO "This is flag %d\n",fd);
    if(fd > 0)
    {
        printk(KERN_INFO "Module not exists in Kernel!!.\n");
        return 0;
    }
    else
    {
        extern int mul(void);
        printk(KERN_ALERT "Module exists in Kernel!!.\n");
        printk(KERN_ALERT"The value recieved from module1.c = %d\n", res=mul());
    }
        
    return 0;
} 
  
static void hello_end(void) 
{ 
    printk(KERN_INFO "Goodbye123.\n"); 
} 
  
module_init(hello_start); 
module_exit(hello_end); 

生成文件:

obj-m = module1.o module2.o
all:
    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

标签: linuxlinux-kernellinux-device-driverembedded-linuxkernel-module

解决方案


推荐阅读