我正在开发一个Linux驱动程序可加载模块,我必须在我的驱动程序中使用另一个设备。(驱动程序堆叠在另一个驱动程序上)
如何在驱动程序中调用/使用其他驱动程序?我认为它们都在内核中,所以可能有一种方法可以直接使用另一个驱动程序。
答案 0 :(得分:17)
您需要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();
...
这应该是一帆风顺的,但你必须小心命名空间 - 踩到别人的内核模块符号会很不幸。
答案 1 :(得分:4)
您忘了提到您还应该学习try_module_get / module_put / symbol_get / symbol_put / symbol_request,以确保加载其他模块,以及在使用过程中不卸载它的事实。我不记得确切的细节;我认为modprobe将确保加载其他模块,但我不确定是否会添加卸载的运行时依赖项。我想其他一些案例可能需要这些API,但需要了解它们来检查它。
顺便说一句,这里有免费的Linux设备驱动程序,它将回答这个问题以及更多: http://lwn.net/Kernel/LDD3/