EXPORT_SYMBOL只出如今2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 作标记的。
2.6就必须用EXPORT_SYMBOL() 来导出来(由于2.6默认不处处全部的符号)。
一、EXPORT_SYMBOL的做用是什么?
EXPORT_SYMBOL标签内定义的函数或者符号对所有内核代码公开,不用修改内核代码就能够在您的内核模块中直接调用,即便用EXPORT_SYMBOL能够将一个函数以符号的方式导出给其余模块使用。
这里要和System.map作一下对比:
System.map 中的是链接时的函数地址。链接完成之后,在2.6内核运行过程当中,是不知道哪一个符号在哪一个地址的。
EXPORT_SYMBOL 的符号, 是把这些符号和对应的地址保存起来,在内核运行的过程当中,能够找到这些符号对应的地址。而模块在加载过程当中,其本质就是能动态链接到内核,若是在模块中引用了内核或其它模块的符号,就要EXPORT_SYMBOL这些符号,这样才能找到对应的地址链接。
二、使用方法
第1、在模块函数定义以后使用EXPORT_SYMBOL(函数名)
第2、在调用该函数的模块中使用extern对之声明
第3、首先加载定义该函数的模块,再加载调用该函数的模块
函数