Mar*_*ter 18
您将需要EXPORT_SYMBOL(或EXPORT_SYMBOL_GPL)宏.例如:
/* mod1.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
....
void mod1_foo(void)
{
printk(KERN_ALERT "mod1_foo\n");
}
EXPORT_SYMBOL(mod1_foo);
/* mod2.h */
....
extern void mod1_foo(void);
....
/* mod2.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
#include "mod2.h"
int init_module(void)
{
mod1_foo();
...
Run Code Online (Sandbox Code Playgroud)
这应该是一帆风顺的,但你必须小心命名空间 - 踩到别人的内核模块符号会很不幸.
你忘了提到你还应该研究try_module_get/module_put/symbol_get/symbol_put/symbol_request,以确保其他模块的加载,以及在使用过程中不会卸载的事实。我不记得确切的细节了;我认为 modprobe 将确保加载另一个模块,但我不确定是否会添加卸载的运行时依赖项。我猜在其他一些情况下可能需要这些 API,但需要了解它们以进行检查。
顺便说一句,免费书籍 Linux 设备驱动程序可以在这里找到,它将回答这个问题以及更多:http : //lwn.net/Kernel/LDD3/
| 归档时间: |
|
| 查看次数: |
14705 次 |
| 最近记录: |