Linuxドライバーモジュールの呼び出しを記述する/別のドライバーモジュールを使用する方法

StackOverflow https://stackoverflow.com/questions/413955

質問

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/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top