自作OSでDOOMを動かしてみた
by
Zakki
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 見せられないよ