おもいきりミクロでセめてみる
2.6 から導入されたデバイスモデルなソレは、詳解 Linux カーネルの 3 版には記述あり。Linux カーネル 2.6 解読室には現時点で確認できていない。LDD3 の PDF 版では chapter 14 にその記述を発見 (今から見てみる)。
で、LKH-jp 方面に情報投入してみるか、と言いつつ 8139too なドライバのエントリポイントで呼びだされている pci-register-driver (driver/pci/pci-driver.c) から呼びだされている driver_register (driver/base/driver.c) から呼びだされている bus_add_driver (driver/base/bus.c) の先頭部分
struct bus_type * bus = get_bus(drv->bus);
のこの処理を掘り下げている内にドツボにはまりかける。ここ、遠く長いタビの出発点と言っても過言ではないかもしれません。(何
ただ、このあたりの処理をきちんとチェックする事によって 2.6 カーネルから導入されたドライバモデルというフレームワーク(??)が理解できれば、正にタナからぼた餅かも。このままホッてみた結果のみを以下に列挙してみる。
まず、get_bus の定義が以下 (drivers/bus.c)
struct bus_type * get_bus(struct bus_type * bus) { return bus ? container_of(subsys_get(&bus->subsys), struct bus_type, subsys) : NULL; }
container_of については LKH-jp に分かりやすい解説あり。又、この解説によれば、上記の container_of に渡している最初の引数は struct list_head へのポインタになっているはず、という事になる。
ってか、struct bus_type へのポインタを渡して struct bus_type へのポインタを取得する関数って一体どーゆー意味なんだろうか。とりあえずこのあたりはスルーとして、ホリ下げてみる。次は subsys_get ですが include/linux/kobject.h にて以下の定義。
static inline struct subsystem * subsys_get(struct subsystem * s) { return s ? container_of(kset_get(&s->kset),struct subsystem,kset) : NULL; }
これ、羅列しても意味ないのかなぁ。とりあえず列挙だけしておいて使われている構造体の関連を調べてみるのは良いかもしれない。という事でこのままツキ進む。次は kset_get (include/linux/kobject.h)。
static inline struct kset * kset_get(struct kset * k) { return k ? to_kset(kobject_get(&k->kobj)) : NULL; }
なんか玉ネギのカワを剥いでる感じ。あ、これで終わりか。to_kset はこの inline 関数の直上で定義。
static inline struct kset * to_kset(struct kobject * kobj) { return kobj ? container_of(kobj,struct kset,kobj) : NULL; }
あるいは、kobjext_get はどうかと言うとこれは lib/kobject.c にて定義。
/** * kobject_get - increment refcount for object. * @kobj: object. */ struct kobject * kobject_get(struct kobject * kobj) { if (kobj) kref_get(&kobj->kref); return kobj; }
これが最後か、と言いつつ kref_get は lib/kref.c にて定義。コメント付きで引用を。
/** * kref_get - increment refcount for object. * @kref: object. */ void kref_get(struct kref *kref) { WARN_ON(!atomic_read(&kref->refcount)); atomic_inc(&kref->refcount); }
うーむ。整理が必要なのは分かってるんですが、今日はこれでストップ。(を
追記
む。LDD3 の chapter 14 に bus_add_driver が何をするか、が列挙されているな。Add a Driver の項です。うーん。このドライバモデルというソレの階層を考えるに、バスが一番最初に認識が必要でその次がデバイスで、次がドライバ、という順なのか。違うかな。もう少しきちんと chapter 14 読んだ方が良さげ。