2013-05-03 32 views
4

我試圖在兩個模塊之間共享一個全局變量,以便了解如何正確使用EXPORT_SYMBOL宏,但是我一直在收到Invalid paramaters錯誤嘗試插入第二個模塊。嘗試插入訪問導出符號的模塊時出現「無效參數」錯誤

在第一模塊foo.c

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

extern unsigned myvar; 
unsigned myvar = 42; 
EXPORT_SYMBOL(myvar); 

static int __init foo_init(void){ 
     printk(KERN_INFO "HELLO FROM MODULE 1"); 

     return 0; 
} 

static void __exit foo_exit(void){ 
     printk(KERN_INFO "BYE FROM MODULE 1"); 
} 

module_init(foo_init); 
module_exit(foo_exit); 

MODULE_LICENSE("GPL"); 

在第二模塊bar.c

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

extern unsigned myvar; 

static int __init bar_init(void){ 
     printk(KERN_INFO "HELLO FROM MODULE 2"); 

     printk(KERN_INFO "myvar: %u", myvar); 

     return 0; 
} 

static void __exit bar_exit(void){ 
     printk(KERN_INFO "BYE FROM MODULE 2"); 
} 

module_init(bar_init); 
module_exit(bar_exit); 

MODULE_LICENSE("GPL"); 

我編譯在具有分離的生成文件不同的目錄中的每個模塊。然後我手動插入每個模塊:

# insmod foo.ko 
# insmod bar.ko 

Error: could not insert module bar.ko: Invalid parameters 

如果我嘗試插入bar.ko第一,我收到預期的未知符號錯誤:

# insmod bar.ko 
Error: could not insert module bar.ko: Unknown symbol in module 

這裏的符號轉儲:

# nm foo.ko | grep myvar 

00000000ec933bae A __crc_myvar 
0000000000001118 r __kcrctab_myvar 
000000000000057c r __kstrtab_myvar 
0000000000000b20 r __ksymtab_myvar 
0000000000000180 D myvar 

我正在運行一個Debian系統(內核v3.2.21)應用了Xenomai補丁:

# uname -r 
3.2.21-xenomai-2.6.2.1-ipipe 

不幸的是,我不認爲CONFIG_KALLSYMS_ALL啓用,所以我不能在/proc/kallsyms/看,以驗證myvar實際上是出口。

+0

你有一個共同的標題,你定義的符號共享? – Federico 2013-05-03 14:44:34

+0

我在兩個文件中都有'extern unsigned myvar;'(我可以將它粘貼在頭文件中,但淨效應應該是相同的)。 – 2013-05-03 14:50:17

+0

有你的模塊module_init()和module_exit()?你的代碼中有一個EINVAL錯誤返回? – Federico 2013-05-03 15:07:16

回答

10

我決定捅系統周圍,試圖找到錯誤的原因:

# dmesg | tail 
[11169.107152] HELLO FROM MODULE 1 
[11226.101245] bar: no symbol version for myvar 
[11226.101254] bar: Unknown symbol myvar (err -22) 

看起來問題不是與導出符號,而是佔符號版本

該解決方案在Documentation/kbuild/modules.txt中有詳細說明,非常簡單:確保該符號在Module.symvers文件中有條目。


例如,在我的情況下,兩個模塊,其中位於/家/ vilhelm /富/ /家/ vilhelm /酒吧/分別和。由於我分別編譯每個模塊,因此每個目錄都有自己的Makefile。首先我在foo目錄中執行make,在foo模塊的該目錄中生成Module.symvers文件。

# make 

接下來,我修改了Makefilebar模塊通過在Makefile頂部插入以下行:

KBUILD_EXTRA_SYMBOLS := /home/vilhelm/foo/Module.symvers 

請注意,這是一個絕對路徑!

最後,我在酒吧目錄執行make和手動插入模塊:

# make 

... 

# insmod /home/vilhelm/foo/foo.ko 
# insmod /home/vilhelm/bar/bar.ko 

沒有錯誤,所以這是一個好兆頭。

而現在的關鍵時刻:

# dmesg | tail 
[12675.200451] HELLO FROM MODULE 1 
[12715.743320] HELLO FROM MODULE 2 
[12715.743328] myvar: 42 

成功! :-)

相關問題