
2026/05/13 19:37
Windows Subsystem for Linux(WSL)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
WSL9x は、再ブートなしで Windows 9x カーネル内に最新の Linux カーネル バージョン 6.19 を協調的に実行する革新的なプロジェクトです。標準的な仮想化とは異なり、本システムはユーザースペースではなくスーパーバイザーモード(リング 0)で動作し、Windows 9x API を直接呼び出すことで古いオペレーティングシステムの深刻なハードウェア制限を回避します。このシームレスな統合は、以下の 3 つの主要コンポーネントにより実現されています:修正済み Linux カーネル(win9x-um-6.19 ブランチから)、専用 VxD ドライバ、DOS ベースのクライアントプログラム (
wsl.com) です。特に重要なのは、元々の中断ベクトルテーブルでは適切なシステムコールに不十分なため、int 0x80 の相互作用を効率的に管理するためにはジェネラルプロテクションフォルトハンドラへの依存である点です。Linux カーネルはユーザモード Linux から派生しており、リング 0 で実行するように変更されています。複雑な Windows 9x カーネル統合とコンテキストスイッチング論理の大部分はこのカスタムレイヤーに存在します。環境を設定するには、クライアントを起動する前にANSI ドライバ(例:nnansi.com)をロードし、色などのターミナル出力機能をサポートする必要があります。また、利用可能なシステムを作成するには、事前にインストール済み Windows 9x ベースイメージ (hdd.base.img) からハードディスクイメージ (hdd.img) を構築して生成する必要があります。本書全体は GPL-3 ライセンスの下で配布されており、ユーザーにはソフトウェアを修正し共有する明確な法的権利が保証され、そのオープンソース性が維持されています。本文
Windows 9x リンバーサブシステム (WSL9x)
WSL9x は、現在の Linux カーネル(執筆時点では v6.19)を Windows 9x カーネルの側で協調的に実行し、両オペレーティングシステムの完全な機能セットを同時に活用することを可能にします。これにより、ページの入れ替え、メモリの保護、優先度的スケジューリングなどの特徴がすべて利用可能です。お好みのアプリケーションをすべて並行して実行できます。再起動は不要です!
本プロジェクトは AI に依存せず、誇り高く開発されました。
【技術的詳細】 WSL9x は以下の 3 つのコンポーネントから構成されています:パッチ適用された Linux カーネル(参照:win9x-um-6.19 ブランチ)、VxD ドライバー、および wsl.com クライアントプログラムです。
ドライバーは WSL9x の初期化を担当します(ドライバーのエントリーポイントは vxd/wsl9x.asm を参照してください)。カーネルコードの初期マッピングを設定し、DOS 中断を用いて disk から vmlinux.elf をロードします(参照:vxd/loader.c および vxd/fs.asm)。カーネルは固定したベースアドレス 0xd0000000 でコンパイルされています。
その後、ドライバーは System VM 内で新しいスレッドを開始し、Linux へのエントリのために 16 KiB のスタックを割り当て、カーネルへのエントリ、IRQ のディスパッチ、ユーザー空間へ戻る処理、アイドル処理を取り扱うイベントループに遷移します(参照:vxd/entry.c)。
また、ドライバーは現在ページフォールトおよびシステムコールを含む、カーネルにディスパッチすべきユーザー空間のイベントも処理します。システムコールは、一般的な保護違反(GPF)ハンドラーを通じて処理されます。なぜなら、Windows 9x の中断識別子テーブルには int 0x80(Linux i386 システムコール用中断)用の適切なハンドラーをインストールするほど長くないからです。GPF ハンドラーは、発生した指令を検査します。それが int 0x80 の場合、GPF ハンドラーは中断が成功したかのように命令ポインタを進め、Linux に対するシステムコールとしてディスパッチします(参照:vxd/fault.c)。
Linux カーネルは User-Mode Linux に基づいていますが、POSIX API の代わりに Windows 9x カーネル API を呼び出すようハックされており、ring 3(ユーザーモード)ではなく ring 0(スーパーバイザー/カーネルモード)で動作しています。コンテキストスイッチングを含む実際の Win9x カーネル統合の多くは Linux カーネル内に実装されています(Linux 側コードの大部分は linux/arch/um/os-Win95 を参照してください)。vxd/entry.c が呼び出すエントリーポイントは main.c の _start です。process.c および mmu.c も重要です。
最後のコンポーネントは wsl.com クライアントです。これは、WSL9x がカスタムの何らかの実装を行うのではなく MS-DOS プロンプトを TTY ウィンドウとして利用できるようにするための、wsl/wsl.asm で実装された小さな 16 ビット DOS プログラムです。wsl.com が起動すると、vxd/console.c の wsl9x_v86_api に初期呼び出しを行い、未使用のコンソールを予約し、当該コンソールの出力が自身にディスパッチされるべきであることを WSL9x に通知します。その後、中断時にキーボードからの読み取りを試みる IRQ を待つイベントループに遷移します。このイベントループの上位部分は、コンソールドライバーとの同期点としても機能します:Linux から出力準備ができると、イベントをスケジューリングし、MS-DOS VM の文脈で int 0x29 を実行して文字を DOS ウィンドウに出力します。この中断は、NNANSI などの DOS ANSI ドライバーがターミナル出力をインターセプトして ANSI エスケープシーケンスを実装することを可能にする場所でもあります。
ビルドと実行
- i386-linux-musl をターゲットとするクロスコンパイルツールチェーンを PATH に配置する必要があります。musl-cross-make を使用して作成してください。
- Windows 側のコンポーネントをビルドするには、Open Watcom v2 ツールチェーンが必要です。WATCOM 環境変数をインストール先のプレフィックスに設定してください。私の場合、/opt/watcom です。
- パッチ適用済み Linux カーネルを構築します。カーネルのビルドには時間がかかるため、このステップは手動で行う必要があります。 $ git submodule update --init # Linux サブモジュールが最新であることを確認 $ make build-linux -j $(nproc)
- Windows 9x が事前にインストールされたハードドライブイメージ hdd.base.img を必要とします。
を実行してください。これにより WSL9x が準備された新しい hdd.img が生成されます。make- MS-DOS プロンプトから
を実行してpty を開きます。ANSI カラーを使用したい場合は、wsl
を実行前に適切なドライバーをロードしていることを確認してください。nnansi.com が良い選択肢です。wsl
ライセンス:GPL-3