如何编写Linux驱动程序模块调用/使用另一个驱动程序模块?

我正在开发一个Linux驱动程序可加载模块,我必须在我的驱动程序中使用另一个设备(驱动程序堆叠在另一个驱动程序上)

如何在我的驱动程序中调用/使用另一个驱动程序? 我认为他们都在内核中,所以可能有一种方法可以直接使用另一个驱动程序。

Solutions Collecting From Web of "如何编写Linux驱动程序模块调用/使用另一个驱动程序模块?"

您将需要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(); ... 

这应该是一帆风顺的,但是你当然必须小心使用命名空间 – 跺脚别人的内核模块符号将是不幸的。

您忘记提及您还应该学习try_module_get / module_put / symbol_get / symbol_put / symbol_request,以确保加载其他模块,并且在使用过程中不会卸载。 我不记得确切的细节, 我认为,modprobe将确保其他模块加载,但我不知道是否将添加卸载的运行时依赖。 我想这些API可能需要一些其他的情况下,但需要知道他们检查这一点。

顺便说一句,免费的书Linux设备驱动程序可在这里,它会回答这个问题,更: http : //lwn.net/coreel/LDD3/