驱动程序可以编译成内核文件,就是KO文件,每个Ko文件时相互独立的,模块之间无法相互访问,但是某些场景下可能需要互相访问,例如B模块要引用A模块里的函数,就需要用到符号表;
什么是符号?
符号就是内核中的函数名、全局定义的一些变量;
符号表:记录符号的文件;
内核符号表如何导出:
使用宏 EXPORT_SYMBOL 和 EXPORT_SYMBOL_GPL 导出符号到内核符号表中
导出的符号可以被其他模块使用;
使用前需要声明一下;
a.ko
#include <linux/module.h>
#include <linux/init.h>
int add(int a,int b)
{
return a+b;
}
EXPORT_SYMBOL(add);
static int hello_init(void)
{
printk("hello word init");
return 0;
}
static void hello_exit(void)
{
printk("hello word exit");
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SONG");
MODULE_VERSION("v1.0");
b.ko
#include <linux/module.h>
#include <linux/init.h>
extern int add(int a,int b);
static int hello_init(void)
{
printk("hello word init");
printk("a+b",add(1,3));
return 0;
}
static void hello_exit(void)
{
printk("hello word exit");
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SONG");
MODULE_VERSION("v1.0");
先加载a.ko 后加载b.ko