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
1
1.7k
自作OSでDOOMを動かしてみた
2025/08/09 - Kernel/VM探検隊@東京 No18
Zakki
August 09, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
290
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
130
SQL Server 2025 LT
odashinsuke
0
120
ゲームの物理 剛体編
fadis
0
390
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
160
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
170
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
690
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
4.7k
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
330
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
230
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
860
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
250
Featured
See All Featured
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
31
Designing for Performance
lara
610
70k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
Balancing Empowerment & Direction
lara
5
830
KATA
mclloyd
PRO
33
15k
エンジニアに許された特別な時間の終わり
watany
106
220k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.3k
Making Projects Easy
brettharned
120
6.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Navigating Weather and Climate Data
rabernat
0
59
Deep Space Network (abreviated)
tonyrice
0
32
Test your architecture with Archunit
thirion
1
2.1k
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 見せられないよ