Linuxの起動
本頁では、Linuxの起動から終了までの一連のプロセスに特化して解説する。
なお、ディストリビューションによって多少異なる点もあるが、本頁ではできる限り汎用的に説明を行う。
また、ここでの前提はIA(x86系)であることを前提とする。
起動の流れ
IAにおける起動(ブート)のプロセスは、以下の順に制御を移す。
- 電源スイッチの押下
↓ [ 電源のオンを検知 ]
- 回路上へ電流を流す(電源)
↓ [ 電流・電圧の安定を確認 ]
- タイマチップへシグナル「power good」の送出(電源)
↓ [ シグナルを受信 ]
- CPUへシグナル「reset」の送出停止(タイマ)
↓ [ シグナルからの開放 ]
- ROM上の最初のアドレスの命令を実行(CPU)
↓ [ ジャンプ命令実行 ]
- POSTの処理実施(BIOS)
↓ [ チェック正常終了 ]
- MBRの調査(BIOS)
↓ [ 1段階目のロード完了 ]
- ブートローダの処理実行(1段階目ブートローダ)
↓ [ 2段階目のロード完了 ]
- ブートローダの処理実行(2段階目ブートローダ)
↓ [ カーネルイメージのロード完了 ]
- OSカーネルの制御開始(Linuxカーネル)
↓ [ 初期化の完了 ]
- initプロセスの開始(Linuxカーネル)
電源のオン
電源は、CPUなどのマイクロプロセッサや周辺機器に対して安定した電流を供給する装置である。コンピュータのハードウェアは、電圧が安定している事を前提としたメカニズムを持つため、プログラム実行以前に、電源供給を安定させる仕組みを持たせる必要がある。
(それ故に、コンピュータ用電源は、ハードウェアに必要とされるより多くの電気を必要とする。)
コンピュータの起動は、まずユーザによる電源のオンから開始する。
コンピュータは電源が入ると共に、回路上の電圧や電流が安定することをチェックするため、状態を監視する。
状態が満足すれば、次に電源はタイマチップに対して、シグナル「Power Good」を送出する。
CPUはデフォルトで、タイマチップからシグナル「reset」を受信している状態にあり、この時制御を開始できない。
タイマチップは電源からシグナルを受け取ると、シグナル「reset」を停止する。
つまり、CPUは回路上の電圧や電流の状態が安定するまで、制御を握る事ができないのである。
タイマチップからのシグナル受信が停止しCPUは制御を受け取ると、CPUは早速プログラムの実行を開始する。
CPUは、回路上に焼き付けられたROM上のプログラムから処理を開始する。
この時一番初めに実行されるのは、ジャンプ命令と呼ばれるものであり、言葉の通り、指定されたアドレスへ制御を移し、処理を継続するといったものである。
ジャンプ先(0xffff0)には、後述するBIOSと呼ばれる小さなプログラムが置かれている。
BIOS
BIOS(Basic Input/Output System)とは、日本語で基本入出力システムとも呼ばれ、コンピュータに接続された基本的なディバイスの初期化と管理を行う小さなプログラムである。POST(Power On Self Test)と呼ばれる処理を実行し、ブートディバイスからブートローダを読み込む。
BIOSは、それ自体はマザーボードに取り付けられたROMチップである。設定情報以外の基本的なプログラムは、製造時にROMに焼き付けられた状態で出荷される。(近年はアップデートが可能なものが主流である。)
POSTでは、ビデオ(ディスプレイ出力)チェック、BIOS情報出力、メモリチェックを行う一連の処理である。
ビデオのチェックは優先して行われる。なぜなら、出力が無ければこの後BIOSで行われる様々なチェック処理の進捗をユーザへ伝える術が存在しないからである。BIOSはメモリ上を精査し、ビデオの出力用アダプタを発見する。
この処理の後、BIOSは自身の情報を出力し、メモリのチェックを行う。
コンピュータの起動直後にディスプレイにメモリのカウンタが増える様子が映し出されるが、これはこの処理を表示したものである。
(※メーカ製PCではこれを隠すことが多い。)
メモリチェックでは、同時にメモリの初期化も行っている。
ウォームスタートの場合はメモリ上に実行中のシステムが存在するため、初期化が行えない。そのため、これを判断するためのフラグを持っており、ウォームスタートによる起動であると判断できた場合、メモリチェックはパスされる。
基本的な初期化・チェック作業が一通り完了した後、BIOSは後述するMBR上の情報を参照してOSの起動に必要となる「ブートローダ」を探す。
MBR(マスターブートレコード)
MBR(マスターブートレコード)は、BIOSがブートローダを探す際に参照される起動デバイスの先頭セクタである。
コンピュータは、OSイメージがHDDに限らず、CD、DVD、FDD、どのような記憶装置に入っていても読み込めるよう汎用的に作られている。しかしこれは逆に、我々がコンピュータに対して、OSイメージの所在を伝える義務を持つことになる。そこで、設定画面を通じてBIOSに予めOSイメージの入った記憶装置の位置を設定する。MBRは、BIOSが指定された記憶装置からOSイメージをロードするためのヒントを得る場所であり、これらの手順を行う為の一種の決まりごとである。
記憶装置の指定は、一般的なBIOSであれば複数指定可能であり、順次MBRの確認を行う。そして、最も初めにブートローダを発見した際に、それをメモリ上へロードし制御を渡す。
Boot Loader(ブートローダ)
ブートローダは、OS(カーネルイメージ)をメモリ上へロードする専用プログラムである。
ここでは、ブートローダのひとつであるGRUB(GNU-GRand Unified Bootloader)のver.0.92を例にカーネルイメージへ制御を渡すまでのシーケンスを説明する。
MBRは1セクタ分(4KB)の容量しか持たないため、多くの機能を持ったプログラムを配置することができない。そこでGRUBを中心としたブートローダは、自身のプログラムを2つに分けて構成し、MBR上とディバイス内部の2箇所に配置する。
stage1(ステージ1)
ステージ1は、BIOSから制御が渡される。BIOSはMBRの内容をチェックするためにメモリ上へ1セクタ分のデータを読みこんでいるため、MBR内に配置されているステージ1は、既にロード済みである。
ステージ1の目的は、ステージ2をロードし制御を渡すことである。
ディバイスによってその実装は異なるため、シンプルにはいかない。
ここからは、アセンブラで書かれた処理を追いながらそのプロセスを解説する。
BPB(Beginning of the sector is compatible with the FAT/HPFS BIOS)と呼ばれるディバイスの状態を示すBIOS用のパラメータが格納されている。stage1の処理は、このBPBの後の領域に格納されているため、まずその領域へジャンプを行う。以下はそのアセンブラコード(grub-0.92/stage/stage1.S)である。
46 .globl _start; _start: 56 jmp after_BPB 57 nop
その後、BIOS用ディスクの状態を表すのパラメータが続き、
65 . = _start + 4 66 67 /* scratch space */ 68 mode: 69 .byte 0 70 disk_address_packet: 71 sectors: 72 .long 0 73 heads: 74 .long 0 75 cylinders: 76 .word 0 77 sector_start: 78 .byte 0 79 head_start: 80 .byte 0 81 cylinder_start: 82 .word 0 83 /* more space... */ 84 85 . = _start + STAGE1_BPBEND
GRUBの設定パラメータが続き、
91 stage1_version: 92 .byte COMPAT_VERSION_MAJOR, COMPAT_VERSION_MINOR 93 boot_drive: 94 .byte 0xff /* the disk to load stage2 from */ 95 /* 0xff means use the boot drive */ 96 force_lba: 97 .byte 0 98 stage2_address: 99 .word 0x8000 100 stage2_sector: 101 .long 1 102 stage2_segment: 103 .word 0x800
ようやく先ほど指定したジャンプ先へ到達する。
105 after_BPB:
以下は、CLear Interruptと呼ばれる命令である。
これは、スタックの初期化が完了していない段階で割り込みが発生するとである。
108 cli /* we're not safe here! */ 109
その後、再びジャンプ命令を使い、リアルモードによる初期化ルーチンへ進む。
114 ljmp $0, $ABS(real_start)
grubのメモリレイアウトは、以下の通りである。
2段階目のブートローダは機能が豊富で、複数のOSイメージ(カーネルイメージ)を選択することも可能である。
以下は、Linuxで利用される有名なブートローダである。
GRUB(GNU GRand Unified Bootloader)
多種に渡るファイルシステムを認識し高度なシェル機能を搭載していることから、多くのディストリビューションによって採用されている。
GRUBでは、実行プロセスをステージと呼ばれるプログラムに分割し、実行される。
・ステージ1
MBR内に配置されている小さなプログラム。MBRは小さいため、次のステージのプログラムを呼び出すことに特化している。
BIOSが指定されたアドレスへデータをロードする際には、
ステージ1.5 | |
ステージ2 |
LILO(LInux LOader)
GRUBより古くから利用されていたブートローダである。機能面で劣るため、現在はGRUBにその地位を奪われている。
- 最終更新:2009-12-05 15:38:14