SimpleDetect
むむ。日記にブランクが。
しかし開発にブランクがあったわけではなく。
ということで、ハードウェア自動検出ツールを開発。SimpleDetect。
PCIデバイスやUSBデバイスは、自分のVendorIDやDeviceIDをアナウンスしている。それらのIDと、カーネルのコンパイル時に作成されるmodules.pcimap(USBならmodules.usbmap)を照らし合わせると、読み込むべきドライバを決定できることが判明。接続されているPCIデバイスVendorIDやDeviceIDは、/proc/pciや/proc/bus/usb/devicesファイルに書いてある。テキスト処理だけでドライバを決定できる。
さらにpci.idsやusb.idsも読み込めば、ベンダー名やデバイス名もわかる。これはVIVERの動作には関係ないけど、「検出されているぞ!」感があるので、読み込んで表示してみる。USBデバイスは自分でベンダー名やデバイス名をアナウンスしてくるので、usb.idsを調べなくてもわかるものの、PCIと同じコードを流用できるので、C++の継承の勉強を兼ねて作ってみる。protected:を使ったのは初めてだ…。
STLをふんだんに使う。ひたすら
ちなみに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の数が増えるので厄介。これは無視か?FireWireやSCSIのストレージは汎用ドライバなので問題なし。
あとはX11のドライバ。これはプラグインでやることにしてしまおうか。