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 Device Drivers はこちらから入手でき、この質問やその他多くの質問に答えることができます: http://lwn.net/Kernel/LDD3/