模塊參數
模塊符號
加入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);