16

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

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

4

2 回答 2

20

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

这应该是一帆风顺的,但您当然必须小心命名空间 - 踩在别人的内核模块符号上会很不幸。

于 2009-01-05T19:02:06.283 回答
5

你忘了说你还应该研究try_module_get/module_put/symbol_get/symbol_put/symbol_request,以确保加载另一个模块,以及在使用过程中不卸载它的事实。我不记得确切的细节;我认为 modprobe 将确保加载其他模块,但我不确定是否会添加用于卸载的运行时依赖项。我猜在其他情况下可能需要这些 API,但需要了解它们才能检查。

顺便说一句,免费书籍 Linux 设备驱动程序可在此处获得,它将回答这个问题等等: http: //lwn.net/Kernel/LDD3/

于 2009-01-12T10:34:57.933 回答