【问题标题】:Call function of kernel module from another kernel module从另一个内核模块调用内核模块的函数
【发布时间】:2022-04-13 20:22:31
【问题描述】:

我是内核驱动程序开发的新手。所以我只是陷入了困境。如何从另一个内核模块调用内核模块的功能?这些都是我的.c 文件。

module1.c:

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>

int multiplication(int a, int b)
{
    int ans=0;
    ans = a * b;
    printk(KERN_INFO"Returns the Multiplication to Module2!: %d\n", ans);
    return ans;
}

module2.c:

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>

void calling()
{
    int a=2,b=3;
    int ans=0;
    ans = multiplication(a,b) // function of module1.c.
    printk(KERN_INFO"Multiplication recieved from Module1!: %d\n", ans);
}

我想从module1.c 调用module2.c 中的multiplication 函数。我该怎么做?

【问题讨论】:

  • 可以添加堆栈跟踪吗?

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


【解决方案1】:

要调用在另一个内核模块中定义的函数,您必须导出该函数。

EXPORT_SYMBOL

EXPORT_SYMBOL() 帮助您为其他模块/代码提供 API。

您导出的功能可用于其他模块/代码。

在定义函数后开始使用module1.c中的EXPORT_SYMBOL()函数:

EXPORT_SYMBOL(multiplication);

然后您可以使用module2.c 中的extern 关键字将函数声明为外部符号:

extern int multiplcation(int, int);

构建模块后,插入导出符号的模块,然后插入导入符号的模块。在这种情况下,您将插入module1.ko,然后插入module2.ko

上面的“EXPORT_SYMBOL”超链接提供了一些示例

【讨论】:

  • 这可能行不通。因为我的问题是,这两个模块都可以独立插入内核。如果我先插入 module2.ko,它可能不会加载到内核中。
  • 是的,如果你先插入 module2.ko,它不会被插入到内核中,因为乘法符号不会被定义。你会得到一个unknown symbol 错误。您的问题中没有提到这一点,所以我不知道您希望模块独立加载。我不确定您的要求是否可行,因为内核需要在插入之前定义模块中的所有函数。
  • 是的,我的错。是的,你可以使用函数指针:)
猜你喜欢
  • 2016-05-31
  • 2019-01-15
  • 1970-01-01
  • 2012-08-08
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多