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