
2026/06/24 23:38
趣味用OSでWineを利用してWindowsゲームを実行する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
著者は、独自のオペレーティングシステム「Astral」へ Wine を成功裡に移植し、ネイティブ 64 ビットアーキテクチャ上で幅広い 32 ビット Windows アプリケーションを実行できるようにしました。主な技術的課題には、WoW64 に Long Descriptor Table (LDT) サポートを追加して 32 ビットコードの実行を可能にし、PE から Unix への移行失敗を引き起こしていた Wine ディスパッチャの未定義動作を修正する事、MinGW を統合して必須の PE DLL をコンパイルする事、xlib から Mesa パッチによる DRI に OpenGL バックエンドを変更することで /dev/dri がなくても X.org サーバーを起動できるようにする事がありました。これらの努力により、「Cogmind」といった複雑なソフトウェアの安定した実行が可能になりました。以前の不完全なビルドは基本的なツールのみに対応していましたが、これらの修正後、より高度なアプリケーションの実行が現実的になりました。
現在のテスト結果は混在しています。「FTL」などのタイトルは正常に動作しますが、DRM 制限(例:Steam にてブロックされている「Plants vs. Zombies」)により、部分的または完全に機能しないタイトルもあります。実行時エラー(「Half-Life」は C++ assert で失敗)、インストーラー/起動時の失敗(Firefox、Chromium、SCP: Containment Breach)、エンジン固有の問題(Unity ゲームが MonoManager で停止)も報告されています。「FTL」や「Half-Life」といった人気タイトルはいくらか遊べる状態ですが、DRM やインストール問題により、万能な互換性は確保されていません。
今後の計画として、著者は Chromium ブラウザを Steam で完全に動作可能にするとともに、新規ドライバとバグ修正による Astral カーネルの最適化を継続し、全体のパフォーマンスと安定性を向上させる予定です。
本文
アストラルでの Wine ポーティング:コグマインドから Steam まで
背景と目標
数ヶ月前、趣味の開発 OS「アストラル」上で マインクラフトを動作させる記事を公開しました。その後、より多くのゲームやファクターイオ(glibc 互換 C ライブラリ)への対応が進められていますが、多くのタイトルは Windows 向けにコンパイルされた閉源代码であり、動作には Wine のような互換層が必須です。
特に私が愛好するログライクゲーム**「コグマインド」**は、32 ビット版の Windows 専用ソフトであり、アストラル上で動かすのが目標となりました。
- 既存の Wine ポートではメモ帳(
)すら正常に動作せず極めて不完全でした。notepad.exe - コグマインドを動かすためには、Wine ポートの完遂に加え、64 ビット OS 上で 32 ビットコードを実行可能にする環境整備も必要でした。
Wine の基本機能の確立
Wine を動作させる最初のステップとして、以下を実施しました。
MinGW の導入
- MinGWをダウンロードし、ビルド設定で有効化。
- PE フォーマットの DLL コンパイルに不可欠な環境です。
- 成果: メモ帳が正常に動作し、「名前付けて保存」操作でのクラッシュ現象が解消されました。
libEGL.so のコンパイルと EGL 対応
Wine は当初、OpenGL サポートを無効な状態でビルドされていました。アストラルには OpenGL が搭載されていますが、Wine の正しく動作するには**EGL(レンダリング API とウィンドウシステムの接続)**が必要です。
- 課題: アストラルの Mesa ポートでは EGL を提供していませんでした。
- 試行錯誤:
- 当初は Mesa で
バックエンドを使い易く有効化しようとしました。xlib - しかし、Mesa の
バックエンドではEGL サポートが非対応でした。xlib
- 当初は Mesa で
- 解決策: DRI(Direct Rendering Infrastructure)バックエンドへの切り替え。
- DRI は X サーバーを経由せず、アプリケーションが GPU と直接通信する仕組みです。
を介さずに X.org サーバーを起動できるように Mesa のパッチ適用という深い調査を実施。/dev/dri
- 成果: 上記対応により**「デルタラン」**の起動に成功しました。
WoW64 と 32 ビット Windows プログラムの対応
コグマインドは 32 ビットアプリケーションであり、アストラルは 64 ビットシステムであるため、以下の基盤構築が必須でした。
- WoW64 モードの実装:
- 32 ビットの Unix ライブラリを必要としません。
- 64 ビットプロセス内で 32 ビット Windows バイナリを実行します。
- 必要な場合、32 ビットおよび 64 ビットのシステムコールやデータ構造の間を翻訳し、完全な 32 ビットユーザースペースを用意せずに実行環境を提供します。
実装詳細
実装の中心はカーネル内の LDT(ローカル説明子テーブル)サポートでした。
- LDT の役割:
- x86-64 アーキテクチャでは、ロングモードの中で 32 ビットセグメント説明子を用いて 32 ビットコードを実行可能になります。
- これらはメモリのアクセス方法や、コードセグメントの処理方法を定義します。
- LDT はこれらのセグメント説明子をプロセス単位で定義する仕組みです。
- その他:
- Wine のシグナルハンドリングとシステムコール処理コードにおいて、いくつかの細かい**接着層(glue)**の実装も必要でした。
コグマインド!アストラル上で動作開始!
Wine ポートに WoW64 サポートを実装し、カーネルにおける数々のバグを修正した結果、ついにコグマインドが動作しました。
- ゲーム内で遊べる状態を実現できました。
- ゲーム内のニュース表示やスコアシート送信機能以外は顕著な問題は見られませんでした。
スコアシート送信機能の不具合の解決
TCP 接続が開かれて即座に断られ、かつデータ転送が一切行われない現象が発生していましたが、その原因は以下の通りでした。
- 初期判断: ネットワークスタックの問題と考えましたが、それはではありませんでした。
- 真の原因発見: Wine デバッグログ関数**
**が WoW64 モードでは全く機能しないこと。__wine_dbg_write- これにより、Wine のコードを掘り下げた結果、
関数においてレジスタの保存を忘れていることに気づきました。__wine_unix_call_dispatcher
- これにより、Wine のコードを掘り下げた結果、
- 修正と成果:
- この欠落により PE から Unix への移行が破綻し、未定義動作(UB)を引き起こしていました。
- コードを修正することで、スコアシート送信機能が正常に動作するようになりました。
その他のゲーム・アプリケーションの実行状況
Wine を介して試行した他のアプリケーションの結果です。
| アプリケーション名 | 状態 | 詳細 |
|---|---|---|
| FTL | ✅ 動作 | 完全遊 playable |
| Steam | ⚠️ 部分的 | インストール・アップデートは可能だが、Chromium 起動時 () にクラッシュ。 |
| iexplore.exe | ⚠️ 部分的 | シンプルなサイト表示可能だが、複雑なページでは Chromium と同様の不具合でクラッシュ。 |
| Factorio | ⚠️ 部分的 | ウィンドウが開くが、ローディング画面を過ぎない。 |
| Spooky's Jumpscare Mansion | ⚠️ 部分的 | 起動はするが、プレイには遅すぎすぎる速度で動作する。 |
| Noita | ⚠️ 部分的 | 起動はするが、プレイには遅すぎすぎる速度で動作する。 |
| プラントズ vs ザンビーズ | ❌ 破損 | メインメニュー到達前に Steam DRM にブロックされる。 |
| ハーフライフ | ❌ 破損 | Wine の C++ ランタイムでアサート失敗(おそらくポーティングの欠落)。 |
| Firefox / Chromium | ❌ 破損 | インストーラーが失敗し、実行可能な状態に至らない。 |
| SCP: コンテインメントブリーチ | ❌ 破損 | 起動せず、原因未特定。 |
| Unity ゲーム全般 | ❌ 破損 | wine-mono に問題があり、MonoManager の で停止する。 |
おわりに
Wine のポーティングは非常に楽しくて刺激的な課題でした。趣味の OS でも当初思っている以上に多くのゲームが遊べることを証明する手段となりました。
- 実用性: 趣味の OS が実用的な日常利用ツールへと進化していく過程の一歩です。
- 学び: 特に PE から Unix への移行修正を通じて、コードを深く掘り下げ、Wine の内側を学ぶことができました。
今後の目標とロードマップ
現時点では粗面やパフォーマンス課題、奇妙なクラッシュが残っていますが、コア部分での動作は確認できました。以下のことに重点を置きます。
- 主要目標: Steam の動作を実現する(これにより Chromium も同時に動くと考えられます)。
- アストラル開発: 最適化、新しいドライバの開発、バグ修正へのリソース集中。
- カーネル改善: カーネル側にも改善の余地は十分にあります。
ご阅读いただきありがとうございました!