内核符号表引入
驱动程序可以编译成内核模块,也就是KO文件。每个KO文件是相互独立的,也就是说模块之间无法互相访问。但是在某些使用场、要互相访问,如B模块要用A模块中的函数。(B模块依赖于A模块)这时候我们要怎么做呢?
什么是符号表?
所谓“符号"就是内核中的函数名,全局变量名等。符号表就是用来记录这些“符号"的文件。
内核符号表导出
模块可以使用一下宏EXPORT_SYMBOL和EXPORT_SYMBOL_GPL导出符号到内核符号表中。
如:
EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名);//只适用于包含GPL许可的模块。
导出去的符号可以被其他模块使用。使用前只需要声明一下即可。
实现
a.c
#include <linux/module.h> #include <linux/init.h> extern int add_test(int a,int b); int add_test(int a,int b){ return (a+b); } EXPORT_SYMBOL(add_test); static int hello_init(void){ printk("hello init!!!\n"); return 0; } static void hello_exit(void){ printk("hello exit!!!\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("Paranoid"); MODULE_VERSION("V1.0"); MODULE_LICENSE("GPL");
查看符号表
编译被依赖的模块后,将生成的符号表文件复制到依赖模块所在文件夹,再编译另一个模块
b.c
#include <linux/module.h> #include <linux/init.h> extern int add_test(int a,int b); static int hello_init(void){ int a; a = add_test(1,2); printk("add:%d\n",a); printk("hello init!!!\n"); return 0; } static void hello_exit(void){ printk("hello exit!!!\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("Paranoid"); MODULE_VERSION("V1.0"); MODULE_LICENSE("GPL");
结果