C言語で0から作るOSを開発について説明していきます。このシリーズではカーネルの開発における、そのドライバーについて説明しています。
今回はマルチブート仕様に従うカーネルを簡単に作成し、仮想PC上でGRUBからカーネルを起動する方法について見ていきます。
【注意】本書はGRUBのレスキューディスクからフロッピーディスクに格納されているカーネルを起動する方法についてのみの簡易的な説明に留まっています。その他の詳細な説明はしていませんので注意してください。
【注意】本書は『0から作るOS開発』のVol.ナンバリングのタイトルではありません。Vol.ナンバリング以外のタイトルはカーネル編以降どのタイミングでも導入することができます。
GRUBからの自作カーネル起動
本書について
ブートローダー
初期のコンピューター
初期の商用コンピューター
IBM System/360と後継機
ROMを使用したコンピューター
現在のパソコン
GRUB
GRUBの簡単な歴史
GRUBの特徴
対応ファイルシステムとデバイス
インターフェース
ネットワークからの起動
マルチブート
GRUBのブート処理
GRUB 2のブート処理
推奨
GRUB 2のインストール
CygwinでGRUB 2をインストールします。
Cygwin上でGRUB 2のパス設定をします。
GRUB 2のパッケージ内容
インストールされる内容
インストールされるGRUB 2のツール
grub-bin2hのオプション
grub-editenvのオプション
grub-fstestのオプション
grub-mkelfimageのオプション
grub-mkfontのオプション
grub-mkimageのオプション
grub-mkisofsのオプション
grub-mkpasswd-pbkdf2のオプション
grub-mkrelpathのオプション
grub-mkrescueのオプション
grub-script-checkのオプション
grub-installのオプション
grub-mkconfigのオプション
grub-mkdevicemapのオプション
grub-probeのオプション
grub-rebootのオプション
grub-set-defaultのオプション
grub-setupのオプション
重要なGRUBのコマンドと設定ファイル
grub-installコマンド
grub-mkconfigコマンド
grub-mkrescueコマンド
GRUB 2のレスキューイメージの作成
GRUBのレスキューイメージを作成してみる
GRUBをVirtualBoxで起動してみる
VirtualBoxでGRUBのレスキューイメージを読み込む設定を行う。
GRUBから起動できる自作OS(カーネル)の作成
マルチブート仕様(ベーシック)
マルチブート仕様の概略
マルチブートヘッダー
マルチブートヘッダーの実装
カーネルをロードする物理アドレスの定義
magicフィールドの定義
flagsフィールドの定義
checksumフィールド
残りのアドレスフィールドについて
グラフィックフィールドの定義
C言語用のマルチブートヘッダー定義
OS起動時のマシン状態
マルチブート情報
マルチブート情報の定義
マルチブート仕様のヘッダー定義まとめ
GRUBから起動するカーネルを作成する
マルチブートヘッダーを作成する
multiboot.S
カーネル本体を作成する
カーネルをコンパイルする
[multiboot.S]
[kernel.c]
マルチブートヘッダーとカーネルイメージの結合
(補足)ELFフォーマット以外のカーネルイメージの作成
GRUBから自作OS(カーネル)を起動する
自作カーネルをフロッピーディスクに入れる
GRUBを起動する
GRUBから自作カーネルを起動する
GRUBの設定とメニューからの自作OS起動
編集したgrub.cfgをレスキューイメージに入れる
付録その1 カーネルをメモリーの3GBにロードするには
カーネルをメモリーの3GB(0xC0000000)にロードするには
カーネルをなぜ0xC0000000に置くのか
物理アドレスアドレスから仮想アドレスへのマッピング
カーネルを0x00000000からストレートマッピングする場合
カーネルを0x00100000からストレートにマッピングする場合
カーネルを0xC0000000からストレートにマッピングする場合
カーネルを0xC0000000にロードする
マルチブートヘッダーとカーネルのロード部を作成する
1.ページディレクトリの作成
2.ページディレクトリの設定
3.ページサイズを4MBに設定
4.ページングON
5.パイプラインのフラッシュ
6.カーネルのエントリーを呼び出します
ここまでのまとめ。multiboot.Sの全体。
リンカースクリプトの作成
付録その2 マルチブート仕様
マルチブート仕様概要
マルチブート仕様について
マルチブート仕様が想定しているアーキテクチャー
マルチブート仕様が想定しているOS
マルチブート仕様に基いて設計するブートローダーについて
ブート時にOSに渡すパラメーター情報について
OSの開発について
ブートモジュールについて
マルチブート仕様で使用する型式
マルチブート仕様で仕様する助詞の定義について
マルチブート仕様
マルチブートヘッダー
マシン状態
(参考)CR0制御レジスターとEFLAGSレジスター
CR0制御レジスター
EFLAGSレジスター
ESPレジスター、GDTR、IDTRについて
ブートローダーが設定しておくべきのその他のマシン状態
マルチブート情報のフォーマット
実装例と注意事項
パソコンでの注意事項
マルチブート情報のflagsのビット0について
マルチブート情報のflagsのビット1について
マルチブート情報のflagsのビット6について
BIOSデバイスマッピングテクニック
データ比較テクニック
I/O制限テクニック
OSのプログラム例
[multiboot.h]
[boot.S]
[kernel.c]
コンパイル
[2016/1/12]
GRUBのインストールをソースコードからインストールする説明に変更しました。
今回はマルチブート仕様に従うカーネルを簡単に作成し、仮想PC上でGRUBからカーネルを起動する方法について見ていきます。
【注意】本書はGRUBのレスキューディスクからフロッピーディスクに格納されているカーネルを起動する方法についてのみの簡易的な説明に留まっています。その他の詳細な説明はしていませんので注意してください。
【注意】本書は『0から作るOS開発』のVol.ナンバリングのタイトルではありません。Vol.ナンバリング以外のタイトルはカーネル編以降どのタイミングでも導入することができます。
GRUBからの自作カーネル起動
本書について
ブートローダー
初期のコンピューター
初期の商用コンピューター
IBM System/360と後継機
ROMを使用したコンピューター
現在のパソコン
GRUB
GRUBの簡単な歴史
GRUBの特徴
対応ファイルシステムとデバイス
インターフェース
ネットワークからの起動
マルチブート
GRUBのブート処理
GRUB 2のブート処理
推奨
GRUB 2のインストール
CygwinでGRUB 2をインストールします。
Cygwin上でGRUB 2のパス設定をします。
GRUB 2のパッケージ内容
インストールされる内容
インストールされるGRUB 2のツール
grub-bin2hのオプション
grub-editenvのオプション
grub-fstestのオプション
grub-mkelfimageのオプション
grub-mkfontのオプション
grub-mkimageのオプション
grub-mkisofsのオプション
grub-mkpasswd-pbkdf2のオプション
grub-mkrelpathのオプション
grub-mkrescueのオプション
grub-script-checkのオプション
grub-installのオプション
grub-mkconfigのオプション
grub-mkdevicemapのオプション
grub-probeのオプション
grub-rebootのオプション
grub-set-defaultのオプション
grub-setupのオプション
重要なGRUBのコマンドと設定ファイル
grub-installコマンド
grub-mkconfigコマンド
grub-mkrescueコマンド
GRUB 2のレスキューイメージの作成
GRUBのレスキューイメージを作成してみる
GRUBをVirtualBoxで起動してみる
VirtualBoxでGRUBのレスキューイメージを読み込む設定を行う。
GRUBから起動できる自作OS(カーネル)の作成
マルチブート仕様(ベーシック)
マルチブート仕様の概略
マルチブートヘッダー
マルチブートヘッダーの実装
カーネルをロードする物理アドレスの定義
magicフィールドの定義
flagsフィールドの定義
checksumフィールド
残りのアドレスフィールドについて
グラフィックフィールドの定義
C言語用のマルチブートヘッダー定義
OS起動時のマシン状態
マルチブート情報
マルチブート情報の定義
マルチブート仕様のヘッダー定義まとめ
GRUBから起動するカーネルを作成する
マルチブートヘッダーを作成する
multiboot.S
カーネル本体を作成する
カーネルをコンパイルする
[multiboot.S]
[kernel.c]
マルチブートヘッダーとカーネルイメージの結合
(補足)ELFフォーマット以外のカーネルイメージの作成
GRUBから自作OS(カーネル)を起動する
自作カーネルをフロッピーディスクに入れる
GRUBを起動する
GRUBから自作カーネルを起動する
GRUBの設定とメニューからの自作OS起動
編集したgrub.cfgをレスキューイメージに入れる
付録その1 カーネルをメモリーの3GBにロードするには
カーネルをメモリーの3GB(0xC0000000)にロードするには
カーネルをなぜ0xC0000000に置くのか
物理アドレスアドレスから仮想アドレスへのマッピング
カーネルを0x00000000からストレートマッピングする場合
カーネルを0x00100000からストレートにマッピングする場合
カーネルを0xC0000000からストレートにマッピングする場合
カーネルを0xC0000000にロードする
マルチブートヘッダーとカーネルのロード部を作成する
1.ページディレクトリの作成
2.ページディレクトリの設定
3.ページサイズを4MBに設定
4.ページングON
5.パイプラインのフラッシュ
6.カーネルのエントリーを呼び出します
ここまでのまとめ。multiboot.Sの全体。
リンカースクリプトの作成
付録その2 マルチブート仕様
マルチブート仕様概要
マルチブート仕様について
マルチブート仕様が想定しているアーキテクチャー
マルチブート仕様が想定しているOS
マルチブート仕様に基いて設計するブートローダーについて
ブート時にOSに渡すパラメーター情報について
OSの開発について
ブートモジュールについて
マルチブート仕様で使用する型式
マルチブート仕様で仕様する助詞の定義について
マルチブート仕様
マルチブートヘッダー
マシン状態
(参考)CR0制御レジスターとEFLAGSレジスター
CR0制御レジスター
EFLAGSレジスター
ESPレジスター、GDTR、IDTRについて
ブートローダーが設定しておくべきのその他のマシン状態
マルチブート情報のフォーマット
実装例と注意事項
パソコンでの注意事項
マルチブート情報のflagsのビット0について
マルチブート情報のflagsのビット1について
マルチブート情報のflagsのビット6について
BIOSデバイスマッピングテクニック
データ比較テクニック
I/O制限テクニック
OSのプログラム例
[multiboot.h]
[boot.S]
[kernel.c]
コンパイル
[2016/1/12]
GRUBのインストールをソースコードからインストールする説明に変更しました。