簡體   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