當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Linux字符設(shè)備驅(qū)動模型之Linux內(nèi)核模塊參數(shù)
在Linux內(nèi)核驅(qū)動中,難免的兩個內(nèi)核模塊之間具有依賴關(guān)系,他們或許是通過進行某種傳參,獲取進行函數(shù)之間的調(diào)用。因為每一個模塊在Linux系統(tǒng)Kernel中是相對獨立的,所以Linux內(nèi)核驅(qū)動模塊之間進行通信就不能直接使用函數(shù)調(diào)用等方式了。
一、Linux內(nèi)核模塊參數(shù)
在上文中已經(jīng)給出了一個簡單的Linux內(nèi)核驅(qū)動模塊的模板了。那么我們在這個模板上進行添加代碼。
如上圖所示即為所使用代碼。定義全局變量static int a和static char *str。在Linux內(nèi)核中使用宏module_param聲明這兩個參數(shù)作為內(nèi)核參數(shù)進行傳遞。宏module_param的三個參數(shù)分別代表參數(shù)變量本身、變量的類型和此參數(shù)的使用權(quán)限。后當(dāng)內(nèi)核模塊插入成功,同樣在static int __init hello_init(void)函數(shù)中將這兩個參數(shù)進行打印。
將其編譯生成Linux內(nèi)核驅(qū)動文件hello_driver.ko。將其拷貝到板卡根文件系統(tǒng)中。后使用命令insmod hello_driver.ko裝載驅(qū)動模塊hello_driver。如下圖:
如上圖,當(dāng)驅(qū)動模塊裝載成功后,會有相應(yīng)的打印輸出,但這并未體現(xiàn)出Linux內(nèi)核模塊參數(shù)的特點。
二、Linux內(nèi)核模塊參數(shù)之間的通信
實際上Linux內(nèi)核模塊參數(shù)的特性應(yīng)該體現(xiàn)在內(nèi)核驅(qū)動模塊之間的通信或者調(diào)用。現(xiàn)在將實現(xiàn)兩個Linux內(nèi)核驅(qū)動模塊,然后進行調(diào)用。
模塊一:文件名-----add_sub_driver.c和add_sub_driver.h
add_sub_driver.c
如上圖即為add_sub_driver.c驅(qū)動模塊的代碼,其所做的事非常簡單,實現(xiàn)兩個參數(shù)之間的和(int add_int(int i, int j))和差(int sub_int(int i, int j))。后通過EXPORT_SYMBOL模塊導(dǎo)出符將相應(yīng)的函數(shù)導(dǎo)入到內(nèi)核符號表中,可供Linux內(nèi)核其他驅(qū)動模塊進行調(diào)用。
add_sub_driver.h文件:
模塊二:文件名-----hello_driver.c和add_sub_driver.h
hello_driver.c文件:
hello_driver.c文件Demo是在上一個實驗上擴展的,如下圖:
如上圖,定義兩個全局變量,通過宏module_param聲明其為內(nèi)核模塊參數(shù)傳遞,后通過在hello_driver內(nèi)核模塊加載時進行調(diào)用add_sub_driver內(nèi)核模塊的實現(xiàn)方法函數(shù),兩個變量作為參數(shù)傳遞。實現(xiàn)兩個Linux內(nèi)核模塊之間的通信。后使用printk將調(diào)試信息打印。
編譯管理工具Makefile:
如上圖為編譯所使用的Makefile文件。其可以同時編譯出hello_driver內(nèi)核模塊hello_driver.ko和add_sub_driver內(nèi)核模塊add_sub_driver.ko。
三、Linux內(nèi)核模塊通信驗證
將編譯生成的hello_driver.ko和add_sub_driver.ko文件拷貝到板卡根文件系統(tǒng)中。然后相序插入內(nèi)核模塊。
方式一:先加載hello_driver.ko后加載add_sub_driver.ko
如上圖可知,當(dāng)先加載hello_driver.ko時,加載失敗,報錯:不能插入hello_driver.ko,其中包含有無效的參數(shù)。
方式二:先加載add_sub_driver.ko后加載hello_driver.ko
如上圖可知,當(dāng)先加載add_sub_driver.ko后加載hello_driver.ko時,直接加載成功。原因是add_sub_driver.ko驅(qū)動模塊中存在hello_driver.ko驅(qū)動模塊加載時所做運算的運算方法函數(shù)。當(dāng)add_sub_driver.ko模塊沒有被加載時,加載hello_driver.ko會在不到實現(xiàn)運算的方法,所以加載失敗。