このページの目次
デバイスモデル
カバー範囲: kobject/kset → device/driver/bus/class → sysfs バインディング → probe ライフサイクル → udev → デバイスツリー (DT) → ACPI → platform device カーネルバージョン: 2.6 ~ 6.x
概要
Linux デバイスモデルは、すべてのデバイス、ドライバ、バスに対して統一された表現とライフサイクル管理を提供するカーネル内部のフレームワークです。その真の価値は「デバイスがどのように動作するか」ではなく、「デバイスとドライバがどのように互いを見つけるか」、すなわちデバイス-ドライバのバインディング (device-driver binding) にあります。
kobject: 基本構成要素
// include/linux/kobject.h
;
// kobject 自体はデバイスマネジメントを行いません。以下を提供します:
// 1. sysfs 内のディレクトリ/ファイル表現
// 2. リファレンスカウント → 自動解放
// 3. 親-子の階層関係
kset: kobject の集合
;
// 例: /sys/devices/ → devices_kset
// /sys/bus/ → bus_kset
Device / Driver / Bus
struct device
// include/linux/device.h
;
struct device_driver
;
struct bus_type
;
バインディングフロー
// drivers/base/dd.c
// デバイス登録:
→
→ // bus->p->klist_devices にアタッチ
→
→
→
→ // 登録済みドライバをすべて列挙
→ // bus->match() または of_match/acpi_match
→
→
→
→ → drv->
重要: バインディングは双方向です。新しいデバイスが現れた場合はドライバを列挙し、新しいドライバが登録された場合はデバイスを列挙します。どちらが先に登録されても、マッチングは発生します。
sysfs と属性
// /sys 下の各ディレクトリ = 1つの kobject
// 属性ファイル = struct device_attribute
;
// マクロ: DEVICE_ATTR_RO(name) → 読み取り専用属性を生成
// DEVICE_ATTR_WO(name) → 書き込み専用
// DEVICE_ATTR_RW(name) → 読み書き両対応
Device Tree vs ACPI
udev
参考
- ソースコード:
drivers/base/core.c,drivers/base/bus.c,drivers/base/dd.c,include/linux/device.h - カーネルドキュメント:
Documentation/driver-api/driver-model/
キーワード: kobject, device, driver, bus, probe, sysfs, device tree, ACPI, udev, modalias