はじめに

この記事はOS自作入門を使って勉強したことを書くものである。本書では著者自作のソフトや様々なツール類がついているが、そのままやってはブラックボックスだらけで面白くない。そこでなるべく付属のツールを使わずに進めていこうと思う。手元にLinuxのGUI環境がないので以下の環境でやることにした。

環境:

  • WSL Ubuntu 18.04 (OS開発)
  • Windows 10 (エミュレータのみ)

とりあえず起動してみる(01_day/helloos0)

この本はPCでOSを起動するのにフロッピーディスクを使っているので自分の環境でエミュレータを使うなりUSBブートするなりしてOSが起動できることを確認しておかないと、デバッグもできないのでまずは起動させたい。

QEMUで起動する(とりあえず著者作ツール群で)

QEMUは著者推奨のエミュレータで本書のサポートページからダウンロードしてきたファイルに必要なものが全て入っているので簡単である。本書ではバイナリデータを手入力すると書いてあるが流石に時間がないのでパスさせていただく。

https://book.mynavi.jp/supportsite/detail/4839919844.html

こちらのページからzipがダウンロードできるので落とす。.imgが入っているのでマウントして、中身を取り出しておく。

本に従い、tolsetフォルダ内にhelloos0フォルダをコピーする。※以降この操作は省略する。
HariboteOS\projects\01_day\helloos0\!cons_nt.batをクリックしてターミナルを起動。runを実行するとQEMUが立ち上がり、OSが起動する。

Virtual Boxで起動する

QEMUは列記としたプロセッサエミュレータであるが、普段全く使わないのであっさりしすぎていて、本当にこのimgはOSなのだろうかと錯覚するかもしれない。そこでUbuntuやWindowsも起動できるVirtualBoxで起動できれば、OSを作っている感(まだ何も作っていないが・・・)が湧くだろうと思いVirtualBoxで起動してみた。

新規作成
新規作成
名前を入力して「作成」
名前を入力して「作成」
そのまま「作成」
そのまま「作成」
最初の画面に戻り、「設定」
最初の画面に戻り、「設定」
ストレージ>ストレージデバイス>追加>フロッピーコントローラーを追加
ストレージ>ストレージデバイス>追加>フロッピーコントローラーを追加
「コントローラー: Floppy」の右のボタンをクリック
「コントローラー: Floppy」の右のボタンをクリック
ディスクを選択
ディスクを選択
「追加」を押してhelloos.imgを追加する
「追加」を押してhelloos.imgを追加する
「選択」
「選択」
最初の画面に戻り、「起動」
最初の画面に戻り、「起動」
正常に起動し、「hello, world」と表示された
正常に起動し、「hello, world」と表示された

アセンブリからアセンブルする(01_day/helloos2)

使用ツール:

アセンブリコードはhelloos.nas

命令
DB ファイルのデータを1byte書く
RESB 0x00で埋める

ここで、本物のnasmを使うに当たり注意点がある。付属のファイルをそのままnasmに突っ込むとエラーになる。

1
2
$ nasm helloos.nas -o helloos.img
helloos.nas:41: error: attempt to reserve non-constant quantity of BSS space

nasmのドキュメントを漁るとこう書いてある。

NASM supports two special tokens in expressions, allowing calculations to involve the current assembly position: the $ and $$ tokens. $ evaluates to the assembly position at the beginning of the line containing the expression; so you can code an infinite loop using JMP $. $$ evaluates to the beginning of the current section; so you can tell how far into the section you are by using ($-$$).
https://nasm.us/doc/nasmdoc3.html#section-3.5

つまり、こういうことだ。

$ = 式を含む行の先頭のアセンブリ位置
$$ = 現在のセクションの先頭

また、最終文に、セクションのどこまで進んでいるのかを知るには$-$$を使えと書いてあるので、helloos.nasの41行目を

1
2
; RESB	0x1fe-$
RESB 0x1fe-($-$$)

に書き換える。

1
2
3
4
5
$ nasm helloos.nas -o helloos.img
helloos.nas:24: warning: uninitialized space declared in .text section: zeroing
helloos.nas:41: warning: uninitialized space declared in .text section: zeroing
helloos.nas:48: warning: uninitialized space declared in .text section: zeroing
helloos.nas:50: warning: uninitialized space declared in .text section: zeroing

warningなのでとりあえず無視すると、helloos.imgが作成できた。

qemuで起動する。

1
PS> qemu-system-x86_64 .\helloos.img

別の文字を表示してみる(01_day/helloos2)

37行目を編集

1
DB		"SHOSATO.JP"

おわりに

これでhariboteOSがとても小さいながらも確かにOSであるというように思えることができ、モチベーションが上がった。