アセンブリ 約 2,700 行(うちフォント・絵のデータ 約 1,000 行)+ C 約 5,200 行 ── OS 部分 約 5 KB、全体 約 114 KB(実行ファイル 130 KB)。Linux のコードも libc も使っていない。
動かしているのは QEMU の中。QEMU の -kernel で直接読む方法と、GRUB の ISO を BIOS から起動する方法の両方で、起動を確かめた。サイズは実測。
-kernel、または GRUB が ELF を読む。Multiboot の印(0x1BADB002)を確認し、1 MB に配置_start
スタック 16 KBlong_mode
ljmp 0x08 で 64 ビットのコードへcall mainmain
screen_init起動は 2 通り。QEMU の -kernel が直接読む方法(run.sh)では、BIOS やブートセクタは通らない。ISO の方法(docker.sh iso)では、BIOS → ブートセクタ → GRUB の順に通り、GRUB が読む。どちらも boot.s の _start からは同じ。
▼ c.s(C ⇔ asm の橋)/ memcpy・memset
▼ ポート I/O(in/out)、メモリ直書き
アセンブリCシェル(アセンブリ)装置
size の text。1 KB = 1000 B)| 部品 | ファイル | サイズ | |
|---|---|---|---|
| 起動 | boot | 0.1 KB | |
| OS 本体(画面・文字・キー・割り込み・音の出口・シェル) | screen console font kbd irq ac97 c sprite main | 5.0 KB | |
| 音源・MML | apu mml sound | 11.0 KB | |
| ゲーム: スネーク | snake | 1.3 KB | |
| ゲーム: ROBO JUMP(処理) | robo actors | 22.9 KB | |
| ゲーム: ステージ・絵のデータ | stages pics | 74.0 KB | |
| コード+定数 合計 | 114.4 KB | ||
| 実行ファイル kernel.elf(ヘッダ込み) | build/tiny/kernel.elf | 129.7 KB | |
| 実行時のメモリ(bss 142 KB 込み) | うち裏画面 64 KB、ページ表 12 KB、スタック 16 KB | 256 KB |
OS の部分は全体の約 4 %。大きいのは、ゲームのステージと絵のデータ(約 65 %)。ソースは .s / .c / .h で 約 8,000 行・243 KB(アセンブリ 2,748 行、C とヘッダ 5,231 行)。
| 番地 | 中身 |
|---|---|
| 0x000A0000 | VGA のメモリ(モード 13h、1 点 1 バイト)。present で裏画面から写す |
| 0x00100000(1 MB) | kernel: .text(Multiboot ヘッダが先頭)→ .rodata → .data → .bss |
| 先頭 1 GB | 恒等写像(仮想 = 物理)。PML4 → PDPT → PD(2 MB × 512) |
ticks を +1、IRQ1(キーボード、33 番)→ keys[256] と文字キュー、AC97 → バッファ 1 枚の再生が終わるたびに次の音を計算して詰める。wait_vsync → present で VGA に写す。