"); //-->
http://www.cnblogs.com/riskyer/p/3221805.html
EXPORT_SYMBOL只出現(xiàn)在2.6內(nèi)核中,在2.4內(nèi)核默認的非static 函數(shù)和變量都會自動
導入到kernel 空間的, 都不用EXPORT_SYMBOL() 做標記的。
2.6就必須用EXPORT_SYMBOL() 來導出來(因為2.6默認不到處所有的符號)。
1、EXPORT_SYMBOL的作用是什么?
EXPORT_SYMBOL標簽內(nèi)定義的函數(shù)或者符號對全部內(nèi)核代碼公開,不用修改內(nèi)核代
碼就可以在您的內(nèi)核模塊中直接調(diào)用,即使用EXPORT_SYMBOL可以將一個函數(shù)以符
號的方式導出給其他模塊使用。
這里要和System.map做一下對比:
System.map 中的是連接時的函數(shù)地址。連接完成以后,在2.6內(nèi)核運行過程中,是不知道哪個符號在哪個地址的。
EXPORT_SYMBOL 的符號, 是把這些符號和對應的地址保存起來,在內(nèi)核運行的過程中,可以找到這些符號對應的地址。而模塊在加載過程中,其本質(zhì)就是能動態(tài)連接到內(nèi)核,如果在模塊中引 用了內(nèi)核或其它模塊的符號,就要EXPORT_SYMBOL這些符號,這樣才能找到對應的地址連接。
2、使用方法
第一、在模塊函數(shù)定義之后使用EXPORT_SYMBOL(函數(shù)名)
第二、在掉用該函數(shù)的模塊中使用extern對之聲明
第三、首先加載定義該函數(shù)的模塊,再加載調(diào)用該函數(shù)的模塊
例如:
一個模塊mod1中定義一個函數(shù)func1;
在另外一個模塊mod2中定義一個函數(shù)func2,func2調(diào)用func1。
在模塊mod1中,EXPORT_SYMBOL(func1);
在模塊mod2中,extern int func1();
就可以在mod2中調(diào)用func1了。
(1)helloworld.c
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static void hello_fun(void)
{
printk("##### helloworld####\n");
}
EXPORT_SYMBOL(hello_fun);
static int __init hello_init(void)
{
printk(KERN_ERR "#### hello world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ERR "#### exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m := hello.o
hello-objs := helloworld.o
KID := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
all:
make -C $(KID) M=${PWD} modules
clean:
rm -rf *.o .cmd *.ko *.mod.c .tmp_versions
(2)call-module.c
#include <linux/module.h>
#include <linux/init.h>
extern void hello_fun(void);
static int __init hello_init(void)
{
hello_fun();
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ERR "#### exit\n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m := call-module.o
KID := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
KBUILD_EXTRA_SYMBOLS=/usr/src/linux-headers-3.5.0-34-generic/Module.symvers
KBUILD_EXTRA_SYMBOLS +=/home/snail/work/2.linux-driver/1.helloworld/Module.symvers
all:
make -C $(KID) M=${PWD} modules
clean:
rm -rf *.o .cmd *.ko *.mod.c .tmp_versions *.order *.symvers .*
(3)
加載 hello.ko
sudo insmod ./hello.ko
加載 call-module.ko
sudo insmod ./call-module.ko
觀察 dmesg
<4>[ 3837.857657] ##### helloworld####
(4)注意事項
加載call-module.ko可能會出現(xiàn)
“NO SYMBOL VERSION FOR”問題
解決:
這是linux kernel 2.6.26 之后版本的bug (詳細描述, 請看http://bugzilla.kernel.org/show_bug.cgi%3Fid%3D12446)
并且這個bug不會被fix
解決辦法:
(1)mod_a的Module.symvers放到mod_b的當前路徑,從而編譯mod_b,符號信息會自動連接進去.
(2)或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers,
如:
KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers
編譯mod_b時,搜索Module.symvers的路徑是:
1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
2, makefile中M=所指定的路徑, 它等效于變量KBUILD_EXTMOD的值
3, 變量KBUILD_EXTRA_SYMBOLS的值
問題的本質(zhì):
簡單說來,就是小b生成的時候不知道小a symbol的校驗碼,小b加載的時候自然check 校驗碼出錯。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。
相關推薦
LabVIEW 快速編程之謎
2025 年,麥當勞 McHire 機器人因使用\'123456\'作為密碼,泄露了 6400 萬人的個人信息
[公告]鼓勵大家發(fā)貼!
伴音電路:AN5265
LabVIEW 運行性能之謎
8,16位MCU接入TCP IP網(wǎng)絡的資料
伴音電路:LA4225A
漢格斯特過濾集團收購中國空氣過濾專家奇昇凈化科技
AOS將出售中國合資企業(yè) 20.3% 的股份
優(yōu)必選天工行者人形機器人訂單破百,年內(nèi)交付預計超300臺
數(shù)字功放電路
[推薦]Real Time UML 3rd Edition
納芯微推出車規(guī)級帶米勒鉗位功能的隔離半橋驅(qū)動NSI6602MxEx系列
8051的仿真器評估版,限制了調(diào)試文件大小
LabVIEW 循環(huán)定時之謎
ADS集成開發(fā)環(huán)境及EasyJTAG仿真器應用(LPC2100 專用工程模板)
ADS1.2 設計開發(fā)指南
LabVIEW 事件結構之謎
英特爾將俄勒岡裁員增至2400人;據(jù)報道,全國將裁員4000人,7月中旬完成
斯坦福大學:聊天機器人違背了治療最佳實踐
51系列單片機的uC OS-II
LabVIEW 8.5在各行業(yè)的應用集錦
貿(mào)澤與Qorvo發(fā)布電子書 探討電機控制的挑戰(zhàn)與解決方案
繼續(xù)送禮——嵌入式論文下載(五)
高頻產(chǎn)生點燈器電路
光藕代替音頻變壓器電路圖
用過Zinc6.0的請進
英特爾積極行動:據(jù)報道,諾瓦湖在臺積電的 2 納米工藝上量產(chǎn),18A 良率提升速度加快
十一前稿費已經(jīng)上報,一兩天內(nèi)寄出
新舊GPU對決:Blackwell憑啥更能打?