OSブートの仕組み

概要

OSの起動の仕組みについて調べたのでまとめてみた*1

内容

まず、Windowsから

  • 初期段階 ハードウェアとBIOS
  • 中間段階 HDDにインストールされたプログラムがブートプロセスを進める(PC/AT互換機共通)
  • 最終段階 システム・ソフトウェアを起動(OS固有)

以下、詳細に記述

  1. 電源を入れる。
  2. マザーボード上のBIOS(Basic Input/Output System)が起動する。
  3. BIOSによるPOST(Power On Self Test)が実行される。*2
  4. 起動ディスクの発見
  5. HDDの先頭にあるMBR(Master Boot Record)を読み込む。
  6. ブートローダーによるMBR内のパーティションテーブルのスキャン
  7. ブートローダーはパーティションテーブルの情報からアクティブな基本パーティションの開始位置に記録されたブートセクターを読み込む。
  8. ブートセクタのIPL(イニシャル・プログラム・ローダー)に移る。

windows NT系の場合

  1. IPLはNTLDR(NT Loader)を読み込む。*3
  2. NTLDRが「NTDETECT.COM」を実行し、ハードウェアの互換性をチェックする。
  3. レジストリの参照・変更
  4. カーネルの「NTOSKRNL.EXE」やドライバ、各種DLLの起動
  5. Windows起動

Linuxの場合
windowsと同じく3段階に分かれる。

  • ブートローダ段階 電源ONからliloやgrubといったブートローダソフトウェアが起動
  • カーネル段階 メモリ上に読み込まれたカーネルが起動し,CPUやメモリ,周辺機器の認識や初期化を行う段階
  • /sbin/init段階 ハードウェアの初期化を終えたカーネルから処理を委ねられた/sbin/initが/etc/inittabの設定に従ってシステムの動作に必要な各種サービスを起動していく段階

以下、詳細に記述。

  1. 電源を入れる
  2. マザーボード上のBIOS起動
  3. BIOSによるハードウェアの認識・初期化(CPUやメモリ,接続されている各種拡張カードetc)
  4. HDDの先頭セクタに書き込まれたMBRの起動
  5. MBRのstage1がstage2を読み込む。
  6. 起動メニューの表示
  7. 指定されたカーネルとinitrdを読み込む。
  8. カーネルは初期化用ramdiskを読み込む。
  9. ramdiskはモジュールドライバ(SCSIアダプタやUSBコントローラに応じたドライバ,LVM構築に必要なドライバ,ext3ファイルシステム用のドライバなど)をカーネルに組み込む。
  10. CPUやメモリ,接続されている周辺機器の認識や初期化を行う*4
  11. ルートパーティションのマウント
  12. /sbin/initの起動
  13. デフォルトのランレベルを認識
  14. システムの初期化のために/etc/rc.d/rc.sysinitを起動
  15. それぞれのランレベルに応じたサービス(プロセス)を起動
  16. /sbin/mingettyを6つの仮想端末に対して実行し,コンソールからのログインを待つ
  17. /etc/X11/prefdm経由でX Window System用のディスプレイマネージャを起動

以下はほとんどwikipedia情報ままである。

POST(Power On Self Test)とは?

  1. BIOSコード自体が問題ないかチェックする。
  2. POST を実行する契機が何なのかを特定する。
  3. システムのメインメモリを探し、大きさを調べ、問題ないか検証する。
  4. 全てのフロントサイドバスとデバイスを検出し、初期化し、登録する。
  5. 必要ならば、個別のBIOS群に制御を渡す。
  6. システム設定のためのユーザインタフェースを提供する。
  7. ブート可能なデバイスを特定し、選択する。
  8. 対象OSが必要とするシステム環境があれば、それを構築する。

マザーボードによるエラー通知はPOSTによって行われる。

MBR(Master Boot Record)とは?

PC/AT互換機の場合ここの長さは512バイトで、0(先頭セクタ)〜445バイトはブートストラップローダ、446〜509バイトはパーティションテーブル、510〜511バイトはブートシグニチャがそれぞれ格納されている。MBRの512バイトの部分に書き込まれているのが「ブートローダ」と呼ばれるソフトウェアである。

ブートストラップローダとは?

  1. パーティションテーブルを4つのテーブルエントリーの先頭から検査し、起動フラグが立っている基本領域がないか探す。
  2. 起動フラグの立っている基本領域が見つかったらその領域の先頭位置をパーティションテーブルから取得する。
  3. BIOSにその位置を示してメモリにロードしてもらい、制御を受け渡す。

パーティションテーブルとは?

パーティションに関する情報を記録している。4つのエントリがあり1つあたり16バイトである。各エントリにはそのパーティションの位置情報、種類、起動フラグが記録されている。

参照

以下のサイトやブログを参考にさせていただきました。
この場を借りてお礼を申し上げます。
ありがとうございました。

  • Nobusan's Square ブートの仕組み

http://nobumasa-web.hp.infoseek.co.jp/boot/boot.html

http://ja.wikipedia.org/wiki/Power_On_Self_Test

  • Penguin's campus note OS のブートシーケンス

http://www14.plala.or.jp/campus-note/vine_linux/install/boot_sequence.html

  • IT Pro

本当に知っている?Windowsの基礎
Windowsはどうやって起動しているのか?
http://itpro.nikkeibp.co.jp/article/COLUMN/20080929/315572/

ソースコードリテラシーのススメ
第13回 起動の仕組みを読む
http://gihyo.jp/dev/serial/01/sc-literacy/0013

*1:間違えているところを見つけた方コメントくださるとうれしいです。

*2:以下、一部内容が重複している可能性あり。POSTとは?参照のこと

*3:この後、複数のOSがインストールされている場合はOS選択画面が表示される。

*4:3でも初期化してまたここでも初期化?