RK3568驅(qū)動指南|第一篇 驅(qū)動基礎(chǔ)-第6章 內(nèi)核模塊符號導(dǎo)出實(shí)驗(yàn)
EXPORT_SYMBOL(sym)和EXPORT_SYMBOL_GPL(sym)兩個宏使用方法相同,而EXPORT_SYMBOL_GPL(sym)導(dǎo)出的模塊只能被 GPL 許可的模塊使用,所以絕大多數(shù)的情況都使用EXPORT_SYMBOL(sym)進(jìn)行符號導(dǎo)出。sym為函數(shù)的唯一參數(shù),表示要導(dǎo)出的函數(shù)或變量名稱。
至此,關(guān)于內(nèi)核模塊符號導(dǎo)出函數(shù)就講解完成了,在下一小節(jié)中將會編寫兩個驅(qū)動代碼來進(jìn)行內(nèi)核模塊符號導(dǎo)出實(shí)驗(yàn)。
6.2 實(shí)驗(yàn)程序的編寫
本實(shí)驗(yàn)對應(yīng)的網(wǎng)盤路徑為:iTOP-RK3568開發(fā)板【底板V1.7版本】\03_【iTOP-RK3568開發(fā)板】指南教程\02_Linux驅(qū)動配套資料\04_Linux驅(qū)動例程\03。
本章實(shí)驗(yàn)將編寫Linux下的內(nèi)核模塊符號導(dǎo)出實(shí)例代碼,總共有兩個驅(qū)動程序,第一個驅(qū)動文件名為mathmodule.c,用來定義參數(shù)num和函數(shù)add(a,b),第二個驅(qū)動文件名為hello.c,會引用mathmodule.c驅(qū)動程序中的參數(shù)num和數(shù)學(xué)函數(shù)add(a,b),并將相應(yīng)的參數(shù)值和函數(shù)返回值打印到串口終端上。
編寫完成的mathmodule.c代碼如下(圖6-2)所示
以上代碼定義了一個int類型的num變量和add()數(shù)學(xué)函數(shù),并使用EXPORT_SYMBOL宏進(jìn)行導(dǎo)出。
編寫完成的hello.c代碼如下(圖6-3)所示:
程序?qū)肓薸nt類型的變量num和add()函數(shù),并在驅(qū)動入口函數(shù)中打印相應(yīng)了num的參數(shù)值并對add()函數(shù)進(jìn)行了調(diào)用。
至此兩個驅(qū)動代碼就編寫完成了,代碼較為簡單,實(shí)現(xiàn)了內(nèi)核模塊符號的導(dǎo)出和導(dǎo)出符號的使用,具體的驅(qū)動加載運(yùn)行測試會在下個小節(jié)進(jìn)行。
6.3 運(yùn)行測試
6.3.1 編譯驅(qū)動程序
在mathmodule.c和hello.c的同一目錄下創(chuàng)建Makefile文件,Makefile文件內(nèi)容如下(圖6-4)所示:
對于Makefile的內(nèi)容注釋已在上圖進(jìn)行添加,這里要注意的是在hello.c代碼中使用了mathmodule.c所導(dǎo)出的符號,所以mathmodule.c要在hello.c之前進(jìn)行編譯,即第3行和第4行順序不能交換。保存退出之后,來到相應(yīng)的文件目錄下,如下圖(圖6-5)所示:
然后使用命令“make”進(jìn)行驅(qū)動的編譯,編譯完成如下圖(圖6-6)所示:
編譯完后會生成hello.ko和mathmodule.ko目標(biāo)文件,如下圖(圖6-7)所示:
至此我們的驅(qū)動模塊就編譯成功了,下面進(jìn)行驅(qū)動的加載運(yùn)行測試。
可以看到 hello.ko驅(qū)動加載的時候,mathmodule.ko模塊中定義的num參數(shù)值和調(diào)用sum()函數(shù)的后正確的返回值都被打印了出來。至此內(nèi)核模塊符號導(dǎo)出實(shí)驗(yàn)就完成了。
最后可以輸入以下命令進(jìn)行驅(qū)動的卸載,如下圖(圖6-9)所示:
注意:由于hello.ko文件使用了mathmodule.ko導(dǎo)出的符號,所以要先卸載hello.ko,卸載完成之后再卸載mathmodule.ko。
更多內(nèi)容可以關(guān)注北京迅為電子
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。