Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自作OSでDOOMを動かしてみた
Search
Zakki
August 09, 2025
Programming
0
160
自作OSでDOOMを動かしてみた
2025/08/09 - Kernel/VM探検隊@東京 No18
Zakki
August 09, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
DMMを支える決済基盤の技術的負債にどう立ち向かうか / Addressing Technical Debt in Payment Infrastructure
yoshiyoshifujii
5
760
令和最新版手のひらコンピュータ
koba789
4
1.2k
MySQL9でベクトルカラム登場!PHP×AWSでのAI/類似検索はこう変わる
suguruooki
1
280
AIコーディングエージェント全社導入とセキュリティ対策
hikaruegashira
16
9.4k
実践!App Intents対応
yuukiw00w
1
170
知って得する@cloudflare_vite-pluginのあれこれ
chimame
1
140
#QiitaBash TDDで(自分の)開発がどう変わったか
ryosukedtomita
1
350
Google I/O Extended Incheon 2025 ~ What's new in Android development tools
pluu
1
230
DynamoDBは怖くない!〜テーブル設計の勘所とテスト戦略〜
hyamazaki
0
180
kiroでゲームを作ってみた
iriikeita
0
140
AIのメモリー
watany
12
1.3k
Quality Gates in the Age of Agentic Coding
helmedeiros
PRO
1
120
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Being A Developer After 40
akosma
90
590k
Visualization
eitanlees
146
16k
Code Reviewing Like a Champion
maltzj
524
40k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Done Done
chrislema
185
16k
Building Applications with DynamoDB
mza
95
6.5k
Art, The Web, and Tiny UX
lynnandtonic
301
21k
How to Ace a Technical Interview
jacobian
278
23k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
It's Worth the Effort
3n
185
28k
Transcript
自作OSでDOOMを動かしてみた Zakki (@zakki0925224) 2025/08/09 - Kernel/VM探検隊@東京 No18
自己紹介 • Zakki(/dev/zakki, ざっきー) • X: @zakki0925224 • 自作OS, 自作CPU,
FPGA etc. 低レイヤーの人 • seccamp ‘22 ‘23
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、その他多数
自作OSで動かしたいですよね? 少なくともよくわからんハードウェアに移植するよりかは簡単なはず…
自作OSで動かしたい • 自作OS ◦ https://github.com/zakki0925224/myos-x86_64 ◦ ブートローダーとカーネルは Rustで書いてる ◦ ユーザーアプリはCまたはRust(自作libcのRust
binding)で書き、スタティックな ELFバイナリをロー ドできる ◦ プロセススケジューリングは未実装、カーネルタス クとユーザータスクの切り替えのみ ◦ 仮想ファイルシステム、オンメモリなFAT32に対応 ◦ Local APICタイマーによる時間計測 ◦ キーボード・マウス入力 ◦ 簡単なウィンドウマネージャー
自作OSで動かしたい • doomgeneric ◦ https://github.com/ozkl/doomgeneric ◦ 移植に特化したフォーク ◦ 5つの関数を自分の環境向けに実装するだけで動く(すごい) ◦
↑をフォークした自分の実装 ▪ https://github.com/zakki0925224/doom-for-myos • libcには依存しているが、コンパイル時に自作libcとリンクするように指示すれば、 大部分のコードは書き直さなくても済む!→
どうやって移植するのか • とりあえずコードを眺めると、すでに各プラットフォーム向けの実装が存在する ↑5つの関数というのはこれ
どうやって移植するのか • 初期化→フレーム毎のループ処理
気合いでlibcの関数を実装する • printfの実装つらすぎ
DG_Init関数 • OSにウィンドウの生成を要求する • BGRA形式のピクセルデータの参照を渡す
DG_GetKey / DG_DrawFrame関数 • DG_DrawFrame ◦ キー入力を受け付けてキューにためる • DG_GetKey ◦
キューにたまったキーデータを取り出し、ゲーム 内処理に渡す
DG_GetTicksMs / DG_SleepMs関数 • DG_TicksMs ◦ OSにシステム経過時間を要求し、現在時刻を取 得する(ミリ秒単位) • DG_SleepMs
◦ 指定したミリ秒の間待機する
SSE命令問題 • SSE(Streaming SIMD Extensions) ◦ IntelのSIMD拡張命令セットで、浮動小数点演算を高速化するために利用される • x86_64環境において、C言語でfloat型(単精度浮動小数点)を扱うコードをコンパ イルする場合、以下のいずれかの方式にする必要がある
◦ SSE命令 ▪ x86_64アーキテクチャでは FPUとSSE2が必須であるため、これが一般的 ◦ x87 FPU命令 ▪ x86時代の古い方式 ◦ softfloat ▪ ハードウェア浮動小数点演算装置を使わずにソフトウェアでエミュレーションを行う ▪ コンパイラは自動で書いてくれないので、自分で実装するかライブラリを使う必要がある
SSE命令問題 • SSE命令はデフォルトでは動かせず、コントロールレジスタでの有効化とコンテキス トスイッチ時に専用レジスタXMMを保存・復元する必要がある • 自分の環境ではなぜかうまく動かすことができなかったため、今回はsoftfloatを試 してみた
SSE命令問題 • softfloatライブラリとしてberkeley-softfloat-3を利用 ◦ https://github.com/ucb-bar/berkeley-softfloat-3 • float型の変数宣言と四則演算をライブラリ経由に変更する必要がある
実際に動かしてみた • https://x.com/zakki0925224 /status/1859419568743252 049 • https://x.com/zakki0925224 /status/1859466847093203 298 見せられないよ