struct class
Linux カーネル モジュール内の既存のデバイス クラス ( ) のポインターを取得する
こんにちは、みんな!
デバイスを既存のデバイス クラスに登録しようとしていますが、既存のクラスへのポインターを取得できません。カーネルのバージョンは 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
ため、ツリーをたどってクラス ポインターを取得することはできません。
誰かが私を正しい方向に向けることができますか?