uchan note

プログラミングや電子工作の話題を書きます

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  |....@.P@.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  |............@.0B|
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.@@H.@.H.U.|
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 で締め切りました.多数のご応募,ありがとうございます.


  1. だって,フロッピーディスクなんて手に入りませんし.

  2. Linux なら GHex や hexedit,Windows なら Stirling や BZ などを入手すればいいでしょう.