minios tiny ── システム構成

アセンブリ 約 2,700 行(うちフォント・絵のデータ 約 1,000 行)+ C 約 5,200 行 ── OS 部分 約 5 KB、全体 約 114 KB(実行ファイル 130 KB)。Linux のコードも libc も使っていない。

動かしているのは QEMU の中。QEMU の -kernel で直接読む方法と、GRUB の ISO を BIOS から起動する方法の両方で、起動を確かめた。サイズは実測。

1. 起動の流れ

QEMU / GRUBローダー QEMU の -kernel、または GRUB が ELF を読む。Multiboot の印(0x1BADB002)を確認し、1 MB に配置
▶
32 ビットboot.s _start スタック 16 KB
ページ表を作る(先頭 1 GB を 2 MB ページで恒等写像)
CR4.PAE → EFER.LME → CR0.PG
▶
64 ビットlong_mode ljmp 0x08 で 64 ビットのコードへ
ds/es/ss/fs/gs ← 0
call main
▶
64 ビットmain.s main screen_init
irq_init
sound_init
sprite_init
→ シェルのループ

起動は 2 通り。QEMU の -kernel が直接読む方法(run.sh)では、BIOS やブートセクタは通らない。ISO の方法(docker.sh iso)では、BIOS → ブートセクタ → GRUB の順に通り、GRUB が読む。どちらも boot.s の _start からは同じ。

2. 構成とハードウェア

snake / jumprobo.c actors.c stages.c pics.c + snake.s
sound / play / smoothsound.c ・ mml.c(MML 解釈)
シェル(main.s)1 行入力 → コマンド分岐。help / clear / snake / jump / sound / play / smooth

▼ c.s(C ⇔ asm の橋)/ memcpy・memset

apu.cファミコン音源 矩形×2・三角・ノイズ
screen.s画面・裏画面
console.s・font.s8×8 文字 40×25
sprite.s16×16 絵
kbd.sPS/2
irq.sIDT・PIC・PIT
ac97.sDMA 再生

▼ ポート I/O(in/out)、メモリ直書き

VGA 0xA0000320×200・256 色
PS/2 キーボードIRQ1
PIT100 Hz・IRQ0
AC97(PCI)48 kHz・16 bit・ステレオ

アセンブリCシェル(アセンブリ)装置

3. サイズ(実測。コード+定数、size の text。1 KB = 1000 B)

部品ファイルサイズ
起動boot0.1 KB
OS 本体(画面・文字・キー・割り込み・音の出口・シェル)screen console font kbd irq ac97 c sprite main5.0 KB
音源・MMLapu mml sound11.0 KB
ゲーム: スネークsnake1.3 KB
ゲーム: ROBO JUMP(処理)robo actors22.9 KB
ゲーム: ステージ・絵のデータstages pics74.0 KB
コード+定数 合計114.4 KB
実行ファイル kernel.elf(ヘッダ込み)build/tiny/kernel.elf129.7 KB
実行時のメモリ(bss 142 KB 込み)うち裏画面 64 KB、ページ表 12 KB、スタック 16 KB256 KB

OS の部分は全体の約 4 %。大きいのは、ゲームのステージと絵のデータ(約 65 %)。ソースは .s / .c / .h で 約 8,000 行・243 KB(アセンブリ 2,748 行、C とヘッダ 5,231 行)。

4. メモリ配置

番地中身
0x000A0000VGA のメモリ(モード 13h、1 点 1 バイト)。present で裏画面から写す
0x00100000(1 MB)kernel: .text(Multiboot ヘッダが先頭)→ .rodata → .data → .bss
先頭 1 GB恒等写像(仮想 = 物理)。PML4 → PDPT → PD(2 MB × 512)
割り込み: IRQ0(タイマー、32 番)→ ticks を +1、IRQ1(キーボード、33 番)→ keys[256] と文字キュー、AC97 → バッファ 1 枚の再生が終わるたびに次の音を計算して詰める。
描画: 裏画面(320×200)に描く → wait_vsync → present で VGA に写す。