7

struct classLinux カーネル モジュール内の既存のデバイス クラス ( ) のポインターを取得する

こんにちは、みんな!

デバイスを既存のデバイス クラスに登録しようとしていますが、既存のクラスへのポインターを取得できません。カーネルのバージョンは Linux 3.3.6 です。モジュールにクラスを作成し、そのポインターを取得してから、それを使用してデバイスを登録できます。

*cl = class_create(THIS_MODULE, className);
dev_ret = device_create(*cl, NULL, *dev, NULL, driverName);

ただし、同じクラスの別のデバイスを別のモジュールに登録する必要がありますが、既存のクラスへのポインターを取得する方法が見つかりませんでした。class_createまた、クラスが既に存在するため、が必要とするクラスへのポインターではなく NULL を返すため、他のモジュールでクラスを再度作成することはできませんdevice_create。私が見つけた:

http://lwn.net/Articles/102500/

名前でクラスへのポインタを返す関数:

struct class * class_find(char * name)

ただし、関数コンパイラをコンパイルしようとすると、存在しないと表示されます。この関数はカーネルによってエクスポートされていると思いました (私のモジュールにはライセンス GPL があります) が、そうではないようです。たぶん、ヘッダーを含める必要がありますか?

そのコードは上記のリンクにリストされているため、この関数を書き直そうとしました。しかし、次のように反復しようとするclass_subsysと:

list_for_each_entry(this_class, &class_subsys.kset.list, subsys.kset.kobj.entry)

現在、シンボルclass_subsysは見つかりません。繰り返しますが、カーネルにエクスポートされていると思いました。

何が欠けているのかわかりません。何かのヘッダー?私はそれを間違った方法でやっていますか?それを行う別の機能はありますか?

最初からトラバースできればsysfs、既存のクラスへのポインターを取得できると思います。しかし、トラバースを開始する方法も見つかりませんでしたsysfs。私が見たすべての関数は、トラバースへのポインタkobjectまたはksetトラバースを開始する必要があります。しかし、カーネル オブジェクトのルートへのポインターすら持っていないsysfsため、ツリーをたどってクラス ポインターを取得することはできません。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

入力コアはこのように行われていると思います。ここにスニペットがあります

見てみましょう: https://github.com/torvalds/linux/blob/master/drivers/input/input.c#L1720

よろしくお願いします!

于 2014-01-08T15:44:06.087 に答える