Linuxドライバーモジュールの呼び出しを記述する/別のドライバーモジュールを使用する方法
質問
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/
所属していません StackOverflow