フューチャー技術ブログ

OS自作入門本に触れたのでOS起動までの処理概要をまとめてみた

はじめに

はじめまして、2022年4月入社・Technology Inovation Group(TIG)所属の栗栖です。

春の入門ブログ連載の16日目です。

最近、ゼロからのOS自作入門(通称:みかん本)を読み始めました。

ソースレベルで解説があるため深い理解を得やすいですが、OS起動まで処理フローの記載がなく、全体感を把握するのに苦労したので私なりにmikanOSが立ち上がるまでの処理概要をまとめてみました。

OSBook

OS起動までの流れ

OS起動までの流れとしては以下の通り。

ブートローダ実行までのフロー.drawio.png

(1)電源起動

CPUがBIOSに格納されたバイナリプログラムを実行する。

※PCの電源が切れるとメインメモリの内容は消え、次回起動時にCPUは命令を読み取ることができなくなる。電源を切っても記憶内容を保持する不揮発性メモリ(ROM)にBIOSを書き込むことで、CPUがBIOSを実行可能にしている。

(2)UEFI BIOSの実行

コンピュータを初期化(CPU動作モードの設定、PCIデバイスの検出)し、接続されたストレージ内のブートローダを検索する。
/EFI/BOOT/BOOTX64.EFIをメインメモリ上に展開し実行する。

(3)ブートローダの実行

カーネルファイルを読み出し実行する。

(4)カーネルの実行

システムの機能やリソースを管理し制御する。

ブートローダとカーネルの用意

UEFI BIOSがブートローダの実行までしてくれるので、ブートローダとカーネルの実行可能ファイルを用意する。

ソースファイル

ブートローダ

以下の処理があれば良い。

  • メモリマップ(物理メモリの配置と使用状況を把握する情報源)を取得する。
  • カーネルファイルのヘッダ情報を読み込みイメージベース(バイナリファイルがメモリ上で配置されるアドレス)を特定する
  • カーネルを起動しブートサービスを停止させる。

カーネル

自分が作るOSでやりたいことを書く。(描画、デバイス制御、アプリケーション等)

ビルド

C/C++で書いたブートローダとカーネルのソースコードは以下手順で実行する。

ファイル構成.drawio.png

コンパイル

ソースコードからオブジェクトファイル(バイナリコードだが実行可能ではない)を生成する。
※1つのソースコードは1つのオブジェクトファイルとなるため、差分のあるソースコードだけを再コンパイルすることで時間を節約できる。

リンク

複数のオブジェクトファイルを結合して実行可能なバイナリファイルを生成する。

ディスクイメージの生成

ビルドされたファイルをディスクイメージに組み込む。

手順

  1. FAT32のディスクイメージファイルを作成する
  2. ディスクイメージを適当なディレクトリ(例:mnt)マウントする
  3. マウントされたイメージにビルドされたファイルをコピーする
├─mnt
├─EFI
│ ├─BOOT
│ └─BOOTX64.EFI #ブートローダ
├─kernel.elf #カーネル
└─memmap # メモリマップ
  1. ディスクイメージをアンマウントする。

実機環境であればシステムドライブにディスクイメージを焼いてブートする、

仮想環境であればQEMU等の仮想マシンでディスクイメージを起動するとOSが立ち上がる。

さいごに

本を読む前はOSは複雑で個人では取り掛かりにくい印象がありましたが、立ち上げるために必要な1つ1つの処理は意外と単純でした。立ち上がった後のカーネルの持つリソース管理や制御の実装部分は複雑なので大変だと思います。

次は寒河江さんのSwiftの自動テスト〜導入と基本的なテスト手法〜です。