Nighpher、私はあなたの質問に答えようとしますが、ブートプロセスのより包括的な説明については、IBMの記事を試してください。
OK、説明のためにブートローダーとしてGRUBまたはGRUB2を使用していると思います。まず、BIOSがディスクにアクセスしてブートローダーをロードするとき、有名な13h割り込みに保存されているディスクアクセス用の組み込みルーチンを使用します。ブートローダー(およびセットアップフェーズのカーネル)は、ディスクにアクセスするときにこれらのルーチンを使用します。BIOSはプロセッサのリアルモード(16ビット)モードで実行されることに注意してください。したがって、リアルモードの各アドレスはsegment_address * 16 +オフセットで構成されるため、2 ^ 20バイト以上のRAM(2 ^ 16ではなく2 ^ 20バイト)をアドレスできません。 、セグメントアドレスとオフセットの両方が16ビットである場合、http://en.wikipedia.org/wiki/X86_memory_segmentationを参照してください。したがって、これらのルーチンは1 MiBを超えるRAMにアクセスできません。これは厳密な制限であり、大きな不便です。
BIOSは、MBR(ディスクの最初の512バイト)からブートローダーコードを直接読み込み、実行します。GRUBを使用している場合、そのコードはGRUBステージ1です。このコードはGRUBステージ1.5をロードします。GRUBステージ1.5は、DOS互換領域と呼ばれるディスクスペースの最初の32 KiBにあるか、ファイルシステムの固定アドレスから読み込まれます。これを行うためにファイルシステムを理解する必要はありません。原因は、ステージ1.5がファイルシステムにあり、「生の」コードであり、RAMに直接ロードして実行できるためです:http : //www.pixelbeat.org/ docs / disk /。ディスクからRAMへのstage1.5のロードでは、BIOSディスクアクセスルーチンが使用されます。
Stage1.5にはファイルシステムユーティリティが含まれているため、ファイルシステムからstage2を読み取ることができます(それでもBIOS 13hを使用してディスクからRAMに読み取りますが、iノードなどに関するファイルシステム情報を解読し、生のコードを取得できます)ディスク)。古いBIOSは、ディスクアドレッシングモードの制限により、HD全体にアクセスできない場合があります-シリンダーヘッドセクターシステムを使用し、最初の8 GiBを超えるディスクスペースをアドレス指定できない場合があります:http://en.wikipedia。 ORG /ウィキ/シリンダー・ヘッド・セクター。
Stage2 はカーネルをRAMにロードします(これもBIOSディスクユーティリティを使用)。2.6+カーネルの場合は、initramfsもコンパイルされているため、ロードする必要はありません。古いカーネルの場合、ブートローダーはスタンドアロンinitrdイメージもメモリにロードするため、カーネルはそれをマウントし、ディスクから実際のファイルシステムをマウントするためのドライバーを取得できます。
問題は、カーネル(およびRAMディスク)の重量が1 MiBを超えているため、RAMに読み込むには、カーネルを最初の1 MiBに読み込んでから保護モード(32ビット)にジャンプし、読み込んだカーネルをハイメモリに移動する(無料)リアルモードの最初の1 MiB)、次にリアル(16ビット)モードに戻り、ディスクから最初の1 MiB(別のinitrdと古いカーネルの場合)にramdiskを取得し、おそらく保護(32ビット)モードに切り替えます。所属する場所に置き、可能であればリアルモードに戻り(または/programming/4821911/does-grub-switch-to-protected-mode)、カーネルコードを実行します。警告:説明のこの部分の完全性と正確性については完全にはわかりません。
さて、最終的にカーネルを実行すると、すでにブートローダーによってRAMにRAMディスクがロードされているので、カーネルはramdiskのディスクユーティリティを使用して実際のルートファイルシステムをマウントし、ルートをピボットできます。カーネルにramfsドライバーが存在するため、もちろんinitramfsの内容を理解できます。