
2025/12/26 9:32
ドライバーがカーネルの仮定に異議を唱える場合
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本文は、Unix 系統が DisplayLink USB ディスプレイをサポートするようになった経緯を追っている。最初の LCD を 2009 年 3 月 12 日に Theo de Raadt が OpenBSD 上で X サーバーを開発している際に発見したことから始まる。DisplayLink は Windows/Mac 用のバイナリドライバーのみを提供し、Linux/FreeBSD/OpenBSD 向けのソースコードは公開していなかった。Florian Echtler がデバイスを逆コンパイルし、floe.butterbrot.org で文書化を行い、2009 年 5 月中旬にプロトタイプのオープンソースライブラリ(後に
と呼ばれる)を公開したが、当初は圧縮機能が欠如していた。libdlo2009 年 8 月に Marcus Glocker が OpenBSD の
ドライバーに Huffman 圧縮テーブル(約 300 kB)を追加し、その後一連のパッチで USB FIFO 制限を解消するためにドライバが EAGAIN を返せるようにした。これによりudlがスリープできるようになった。9 月 1 日から 5 日にかけて「wscons stall」差分が導入され、端末エミュレーションに中止ロジックが追加された。その後の修正で中止状態を洗練させ、最終的なwsdisplayドライバーは完全な EAGAIN サポートを組み込み、9 月 14 日以降はそれ以上の問題報告はなくなった。udlまた、OpenBSD にダメージ拡張機能付き X サーバーが追加され、ARMish や Landisk のようにシリアルコンソールのみを持つプラットフォームでもグラフィックコンソールが可能になった。これらの進展にもかかわらず、DisplayLink の新しいチップは Linux または OpenBSD 用のフリードライバーを提供しておらず、Ubuntu バイナリドライバーはまだ逆解析されていない。このギャップは Unix 系統で USB ディスプレイの採用を制限し続け、多くの場合ユーザーがプロプライエタリな Windows/Mac ソリューションや代替ハードウェアに流れる原因となっている。
本文
ユニックス系システムは50年以上の歴史があります。
コアとなる設計思想は今も通用していますが、コンピューティングの進化に伴い OS デザイナーは何度もその実装を再考せざるを得なくなりました。
デバイスドライバーの観点から見ると最大の変化は、起動時に列挙されて以後変更不可能だった「固定・コンパイルタイム」型ハードウェア構成から、デバイスが現れたり消えたりできる「ダイナミック」モデルへ移行したことです。最初は1990年代中頃にホットプラグ対応の SCSI コントローラ、次いでノートパソコン向け PCMCIA デバイス、そして USB・FireWire といった全機種共通デバイスが登場しました。
PCMCIA のサポートは数年間残りましたが(Linux では pcmcia‑cs、FreeBSD では laptop パッケージ)、USB が開発段階に入る頃には、リムーバブルデバイスを受け入れるための変更は既に完了しテスト済みでした。カーネルはそれらに対応できない理由がありませんでした。
物語
2009年3月12日 – テオ・デ・ラートが日本へ渡航
テオは東京で OpenBSD 開発者のライアン・マクブライドを訪れ、秋葉原に寄って新しいガジェットを探しました。数か月後、彼は X サーバーを動作させる小型 USB ディスプレイ(スマートフォン程度)を手に入れました。
画像提供:Marcus Glocker
このディスプレイのメーカーは DisplayLink です。Windows と macOS のみ対応するバイナリドライバーを配布しており、フリーソフトウェアコミュニティは苛立っていました。フローニャ・エクトラーとクリス・ホッジズはデバイスを逆解析し、Linux で動作させることに成功しました(詳細は https://floe.butterbrot.org/matrix/hacking/dlnk/ を参照)。
当時 OpenBSD 用のドライバーは存在せず、デバイスは汎用 USB 周辺機器として接続されていました:
<deraadt> ugen0 at uhub0 port 3 "DisplayLink LCD-8000U" rev 2.00/0.02 addr 2 <deraadt> Picked up that too
マティエ・ヘルブはフローニャの逆解析ノートを転送し、テオはデバイスをスイスの開発者クロード・ジェッカーに渡しました。ジェッカーはそれをマーサック・グロッカに引き継ぎ、彼は 4 月 6 日に DisplayLink にドキュメントを要求しました。
DisplayLink は「ライブラリが必要である」という一般的な回答と、後にオープンソース(LGPL)ライセンスで公開される予定のライブラリについて述べました。彼らはもしマーサックが望むなら DL‑160 アダプタを数個送付すると約束しました。
そのライブラリは金曜日の午後に発表され、5 月 9 日に最初のドライバーがツリーへ投入されました。
進捗と挫折
-
5 月 15 日 – 公開ライブラリ(libdlo)がオンラインになりましたが、圧縮サポートが欠如していました。フローニャは公開で「圧縮なしでは使い物にならない」と不満を述べました。
-
8 月 14–25 日 – マーサックは
に 300 kB のハフマン表を追加し、ドライバーに圧縮機能を実装しました。/etc/firmware -
遅い 8 月 – 大量の画面更新が USB デバイスの FIFO がオーバーフローするため停止しました。カーネルにはリソース不足時にドライバーをスリープさせる仕組みがなく、全ターミナル操作は即座に完了できると仮定されていました。
ミオッド・ヴァラトはディスプレイドライバから tty 層へエラー経路を追加し、ドライバーがデータ受信不能の場合に
EAGAIN を返せるよう提案しました。これによりカーネルはプロセスをスリープさせ、スペースが確保され次第再開するというモデル(シリアルポートと同様)が実現できます。
その後、9 月 1–5 日に一連の大規模差分がコミットされ、徐々に以下を追加しました:
- wsdisplay エミュレーション操作全てに対する戻り値。
- 部分的失敗時にロールバックできる「abort state」をターミナルエミュレータに実装。
- フレームバッファドライバと udl(4) を更新し
を返すように修正。EAGAIN - 未初期化変数、ダブルワイド文字処理などの小さなバグ修正。
最終パッチセットは 9 月 5 日にコミットされ、インストールメディアカーネルから大量のコードが削除されつつも、通常システム上では完全機能を維持しました。
結果
- X サーバーサポート がツリーへ追加され、ARMish や landisk などのシリアルコンソールプラットフォームでグラフィックスコンソールや X サーバーが動作可能になりました。
- デバイスはオーバーフローをきれいに処理できるようになり、もはや停止や更新損失が発生しなくなりました。
- DisplayLink のチップは現在でも Linux も OpenBSD もサポートしておらず、Synaptics は Ubuntu 用のバイナリドライバーを提供していますが、まだ逆解析されていません。
デバイス自体はほぼ使用されなくなり、コミュニティの関心も薄れました。しかし、udl(4) の開発で得られた非同期 I/O、エラー伝搬、およびコンソールドライバにおける優雅な低下(グレースフルデグラデーション)についての知見は、将来のハードウェアサポートに大いに役立っています。