Linuxの備忘録とか・・・(目次へ)Linuxの備忘録とか・・・(目次へ)sysfsとksetカーネルは管理するデバイスドライバのようなオブジェクトを、カテゴリ毎の階層的に管理しています。カテゴリ毎に統合することで同じ処理を共有化でき、階層化することで、親子関係で必要とするオブジェクトを管理することができます。この構造をユーザ空間にエクスポートしているのが/sysとなります。/sys下のディレクトリがオブジェクトそのもので、配下のファイルがそのオブジェクトの属性となります。配下にディレクトリがある場合、それはそのオブジェクトの子オブジェクトということです。この処理を管理するのが、kobjectです。オブジェクト毎の構造体内にkobjectを埋め込むことで、オブジェクト内に異なった処理をトランスペアレントに管理しています。親子関係のオブジェクトを作成する場合、ksetが使われます。ksetそのものもkobjectをリストするkobjectで、ksetを登録すると言うことはkobjectを登録することと同じです。配下のオブジェクトはksetにリストされているので、子オブジェクト(ディレクトリ)の取得は、sysfsに依存することなく、ksetをヘッドとするリストを捜査することで行えます。kobjectを登録すると、登録した/sys下のディレクトリにkobjectのディレクトリが作成され、その配下に、kobj_typeに設定するattrが、ファイルとして作成され、read/writeのコールバックとして、kobj_typeのコールバックがコールされます。以下は、sysとkobj/ksetの関連性の理解するのに特化したサンプルです。kset_create_and_add()でksetをkset_hogeディレクトリで、kernel_kobj下に作成します。kset_hogeオブジェクトのコールバック/属性が必要なら、第二引数(NULL)に、kobj_typeを設定します。kobject_init_and_add()で、kobj(hoge)を登録するのですが、親オブジェクトの第二引数がNULLとしています。hoge_ksetとするksetが親となります。ksetの設定がないkobjectの登録は親となる第二引数を設定する必要があります。attributeコンテナにコールバックを設定することで、属性(ファイル)毎に指定したコールバック関数をコールすることができます。.sysfs_opsの.show/.storeコールバック関数内で、所定のattrコールバック関数がコールされるようにする必要があります。"hoge");と1つしかkset配下に登録していませんが、別のkobjを作成し、そのksetにhoge_ksetを設定して登録することで、随時kset配下のオブジェクトに登録されていくわけです。下記はカーネルソースにインプリメントされている、実務にそったksetの使用例です。/sts/kerneにkset_sampleを作成し、kobjとしてfoo/bar/bazを、その属性としてそれぞれにfoo/bar/bazを作成します。kobjをfoo_objに埋め込み、attributeをfoo_attributeに埋め込んで、sysfs_opのコールバック.show/.storeで、引数はkobj/attr故、container_of()マクロでfoo_obj/foo_attributeを取得、foo_attributeに設定されている独自のコールバック関数をコールします。ノースAdsense広告情報が設定されていません。