<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > RK3568驅動(dòng)指南|第一篇 驅動(dòng)基礎-第6章 內核模塊符號導出實(shí)驗

RK3568驅動(dòng)指南|第一篇 驅動(dòng)基礎-第6章 內核模塊符號導出實(shí)驗

發(fā)布人:紅李亞 時(shí)間:2024-02-26 來(lái)源:工程師 發(fā)布文章
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內置獨立NPU,可用于輕量級人工智能應用。RK3568 支持安卓 11 和 linux 系統,主要面向物聯(lián)網(wǎng)網(wǎng)關(guān)、NVR 存儲、工控平板、工業(yè)檢測、工控盒、卡拉 OK、云終端、車(chē)載中控等行業(yè)。
第6章 內核模塊符號導出實(shí)驗
在上一小節中,給大家講解了驅動(dòng)模塊傳參實(shí)驗,使用insmod命令加載驅動(dòng)時(shí)可以進(jìn)行參數的傳遞,但是每一個(gè)內核模塊之間是相互獨立的,那模塊間的符號傳遞要怎樣進(jìn)行呢,讓我們帶著(zhù)疑問(wèn)來(lái)進(jìn)行本章節的學(xué)習吧!
6.1 內核模塊符號導出簡(jiǎn)介
驅動(dòng)程序編譯生成的ko文件是相互獨立的,即模塊之間變量或者函數在正常情況下無(wú)法進(jìn)行互相訪(fǎng)問(wèn)。而一些復雜的驅動(dòng)模塊需要分層進(jìn)行設計,這時(shí)候就需要用到內核模塊符號導出。
內核符號導出指的是在內核模塊中導出相應的函數和變量,在加載模塊時(shí)被記錄在公共內核符號表中,以供其他模塊調用。符號導出所使用的宏為EXPORT_SYMBOL(sym)和EXPORT_SYMBOL_GPL(sym)。它們定義在 “內核源碼/include/linux/export.h”文件中(在module.h文件中已經(jīng)對export.h進(jìn)行引用,所以不需要單獨引用export.h文件),詳細定義如下(圖6-1)所示:

EXPORT_SYMBOL(sym)和EXPORT_SYMBOL_GPL(sym)兩個(gè)宏使用方法相同,而EXPORT_SYMBOL_GPL(sym)導出的模塊只能被 GPL 許可的模塊使用,所以絕大多數的情況都使用EXPORT_SYMBOL(sym)進(jìn)行符號導出。sym為函數的唯一參數,表示要導出的函數或變量名稱(chēng)。

至此,關(guān)于內核模塊符號導出函數就講解完成了,在下一小節中將會(huì )編寫(xiě)兩個(gè)驅動(dòng)代碼來(lái)進(jìn)行內核模塊符號導出實(shí)驗。

6.2 實(shí)驗程序的編寫(xiě)

本實(shí)驗對應的網(wǎng)盤(pán)路徑為:iTOP-RK3568開(kāi)發(fā)板【底板V1.7版本】\03_【iTOP-RK3568開(kāi)發(fā)板】指南教程\02_Linux驅動(dòng)配套資料\04_Linux驅動(dòng)例程\03。

本章實(shí)驗將編寫(xiě)Linux下的內核模塊符號導出實(shí)例代碼,總共有兩個(gè)驅動(dòng)程序,第一個(gè)驅動(dòng)文件名為mathmodule.c,用來(lái)定義參數num和函數add(a,b),第二個(gè)驅動(dòng)文件名為hello.c,會(huì )引用mathmodule.c驅動(dòng)程序中的參數num和數學(xué)函數add(a,b),并將相應的參數值和函數返回值打印到串口終端上。

編寫(xiě)完成的mathmodule.c代碼如下(圖6-2)所示

以上代碼定義了一個(gè)int類(lèi)型的num變量和add()數學(xué)函數,并使用EXPORT_SYMBOL宏進(jìn)行導出。

編寫(xiě)完成的hello.c代碼如下(圖6-3)所示:

程序導入了int類(lèi)型的變量num和add()函數,并在驅動(dòng)入口函數中打印相應了num的參數值并對add()函數進(jìn)行了調用。

至此兩個(gè)驅動(dòng)代碼就編寫(xiě)完成了,代碼較為簡(jiǎn)單,實(shí)現了內核模塊符號的導出和導出符號的使用,具體的驅動(dòng)加載運行測試會(huì )在下個(gè)小節進(jìn)行。

6.3 運行測試

6.3.1 編譯驅動(dòng)程序

在mathmodule.c和hello.c的同一目錄下創(chuàng )建Makefile文件,Makefile文件內容如下(圖6-4)所示:

對于Makefile的內容注釋已在上圖進(jìn)行添加,這里要注意的是在hello.c代碼中使用了mathmodule.c所導出的符號,所以mathmodule.c要在hello.c之前進(jìn)行編譯,即第3行和第4行順序不能交換。保存退出之后,來(lái)到相應的文件目錄下,如下圖(圖6-5)所示:

然后使用命令“make”進(jìn)行驅動(dòng)的編譯,編譯完成如下圖(圖6-6)所示:

編譯完后會(huì )生成hello.ko和mathmodule.ko目標文件,如下圖(圖6-7)所示:

至此我們的驅動(dòng)模塊就編譯成功了,下面進(jìn)行驅動(dòng)的加載運行測試。


可以看到 hello.ko驅動(dòng)加載的時(shí)候,mathmodule.ko模塊中定義的num參數值和調用sum()函數的后正確的返回值都被打印了出來(lái)。至此內核模塊符號導出實(shí)驗就完成了。

最后可以輸入以下命令進(jìn)行驅動(dòng)的卸載,如下圖(圖6-9)所示:

注意:由于hello.ko文件使用了mathmodule.ko導出的符號,所以要先卸載hello.ko,卸載完成之后再卸載mathmodule.ko。

更多內容可以關(guān)注北京迅為電子


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: 開(kāi)發(fā)板

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>