蓬莱做网站价格,必分享 wordpress主题,西安网约车租赁公司哪家好,常州快速建站模板EXPORT_SYMBOL只出现在2.6内核中#xff0c;在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的#xff0c; 都不用EXPORT_SYMBOL() 做标记的。2.6就必须用EXPORT_SYMBOL() 来导出来#xff08;因为2.6默认不到处所有的符号#xff09;。 1、EXPORT_SYMBOL的… EXPORT_SYMBOL只出现在2.6内核中在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的 都不用EXPORT_SYMBOL() 做标记的。2.6就必须用EXPORT_SYMBOL() 来导出来因为2.6默认不到处所有的符号。 1、EXPORT_SYMBOL的作用EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开不用修改内核代码就可以在您的内核模块中直接调用即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。 这里要和System.map做一下对比System.map 中的是连接时的函数地址。连接完成以后在2.6内核运行过程中是不知道哪个符号在哪个地址的。EXPORT_SYMBOL 的符号 是把这些符号和对应的地址保存起来在内核运行的过程中可以找到这些符号对应的地址。 而模块在加载过程中其本质就是能动态连接到内核如果在模块中引用了内核或其它模块的符号就要EXPORT_SYMBOL这些符号这样才能找到对应的地址连接。 使用方法 第一、在模块函数定义之后使用EXPORT_SYMBOL函数名 第二、在掉用该函数的模块中使用extern对之声明 第三、首先加载定义该函数的模块再加载调用该函数的模块 另外在编译调用某导出函数的模块时往往会有WARNING: [] undefined!使用dmesg命令后会看到相同的信息。开始我以为只要有这个错误就不能加载模块后来上网查了一下发现这主要是因为在编译连接的时候还没有和内核打交道当然找不到symbol了但是由于你生成的是一个内核模块所以LD不提示error而是给出一个warning寄希望于在insmod的时候内核能够把这个symbol连接上。 一个模块mod1中定义一个函数func1在另外一个模块mod2中定义一个函数func2func2调用func1。
在模块mod1中EXPORT_SYMBOL(func1);
在模块mod2中extern int func1();
就可以在mod2中调用func1了 EXPORT_SYMBOL示范 比如有两个驱动模块Module A和Module B其中Module B使用了Module A中的export的函数因此在Module B的Makefile文件中必须添加 KBUILD_EXTRA_SYMBOLS /path/to/ModuleA/Module.symvers export KBUILD_EXTRA_SYMBOLS 这样在编译Module B时才不会出现Warning提示说func1这个符号找不到而导致编译得到的ko加载时也会出错。 // Module A (mod_a.c)
#includelinux/init.h
#includelinux/module.h
#includelinux/kernel.h static int func1(void)
{ printk(In Func: %s...\n,__func__); return 0;
} // Export symbol func1
EXPORT_SYMBOL(func1); static int __init hello_init(void)
{ printk(Module 1say hello world!\n); return 0;
} static void __exit hello_exit(void)
{ printk(Module 1,Exit!\n);
} module_init(hello_init);
module_exit(hello_exit); // Module B (mod_b.c)
#includelinux/init.h
#includelinux/kernel.h
#includelinux/module.h
extern int functl(void);
static int func2(void)
{ func1(); printk(In Func: %s...\n,__func__); return 0;
} static int __init hello_init(void)
{ printk(Module 2,is used Module 1 function!\n); func2(); return 0;
} static void __exit hello_exit(void)
{ printk(Module 2,Exit!\n);
} module_init(hello_init);
module_exit(hello_exit); 在驱动加载的时候一定要先加载定义function1的Module A模块然后再加载调用function1的Module B的驱动模块。 如下操作 insmod Module_A.ko
insmod Module_B.ko 转载于:https://www.cnblogs.com/Caden-liu8888/p/7725293.html