SimpleDetect

むむ。日記にブランクが。
しかし開発にブランクがあったわけではなく。
ということで、ハードウェア自動検出ツールを開発。SimpleDetect。


PCIデバイスやUSBデバイスは、自分のVendorIDやDeviceIDをアナウンスしている。それらのIDと、カーネルのコンパイル時に作成されるmodules.pcimap(USBならmodules.usbmap)を照らし合わせると、読み込むべきドライバを決定できることが判明。接続されているPCIデバイスVendorIDやDeviceIDは、/proc/pciや/proc/bus/usb/devicesファイルに書いてある。テキスト処理だけでドライバを決定できる。


さらにpci.idsusb.idsも読み込めば、ベンダー名やデバイス名もわかる。これはVIVERの動作には関係ないけど、「検出されているぞ!」感があるので、読み込んで表示してみる。USBデバイスは自分でベンダー名やデバイス名をアナウンスしてくるので、usb.idsを調べなくてもわかるものの、PCIと同じコードを流用できるので、C++の継承の勉強を兼ねて作ってみる。protected:を使ったのは初めてだ…。

STLをふんだんに使う。ひたすら。std::stringもたくさん。非常に便利。


ちなみにParallelsのVM上で実行すると、以下のように検出される。

----
Vendor   0xaaaa : 
Device   0x1121 : 
Class    0x3    : Display controller
SubClass 0x0    : VGA compatible controller
Modules : 
----
Vendor   0xaaaa : 
Device   0x1112 : 
Class    0x6    : Bridge
SubClass 0x80   : Bridge
Modules : 
----
Vendor   0x10ec : Realtek Semiconductor Co., Ltd.
Device   0x8029 : RTL-8029(AS)
Class    0x2    : Network controller
SubClass 0x0    : Ethernet controller
Modules : ne2k-pci 
----
Vendor   0x8086 : Intel Corporation
Device   0x1130 : 82815 815 Chipset Host Bridge and Memory Controller Hub
Class    0x6    : Bridge
SubClass 0x0    : Host bridge
Modules : intel-agp 
----
Vendor   0x8086 : Intel Corporation
Device   0x2440 : 82801BA ISA Bridge (LPC)
Class    0x6    : Bridge
SubClass 0x1    : ISA bridge
Modules : ichxrom i8xx_tco tpm_atmel tpm_nsc 
----
Vendor   0x8086 : Intel Corporation
Device   0x244b : 82801BA IDE U100
Class    0x1    : Mass storage controller
SubClass 0x1    : IDE interface
Modules : 

Vendor 0xaaaaはParallelsが勝手に使っている模様。pci.idsに登録されていないので、ベンダー名は表示されない。
ISA Bridgeはドライバが良くわからないことになっている。そもそもISA Bridgeという時点で意味不明。Parallelsの問題か、SimpleDetectの問題か、あるいは歴史的な問題か。


「クラス」を検出できるのは使える。ストレージなのか、NICなのか、PCMCIAのコントローラがつながっているのか。PCMCIAコントローラがつながっているならcardmgrを開始する、というのは良い良い。つまりPCMCIAの口があるときは、PCMCIAの自動検出をする。
チップセットにコントローラが内蔵されていたらどうなんだろうか。たとえばチップセット内蔵のNICとか。PCIの自動検出では検出できないのか。あるいは、実は内部的にはPCIバスにつながっていることになっているとか?実機が要るな…



kudzuはPCIやUSBデバイスがアナウンスしてくる情報だけでなく、IDEなHDDからも情報を取ってくるらしく、/dev/以下にデバイスノードが無いときとあるときで、検出にかかる時間が全然違う。PCIデバイスからの情報だと「IDEコントローラチップ」の情報までしかわからないものの、/dev/hdaなども調べれば「HDDの種類」などまでわかる。が、そこまで要るのかと。「IDEバスに接続されているのがHDDなのかCDドライブなのか」は使える情報かもしれない。



とりあえずPCIとUSBが自動検出できれば、起動CDの場所とNICの検出には困らない。PCMCIAのNICはcardmgrを使う。FireWireのNICというのは…聞いたことない。IP over FireWireは、どうしようか。eth1394ドライバを読み込むとNICの数が増えるので厄介。これは無視か?FireWireSCSIのストレージは汎用ドライバなので問題なし。
あとはX11のドライバ。これはプラグインでやることにしてしまおうか。