こんにちは。見習いエンジニアのごえです。
前回の続きです。
【OS自作入門】知識ゼロからの学習記録:エンジニア初心者の奮闘と挑戦(Part1)
https://blog.future.ad.jp/os-jisaku-1
『ゼロからのOS自作入門|内田 公太 著』
日々サーバーの勉強をしていく中で、もっと根本的なところから理解を進めていきたいと思っていたところで、この本を見つけました。
本の趣旨は、電源を入れてOSを呼び出してから様々なアプリケーションを動かせるようになるまでを、自分の手を動かして体験するというものです。文字を表示させたりマウス入力を導入させたりと、当たり前な機能がどのような原理で備わっているかを学ぶことができます。
本ブログの趣旨
勉強の最終目標は書籍の読了&開発完了で、本ブログで学習記録(試行錯誤してもがいている様子)を残していきたいと思います。将来自分が読み返すためや、OS自作に興味がある方の参考になれば幸いです。
学習記録2-1:開発環境の仮想化がムズイ編(書籍 第1章)
前回は、バイナリエディタを使って〝実行ファイル〟を作成し、USBに保存してPCを起動させ、「Hello, world!」と表示させることに挑戦しました。結局30時間かけてUSBをフォーマットするだけで終わってしまっていました。
先が思いやられるなか、環境の不便さを先輩エンジニアKKさんにご相談したところ「仮想化したらいいじゃない」とアドバイスをいただきました。
ノートPCでHyper-Vという、仮想マシンを仮想ハードウェア上で実行するためのソフトを実行して環境を構築すれば手軽だよとのことです。書籍の環境にそろえることができたら色々と都合がいいので早速仮想化を実施!
記事が冗長になるので詳細は省きますがUbuntuを立ち上げるのに1週間かかりました。
Ubuntuが仮想環境で起動したときは、もうOS完成でいいんじゃないかと思いました。
学習記録2-2:仮想環境に仮想環境をつくる編(書籍 第1章)
安心したのもつかの間。本では「BOOTX64.EFI というバイナリファイルをUSBに保存する」という操作があるのですが、
仮想化した環境上のUbuntuにどうやってUSBを指すんだろうと悩んでいました。
ハード→仮想環境にある
USB →僕の右手にある
空中に向かってUSBをふりふりしても、もちろん反応はありません。
ChatGPTさんに聞いたところ、ディスクイメージをUbuntuに作ってマウントすればいいとのことです。初めての言葉で「マウント=自分が相手より優位にあるとアピールする行為」だと思っていたので「パソコンに威張るのか??」と混乱しました。
こちらも1週間ほどかけて解決。
①Ubuntuにディスクイメージを作成
②BOOTX64.EFI というバイナリファイルをディスクイメージに保存
③ディスクイメージをマウント
④qemuというエミュレーターでディスクを実行
上記の流れで本の手順を実行しました。
何を仮想化してるのか分からなくなってきたので現状況の図解です↓
仮想環境上で仮想しています(多分)
学習記録2-3:ようやく〝Hello,World〟成功編(書籍 第1章)
①Ubuntuにディスクイメージを作成
②BOOTX64.EFI というバイナリファイルをディスクイメージに保存
③ディスクイメージをマウント
④qemuというエミュレーターでディスクを実行
上記の手順でバイナリファイルを実行しますが、具体的なコマンドは以下の通りです(本の内容を引用しています)
$ qemu-img create -f raw disk.img 200M
→ディスクイメージを作成
$ mkfs.fat -n 'MIKAN OS' -s 2 - 2 -R32 -F 32 disk.img
→フォーマットする
$ mkdir -p mnt
→マウントポイントの作成
$ sudo mount -o loop disk.img mnt
→ディスクイメージをマウント
$ sudo mkdir -p mnt/EFI/BOOT
→実行可能ファイルを格納する場所の作成
$ sodo cp BOOTX64.EFI mnt/EFI/BOOT/BOOTX64.EFI
→実行可能ファイルを格納
$ sudo umount mnt→アンマウント
$ qemu-system-x86_64 -drive if=pflash,filw=$HOME/osbook/devenv/OVMF_CODE.fd -drive if=pflash,filw=$HOME/osbook/devenv/OVMF_VARS.fd hda disk.img
→ディスクイメージをQEMUで起動
鬼長いコマンドを実行して緊張の一瞬...
やりました!ついに〝Hello, world!〟が表示されました。
本を購入してから〝Hello, world!〟表示まで、約1か月半かかりました。今までで一番時間のかかった〝Hello, world!〟でした。
ここまでで本の3%読了です。計算では「4年あればシリーズ完結」ですが、超大作すぎるので今後の展開は検討します。
次回はカーネルを起動させたい。。。
お読みいただきありがとうございました。