linux - 在内核模块 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
解决方案
推荐阅读
- python - 如何在 lambda 函数中创建图层
- javascript - 无法重置简单的单选按钮 - React JS
- javascript - 删除 HTML 页面中不在元素标签内的文本
- c++ - Qt 和 C++:覆盖或扩展类
- gremlin - gremlin fold()展开()抛出错误:“删除了 id 70 的顶点”和“传入的对象不可删除”
- python - 将日期时间格式转换为时间戳
- r - 如何在R中放大图例中的文本
- vue.js - Vuetify v-divider 垂直太长?
- sql - SQL 根据状态获取第一个非值
- laravel - 如何在 Laravel Eloquent 中使用 DB::raw(MAX) 获取相关模型值?