繁体   English   中英

Linux内核源代码可以使用驱动程序中的功能吗?

[英]Can a linux kernel source use a function from driver?

我有一个可加载的module(driver)函数,Linux内核源需要使用它。

该函数已经由EXPORT_SYMBOL_GPL()打开。

linux内核源代码是linux-3.16.1/mm的c文件之一。

但是,我在c文件中添加了extern function ,然后重新编译了整个Linux内核源代码。

错误消息打印undefined reference to fun

我认为该错误是在链接时发生的。

无法从驱动程序中找到功能参考。

我怎么解决这个问题?

我有一个可加载的module(driver)函数,Linux内核源需要使用它。

是。 这个有可能。 但是,您并非以直截了当的方式寻找。 大多数驱动程序与可加载内核模块(LKM)的工作方式相同。

考虑一个示例GPIO驱动程序(CONFIG_ATH79)。

在以下链接中,我们可以看到将函数分配给函数指针的结构。
http://lxr.free-electrons.com/source/drivers/gpio/gpio-ath79.c#L124

结构在这里定义
http://lxr.free-electrons.com/source/include/linux/gpio/driver.h#L90

同样的方法,也可以做到。 在相应的头文件中声明一个结构,该结构应包含在LKM中。

从LKM填充该结构,并在linux-3.16.1 / mm / fileX.c上使用它

简而言之的问题:请考虑以下示例

extern int test_module_function();

int teste_function() {
    return test_module_function();
}

当您编译此源代码时-编译器不需要test_module_function()主体,声明就足够了。 但是,当我们进行链接时,我们需要定义功能。 欲了解更多信息,请阅读这个这个

在您的情况下,您仅提供了声明,因为EXPORT_SYMBOL_GPL()仅使您的函数可从模块调用(提供函数的extern声明)。 它不会在内核源代码中复制功能体(请参阅此内容 )。 函数主体在您的模块中,并且该模块(我认为)没有内置在内核中。 因此,链接器找不到它。

可能的解决方案-将模块内置到内核中(如dragosht所述 )。

边注:
我同意unwindIan Abbott的看法-寻找更好的解决方案,内核提供了API。 例如,看看其他模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM