模塊參數與符號

模塊參數

module_param(name,type, perm);
module_param_array(name, type, num, perm);
perm表示該參數在sysfs文件系統中所對應的文件節點的屬性;你應該使用<linux/stat.h>中定義的權限值;這個值決定誰可以存取這些模塊參數在sysfs文件系統中的表示;當perm爲0時,表示此參數不存在sysfs文件系統下對應的文件節點;否則,模塊被加載後,在/sys/module/目錄下將會出現以此模塊名命名的目錄,帶有給定的權限;在該目錄下,有一個parameters子目錄,在裏面每個文件對應一個參數,參數值就在以該參數名命名的文件中。
注意:如果一個參數被sysfs修改了,那麼你的模塊看到的參數值也被修改了,但是你的模塊不會收到任何通知;你應當不要使模塊參數可寫,除非你準備好檢測這個改變並因而作出反應。

模塊符號

EXPORT_SYMBOL標籤內定義的函數對全部內核代碼公開,不用修改內核代碼就可以在您的內核模塊中直接調用。

加入B中調用A中導出函數
[1] 在模塊A中c文件或者頭文件中使用EXPORT_SYMBOL(xxxx)導出函數.有些需要添加編譯選項-DEXPORT_SYMTAB.
[2] 在模塊B中用"extern" 申明函數(如, extern int xxxx);申明以後就能夠直接使用導出的函數了。
另外:在導出函數以後,可以使用 cat  proc/kallsyms來查看所有的導出符號,其中屬性爲t的標識是不能被調用的,所以如果導出符號是t類型,那麼無法直接被其他模塊使用。
無法導出問題解決
方法一:在A模塊編譯好後會生成符號表文件Module_symvers,裏面有函數地址和函數名對應關係,把這個文件拷貝到需要調用的B的源代碼下,替換B的該文件。
然後重新編譯B模塊.這樣就能夠讓B調用A的函數,以後加載模塊順序也必須先A後B,卸載相反。
方法二:將兩個模塊放在一個目錄下,進行編譯。其實和方法一類似。
這樣就能夠成功的實現兩個模塊之間的函數調用,比如KVM如果需要和驅動模塊相互調用,就能使用這個方法。如果是兩個模塊之間需要相互調用,可以讓驅動模塊函數導出,KVM模塊將函數指針當做回調函數傳給驅動,是想雙方的函數調用通訊。
/*
* 內核符號導出 給其他模塊使用 使用前要申明一下
* 另外從 /proc/kallsyms 可以查看內核符號表的相關信息(eg.所在內存地址)
* eg. cat /proc/kallsyms | grep integar
*/
 
#include<linux/init.h>
 #include<linux/module.h>

 MODULE_LICENSE("Dual BSD/GPL");

 static int __init symbol_init(void)
 {
 printk("<0> symbol_init\n");
 return 0;
 }
 int add_integar(int a, int b)
 {
 return (a + b);
 }

 int sub_integar(int a, int b)
 {
 return (a - b);
 }

 static void __exit symbol_exit(void)
 {
 printk("<0> symbol_exit\n");
 }
 EXPORT_SYMBOL(add_integar);
 EXPORT_SYMBOL(sub_integar);
 module_init(symbol_init);
 module_exit(symbol_exit);

/*
*使用其他內核模塊導出的符號
*/
 
#include<linux/module.h>
 #include<linux/init.h>
 extern int add_integar(int, int);
 extern int sub_integar(int, int);

 MODULE_LICENSE("GPL");

 static int __init use_symbol_init(void)
 {
 printk("<0> use_symbol_init");
 printk("<0> 1+2 = %d\n",add_integar(1,2));
 printk("<0> 3-2 = %d\n",sub_integar(3,2));
 return 0;
 }

 static void __exit use_symbol_exit(void)
 {
 printk("<0> Module exit!\n");
 }
 module_init(use_symbol_init);
 module_exit(use_symbol_exit);

發佈了77 篇原創文章 · 獲贊 13 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章