OS自作入門の入門
この記事では OS 自作の最初の一歩の部分を紹介します.OS 開発を始める前に雰囲気をつかみたい,という方に向けて書いています. 「セキュリティキャンプ 2018」の「OS 開発ゼミ・フルスクラッチ OS を書こう!」の補足資料でもあります.
ハローワールド
何はともあれ,他の OS の力を借りずに起動して画面にメッセージを表示するようなプログラムを作ることが OS 作成の第一歩でしょう. ここでは「30 日でできる!OS 自作入門」のノリで,バイナリエディタを使ってハローワールドをしてみます. 「30 日でできる!OS 自作入門」は 12 年前の本なのでなかなか試せませんが1,本記事は最新のやり方で説明してありますから,現代のパソコンで試せます.
唐突ですが,何かバイナリエディタ2を起動してください. そうしたら,次の 2KiB のバイナリ列を入力し,BOOTX64.EFI という名前で保存してください.*印の部分はすべて 0 です.
00000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |MZ..............| 00000010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |........@.......| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 |................| 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000080 50 45 00 00 64 86 03 00 00 00 00 00 00 00 00 00 |PE..d...........| 00000090 00 00 00 00 f0 00 2e 22 0b 02 02 1a 00 02 00 00 |......."........| 000000a0 00 04 00 00 00 00 00 00 00 10 00 00 00 10 00 00 |................| 000000b0 00 00 94 6a 00 00 00 00 00 10 00 00 00 02 00 00 |...j............| 000000c0 04 00 00 00 00 00 00 00 05 00 02 00 00 00 00 00 |................| 000000d0 00 60 00 00 00 02 00 00 e2 8d 00 00 0a 00 00 00 |.`..............| 000000e0 00 00 20 00 00 00 00 00 00 10 00 00 00 00 00 00 |.. .............| 000000f0 00 00 10 00 00 00 00 00 00 10 00 00 00 00 00 00 |................| 00000100 00 00 00 00 10 00 00 00 00 30 00 00 43 00 00 00 |.........0..C...| 00000110 00 40 00 00 14 00 00 00 00 00 00 00 00 00 00 00 |.@..............| 00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000130 00 50 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 |.P..............| 00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000180 00 00 00 00 00 00 00 00 2e 74 65 78 74 00 00 00 |.........text...| 00000190 50 00 00 00 00 10 00 00 00 02 00 00 00 02 00 00 |P...............| 000001a0 00 00 00 00 00 00 00 00 00 00 00 00 20 00 50 60 |............ .P`| 000001b0 2e 72 64 61 74 61 00 00 30 00 00 00 00 20 00 00 |.rdata..0.... ..| 000001c0 00 02 00 00 00 04 00 00 00 00 00 00 00 00 00 00 |................| 000001d0 00 00 00 00 40 00 50 40 2e 72 65 6c 6f 63 00 00 |[email protected]@.reloc..| 000001e0 0c 00 00 00 00 50 00 00 00 02 00 00 00 06 00 00 |.....P..........| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 40 00 30 42 |[email protected]| 00000200 55 48 89 e5 48 83 ec 20 48 89 4d 10 48 89 55 18 |UH..H.. H.M.H.U.| 00000210 48 8b 45 18 48 8b 40 40 48 8b 40 08 48 8b 55 18 |H.E.H.@@[email protected].| 00000220 48 8b 4a 40 48 8d 14 25 00 20 94 6a ff d0 90 90 |H.J@H..%. .j....| 00000230 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 |................| 00000240 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 |................| 00000250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 48 00 65 00 6c 00 6c 00 6f 00 2c 00 20 00 77 00 |H.e.l.l.o.,. .w.| 00000410 6f 00 72 00 6c 00 64 00 21 00 0a 00 00 00 00 00 |o.r.l.d.!.......| 00000420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000600 00 10 00 00 0c 00 00 00 28 30 00 00 00 00 00 00 |........(0......| 00000610 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000800
保存できたら,次は USB メモリに書き込みます.適当な USB メモリを FAT 形式でフォーマットし,/EFI/BOOT というディレクトリを作り,その中に BOOTX64.EFI をコピーします.
書き込めたら USB メモリを実験用のパソコンに差し替え,パソコンの電源を入れてください(または開発用パソコンに挿したまま再起動して実験することもできます).
電源を入れたらすぐに delete キーを押下して UEFI の設定画面に入ります.どこかに起動デバイスの選択項目があるはずです.そこで USB メモリを選択するとめでたく「Hello, world!」と表示されるはずです.
結局何をやったのか
変なファイルを作り,USB メモリに保存し,そこからパソコンを起動させたところ,画面にメッセージが出ました.いったい何をやったのでしょうか?
皆さんがバイナリエディタで入力したものは CPU が直接実行できる「機械語」を含む実行ファイルです.UEFI が認識できるように作ってあるので起動デバイスの選択画面に出てきたというわけです.
コンピュータで扱うデータはすべて数値になっています.文字も画像も音声もすべてです.データを扱うプログラム自身も数値で表されます.なぜなら,現代のコンピュータはデジタル回路で作られていて,デジタル回路では数値しか扱えないからです.コンピュータは 0 と 1 しか理解できない,という言葉はよく言われます.
バイナリエディタは数値を直接入力してファイルを作るためのソフトです.バイナリエディタを使うと文章でも画像でも作れます.バイナリエディタに作れないファイルはありませんので,当然 UEFI アプリを作ることも出来ちゃうのです.
そうやって作った UEFI アプリのファイルを USB メモリに保存しました.ファイル名を UEFI の仕様で決まっている名前にしておくことで UEFI が認識できるようにしています.BOOTX64.EFI の X64 はインテルが作った Intel 64 アーキテクチャであることを示します.
興味が出たら
自作 OS にもし興味を持っていただけたら筆者はとても嬉しいです.記事を書いた甲斐があったというものです.そして,2018 年の夏に自作 OS を開発するハッカソン形式の勉強会をしますので,筆者と一緒に OS 開発しませんか?詳しくはこちら! 「OS 開発ゼミ」
2018 年 6 月 3 日追記:OS 開発ゼミの募集は 5/28 で締め切りました.多数のご応募,ありがとうございます.