driverfs / sysfs

2.6正式版のリリースは近い。 今回は、2.5/2.6の新機能の中であまり取り上げられる事が無いが、重要な役割を持つsysfsと新しいドライバ・モデルについて取り上げる。

新しいドライバ・モデル

すでにリリース済のカーネル2.5.44では、新機能の追加が凍結され、カーネル2.6のリリースに向けた安定化活動が行われているのは、周知の通りである。そして次期カーネルで追加される新機能の内容も明らかになって来ているが、新しいドライバ・モデルの導入に関しては、あまり知られていないかも知れない。

次期カーネルでは、アーキテクチャは大きく変わらないため、デバイスドライバの多くは、再コンパイルするだけで動作するのだが、カーネル内での広い意味での(実際にデバイスを持たないものも含めた)ドライバ・モジュールの扱われ方が、徐々に変わろうとしている。古いインタフェイスもそのままサポートしながら、より新しく、洗練されたモデルが導入される事になるからである。

sysfs

Patrick Mochelは新しいドライバ・モデルの導入と、それに伴うkobjectとsysfsの実装を担当するという重要な役割を負っている。彼はまた、ACPI等のPower Managementの実装担当者でもある。ここで重要な事は、kobjectとsysfsはオプションではなく、必ずカーネルに入っているという点である。例えば2.5系カーネルで、

# mkdir /sys  # (すでにマウント用ディレクトリが存在する場合には不要)
# mount -t sysfs sysfs /sys

とタイプすれば、デバイスドライバ情報、ドライバクラス情報、バス情報を含めたsysfs全体が/sysディレクトリの下にマウントされ、次の例のように参照できる。

# ls /sys/bus/usb/*
/sys/bus/usb/devices:
1-0:0  2-0:0  3-0:0  4-0:0  usb1  usb2  usb3  usb4

/sys/bus/usb/drivers:
hid  hiddev  hub  usb  usbfs

またfstabに以下のように記述して、常時参照する事も可能である。

none    /sys    sysfs    defaults   0  0

このsysfsは、procfsやusbdevfs等と同様な、仮想的なファイルシステムを提供する機構で、その特徴から最近まではdriverfsと呼ばれて来た。driverfs は、2.5.44から全面的に呼び名と、ソース上のシンボルがsysfsに変わった。

sysfsでは、カーネル内の全てのドライバを統一的に、ツリー構造で表示し、リンクを操作できるインタフェイスを提供する。これはkobject機構によって実現されている。kobjectは文字通りKernel Objectの略だが、カーネル2.5になってローダブル・モジュールの拡張子が「.o」から「.ko」に変わったのとも関係しているかも知れない。

procfsは古くから、カーネル内モジュールやデバイスドライバの便利なインタフェイスとして広く利用されているが、利便さゆえに/proc以下のディレクトリは、無秩序に広がって来ている。sysfsではデバイスドライバやカーネル内モジュールに対して、この問題を解決する手段を提供する役割も持っている。即ち従来のprocfsのインタフェイスから、sysfsのインタフェイスへの移行が推奨されている訳である。

インタフェイスに秩序が与えられる事は、利用者には助かる事だが、開発者にとっては、新しい仕事が増える事になる。つまり、カーネル側にすでにインタフェイスは用意されているが、それを使用したドライバの例はまだ少ない。新しいドライバ・モデルのドキュメントが未整理な事もあり、実装例としては、今年1月にPatchが投稿されたcpufreqを始め、一部しかまだ対応されていない。Patrick Mochelは、少なくともPCI、SCSI、USB等のバス・ドライバに関しては新しいモデルに書き換え(その変更量はそれほど多く無いらしい)が必要だと考えているが、現在まだ作業中のようである。

kobject

kobjectはsysfsを提供するインフラである。本質的にはsysfsと同じものであり、従来の様々なドライバ・モデルを統一させるための枠組みを提供する、新しいドライバ・モデルの根幹である。これはデバイスのデータと操作のセットを、グローバルにアクセス可能なデータ構造にまとめる事により、特にブリッジやデバイスのためのバス型ドライバの強化を意図したものである。

kobjectが実現するドライバ・モデルに関して知るためのヒントとしては、USBに代表される近年のコネクティビティが持つ、シームレスなプラグアンドプレイ、パワー・マネージメント、およびホット・プラグ機能の実現、階層化されたクラスの概念がある。このような操作は、全てのバスでサポートされていないが、今後は操作をサポートしないバスが、例外として扱われるようになる。kobjectに関するカーネル内でのさらに詳しいトピックスは、別の機会に取り上げたい。