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