USB Cart of Deathって知ってる?…… Windows Memphis(Microsoft Windows 98)に起きた悲劇。
久しぶりにThe Registerの記事である。
USB(Universal Serial Bus)は1995年に開発が始まったインターフェースである。
当時開発はIntel、MicrosoftとCompaq(現在のHP)、DEC(現在のHP)、IBM(PC事業はLenovo)、NEC(PC事業はLenovo Japan)、Nortel(破綻し解散)の幹事メンバーによってスタートした。この中に日本のNECが入っているのは、当時世界のPC市場でトップ5に名を連ねていたからである。
これが、OSに搭載されるようになったのはWindows 95 OEM Service Release 2.1からである。但し、OSRと呼ばれるこのバージョンは、パッケージでの販売が行われ無かったため、実際にユーザーが入手するにはWindows 98を待つしかなかった。もっと言えば、OSR2.1はある種のパブリックベータとして暫定実装されたもので不具合だらけだった。まあ、当時はUSB Host Controllerのドライバーモデルでも揉めていたので……問題だらけだった。
Windows 98はそのUSBを正式にサポートする製品になる。開発名はMemphisと呼ばれていてどんなOSになるかだけでも記事になる時代だった。10年ぐらい前のiOSやAndroidと同じようなものだ。OSの機能拡張が話題になる時代がPCにもあったわけだ。
で、そのWindows 98に関する登壇でUSB Cart of Deathが発生するというトラブルが起きたというのがこの記事の冒頭である。
ちなみに、USBは本格的に普及をはじめたのは、Microsoft Windows 98ではなく、Windows 98 Second Editionからである。どちらかというと先行したのは、WindowsではなくiMacの方が先に成功している。スティーブ・ジョブズがAppleに返り咲きスケルトンで一体型のMacを発表したからだ。あれがUSBを搭載し爆発的にヒットすることで一気にデバイスとUSBホストの普及が始まる。
ウィンテルもそれを追うことになるが、PC'97ハードウェアデザインと呼ばれるものが、本格的に採用されlegacy-freeを売りにするのは、Windows 98SE以降になる。ちなみに、OSの制限で当初は1ホスト辺り64デバイス(ハブも含めて)までしか対応しなかったそうだ。
尤も、先に書いたようにUSB1.1にはドライバーの問題があり、IntelはUniversal Host Controller(UHCI)をそれ以外のマ社と残りの業界では、Open Host Controller(OHCI)を採用していたため、互換性トラブルも絶えなかった。
開発中には、もっと大変だったようだ。一番問題なのは90年台の開発初期にはPCの性能が弱かったことだろう。
それが何を意味するかというと、接続してすぐにデバイスをOSがロードしないため、数秒待たないといけなかったようだ。これは、製品版までに見直されていったようだが、接続してすぐに認識しなければ一般の反応だとケーブルを抜いてさし治しをすることが予想される。それをやると、BSoD(Cart of Death)が待っている……という訳だ。
それでも普及したのは、電源供給機能があったことと、Hot Plug(ホットプラグ/OSが起動した状態でケーブルの抜き差しが出来ること)やPlug and Play(プラグアンドプレイ/差し込むとハードを認識しドライバーを探してインストールするか、ドライバーがなければインストールウィザードが出ること)が重宝したからだろう。
尚、USBのハードウェア仕様としては127デバイス(ホストを含めて128)に対応するが、実際にそれだけのデバイスがOS上で使えるかは別問題だ。逆に言えば今もCart of Deathはあり得るわけだ。そもそもCart of Deathが起きる理由は、CPUと繋がるメモリーへの入出力を管理するIRQ(割り込み要求)のポートが取得出来なくなることも原因の一つだ。
USBの場合は、USBというホストがIRQを一括占有し管理しており、そのホストの中で持っているリソースをUSBホストの下にある機器(デバイス)に割り当てる。しかし、入出力の幅が大きなデバイスが増えてくると、USBホストコントローラーで割当てを上手く配分することが出来なくなり、接続されているデバイスの割当てと同じブロックに重なる場合がある。それが起きると、USB起因のブルースクリーンが発生する。
これは、今だと1つ2つのデバイスでは起きないだろうが、USB2.0ぐらいまでの時代なら、USBオーディオやUSBキャプチャーデバイスなどのオーディオや映像を扱うデバイスを1つのホストコントローラーで複数扱うと発生することがしばしばあった。
逆に言えば、ロースピードデバイス(マウス、キーボード、指紋リーダーなど低速で動くデバイス)だと沢山繋いでも発生しにくい傾向がある。
ちなみに、今だと新型OSを発表する時USBデバイスを繋いだ瞬間にBSoDなどが出てきたら、大変酷く酷評されるだろうが、Windows9x時代はリソース不足でもブルースクリーンが出ていた。もっと言えば、アプリケーションが一般保護エラー(今だと○○が××を参照しましたが……で失敗しましたというメッセージが出てソフトウェアだけが止まるエラー)でクラッシュするだけでカーネルエラーが起きていた。
だからリソースメーターなんていう惚けたユーティリティがプログラムメニュー⇒アクセサリ⇒システムツールの中にあったのだ。以下がそれだが、このうちアプリケーションを沢山起動すると消費メモリ容量に関わらずシステムリソースが凄い勢いで減っていくのだ。
これが枯渇すると……OSがクラッシュする。
だから、ある種トラブルは付き物だった訳で、開発中の製品でブルースクリーンが起きるぐらいは皆それほど気にしなかったのもプラスに働いたことだろう。まあ、開発者の裏話であるこの記事ではそれが、肝を冷やすものだったことが語られている。
ちなみに、このリソースをモニタリングする機能はWindows 2000/XPでWindows NTベースになったことでリソース割当てが16bit仕様(OSは32bit)から32bitまたはx64版(もしくはIA-64)なら64bitになったことで改善され廃止された。
今ではハードトラブルやアップデートトラブルなど致命的な場合を除いてブルー画面になること自体が希になったが、こういう過去のトラブルを乗り越えた結果として今がある訳だ。全ては積み重ねである。
この記事はその開発秘話の一端が見られる貴重なものだろう。90年台後半~01年頃までがWindowsにしても、Macにしても基盤となる技術が生まれた一番進歩が著しかった時期である。アプリケーションソフトも、PCで使う周辺機器や内蔵用ハードウェアデバイスも雨後の筍のようにもりもりと生えてきた時代だ。だから、少々の不具合でも世間が許していたし、開発者は恐れもしたが、きっと期待にやり甲斐を感じていたはずだ。記事では、忍耐(強い精神、心)が重要だったと書かれているが、それ以上に待ち望んでいた人が居て、技術が発展する中心にいたことでやり甲斐を見ていた開発者が多かっただろうとも考えられる。
まあ、やり甲斐搾取されて抜け出せなかった人もいるかもしれないが……。そういう人は、今この話をしないだろう。