自作OSでDOOMを動かしてみた
by
Zakki
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
自作OSでDOOMを動かしてみた Zakki (@zakki0925224) 2025/08/09 - Kernel/VM探検隊@東京 No18
Slide 2
Slide 2 text
自己紹介 ● Zakki(/dev/zakki, ざっきー) ● X: @zakki0925224 ● 自作OS, 自作CPU, FPGA etc. 低レイヤーの人 ● seccamp ‘22 ‘23
Slide 3
Slide 3 text
DOOMってなに? ● id Softwareが1993年に発売したMS-DOS向け元祖FPSゲーム ● 全3エピソードから成り、エピソード1はシェアウェア版として無料配布 ● のちに公式によってソースコードが公開される ○ https://github.com/id-Software/DOOM ● さまざまなプラットフォーム・ハードウェアに移植されまくる ○ プリンター ■ https://gigazine.net/news/20140916-canon-pixma-hacking/ ○ 医療用超音波スキャナー ■ https://gigazine.net/news/20221219-medical-ultrasound-scanner-doom/ ○ カーナビ(Android Auto) ■ https://gigazine.net/news/20230612-hyundai-doom/ ○ Windowsメモ帳、芝刈り機、大腸菌、ニンテンドーサウンドクロック Alarmo、その他多数
Slide 4
Slide 4 text
自作OSで動かしたいですよね? 少なくともよくわからんハードウェアに移植するよりかは簡単なはず…
Slide 5
Slide 5 text
自作OSで動かしたい ● 自作OS ○ https://github.com/zakki0925224/myos-x86_64 ○ ブートローダーとカーネルは Rustで書いてる ○ ユーザーアプリはCまたはRust(自作libcのRust binding)で書き、スタティックな ELFバイナリをロー ドできる ○ プロセススケジューリングは未実装、カーネルタス クとユーザータスクの切り替えのみ ○ 仮想ファイルシステム、オンメモリなFAT32に対応 ○ Local APICタイマーによる時間計測 ○ キーボード・マウス入力 ○ 簡単なウィンドウマネージャー
Slide 6
Slide 6 text
自作OSで動かしたい ● doomgeneric ○ https://github.com/ozkl/doomgeneric ○ 移植に特化したフォーク ○ 5つの関数を自分の環境向けに実装するだけで動く(すごい) ○ ↑をフォークした自分の実装 ■ https://github.com/zakki0925224/doom-for-myos ● libcには依存しているが、コンパイル時に自作libcとリンクするように指示すれば、 大部分のコードは書き直さなくても済む!→
Slide 7
Slide 7 text
どうやって移植するのか ● とりあえずコードを眺めると、すでに各プラットフォーム向けの実装が存在する ↑5つの関数というのはこれ
Slide 8
Slide 8 text
どうやって移植するのか ● 初期化→フレーム毎のループ処理
Slide 9
Slide 9 text
気合いでlibcの関数を実装する ● printfの実装つらすぎ
Slide 10
Slide 10 text
DG_Init関数 ● OSにウィンドウの生成を要求する ● BGRA形式のピクセルデータの参照を渡す
Slide 11
Slide 11 text
DG_GetKey / DG_DrawFrame関数 ● DG_DrawFrame ○ キー入力を受け付けてキューにためる ● DG_GetKey ○ キューにたまったキーデータを取り出し、ゲーム 内処理に渡す
Slide 12
Slide 12 text
DG_GetTicksMs / DG_SleepMs関数 ● DG_TicksMs ○ OSにシステム経過時間を要求し、現在時刻を取 得する(ミリ秒単位) ● DG_SleepMs ○ 指定したミリ秒の間待機する
Slide 13
Slide 13 text
SSE命令問題 ● SSE(Streaming SIMD Extensions) ○ IntelのSIMD拡張命令セットで、浮動小数点演算を高速化するために利用される ● x86_64環境において、C言語でfloat型(単精度浮動小数点)を扱うコードをコンパ イルする場合、以下のいずれかの方式にする必要がある ○ SSE命令 ■ x86_64アーキテクチャでは FPUとSSE2が必須であるため、これが一般的 ○ x87 FPU命令 ■ x86時代の古い方式 ○ softfloat ■ ハードウェア浮動小数点演算装置を使わずにソフトウェアでエミュレーションを行う ■ コンパイラは自動で書いてくれないので、自分で実装するかライブラリを使う必要がある
Slide 14
Slide 14 text
SSE命令問題 ● SSE命令はデフォルトでは動かせず、コントロールレジスタでの有効化とコンテキス トスイッチ時に専用レジスタXMMを保存・復元する必要がある ● 自分の環境ではなぜかうまく動かすことができなかったため、今回はsoftfloatを試 してみた
Slide 15
Slide 15 text
SSE命令問題 ● softfloatライブラリとしてberkeley-softfloat-3を利用 ○ https://github.com/ucb-bar/berkeley-softfloat-3 ● float型の変数宣言と四則演算をライブラリ経由に変更する必要がある
Slide 16
Slide 16 text
実際に動かしてみた ● https://x.com/zakki0925224 /status/1859419568743252 049 ● https://x.com/zakki0925224 /status/1859466847093203 298 見せられないよ