起動が難しい
起動...まあ...それは本当に一番難しい部分です。コンピュータが起動するたびに、それは基本的に新たに会います。さまざまな部分に慣れており、それぞれの部分で能力を獲得します。しかし、それは、いわば、自力でブートストラップを実行する必要があります。
ブートプロセスを設計する際の秘theは、マシンを段階的に起動することです。起動は高速で信頼性が高く、毎回完全に未知の環境にある両方でなければなりません。Real / Protectedモードでの会話に挑戦することさえありません(私ができると言っているわけではありません)が、起動時に多くのことが行われています。コンピューターは、段階的な段階でさまざまなコンポーネントを同化するたびに、同化します。おそらく、これらの中で最も重要なのは、オンボードコードの実行からオンディスクコードの実行、つまりカーネル実行への移行です。これは、ファームウェアが(表面上)オペレーティングシステムに降伏するときです。
何年も前、これはそうではありませんでした。以前はBIOSでしたが、実際にはBasic In / Outでした。通常のプログラムは、画面の描画やディスクへのアクセスなどのためにファームウェアを呼び出します。これらは割り込みと呼ばれていました。古い帽子は、新しいドットマトリックスまたはUSRにIRQを割り当てるときによく見かけるスリルを味わうために、最もよく覚えているかもしれません。
INT13H
BIOSがディスクアクセスのサービスとして提供するのは、割り込み(またはINT
アセンブリ言語)13Hシリーズの機能です。これらは、ブートプロセスのBIOSシステムでファームウェアからディスクにジャンプするために今日でも使用されています。
BIOSシステムは、検出した各ディスクの最初の数バイトをチェックし、マスターブートレコード(またはMBR
)として認識するパターンを探します。これは数十年前の事実上の標準であり、ディスクのヘッドに書き込まれる生の実行可能なバイナリが少し含まれています。MBRは、BIOSディスクを起動可能としてマークします。見つかった場合はチェックを停止します。したがって、実際には、巧妙なトリックを使用しなくても1つだけが得られます。見つかった場合は、メモリにマップして実行します(リアルモードでは、まだそこに行きません)。
実行されたMBRはほとんど間違いなくシステムカーネルではありません。512バイト(ギブまたはテイク)はその部門ではほとんど役に立ちません。これはおそらく、ブートローダー( BIOSの多くのアドレス指定制限の1つを克服するために特別に設計されたプログラム)であり、具体的には、いかなる種類のファイルシステムもまったく理解しないことです。
ブートローダーが実際のカーネルを読み取り、メモリで実行するとき(私たち全員が毎回祈っています)、おそらくINT13H
割り込み呼び出しを介してBIOSに尋ねることによってそうします。そして、そうでない場合-多くのより洗練されたブートローダーが従来の意味でファイルシステムをマウントし、コードを別の方法で実行します-ブートローダーがINT13H
1つまたは2つなくてもそれほど空想を持っている可能性はほとんどありません。多くの場合、ブートローダーは、最初に割り当てられた512バイトがニーズにさえ合わないため、自分自身またはさまざまな段階でチェーンロードする必要があります。
鶏肉と卵
これはすべて、ディスクについて議論する回り道ですが、この時点までに、主な問題(鶏と卵のタイプと呼ばれることもある)がプログラム命令を含むディスクにアクセスしていることを十分に明らかにする必要がありますどのようにアクセスディスクに。この問題の鍵はファームウェアです-そして、EFIシステム上でも非常に異なる方法であり続けます-そして、最も弱いかどうかにかかわらず、ファームウェアはブートチェーンの最も重要なリンクです。
カーネルが実行され、ハードウェアにアクセスして制御するための無数のルーチンがすべて開始されると、これらの問題はすべて消滅します(または、少なくとも多少変化します)。しかし、それらが実行されるまで、システムの制限はファームウェアが許可する範囲内でのみ拡張されます。これは多くのことを言っています-BIOSはINT13H
8086 以降ほとんど変更されていません。呼び出しは8086のオリジナルです。はい、(無数の)拡張機能があり、もちろんハッキングもありますが、イノベーションは...?
より良いとより良い
BIOSのほとんどの変更は、せいぜい単なる包帯でした。以前はハードディスクでしたが、物理的にマッピングする必要がありました。データを保存したり、そこから取得したりするときに、ジオメトリのさまざまな特定の側面が参照されました。最終的に、従来のハードディスクはこれを禁止するサイズにまで成長しました。抽象マップだけでも、BIOSが処理するには情報が多すぎます。リアルモードでのみ動作できるため、BIOSはメモリレジスタごとに1 MBに制限されています。シリンダーマップをそれより大きくするか、そのプロパティのいずれかを非常に多くのビットでアドレス指定できるより大きくすると、BIOSは文字通り失われます-範囲外です。
この障壁は何度も満たされ、壊れてきました。マップが抽象化およびエンコードされるたびに、より新しく、賢く、あまり正確ではありません。そのため、最近ではBIOSがドライブを正確にマップすることは文字通り不可能です。論理ブロックアドレス指定は、事実上の標準になりましたが、シリンダー/ヘッド/セクター(またはCHS)の変換が依然として必要です。メインボードのファームウェアが精度/責任において失ったものは、そのような拡張機能が抽象化され、ギャップを埋めるためにディスクファームウェアの責任に追加されました。
あなたの質問で参照されているのは、この猫とマウスのゲームです。BIOSがその大きさのために特定のポイントを超えてディスクを理解できない場合、ブートローダーやカーネルなど、ブート時に取得したいデータは、おそらくそのポイントを超えて配置しない方が良いでしょう。これがどこ/boot
から来たのかです。
実際にはより良い
ありがたいことに、このようなことは、ありがたいことに、BIOSの終byによって無関係になりました。30年が経過しましたが、過去数年でUEFI (またはEFI 2.0)標準にほぼ置き換えられました。UEFIは、1分からマウントを提供し、保護モードで初期化し、独自のブートローダーを組み込み、再起動永続的なフラッシュメモリ変数ストレージを提供し、数千のゼータバイトまたはディスクごとに処理するように仕様化されています...それ以外。完璧とはほど遠いですが、前任者を大きく改善しています。
いずれにせよ、これらすべてをOSカーネルで処理する必要があると考えると、ディスク暗号化またはレイヤードファイルシステムを含む特殊なブートローダーの引数でさえ平たんになり、ブート時にマウントを提供すると、常に明確なそれを実行するためのショット(特に、デフォルト構成のLinuxカーネルはすべてEFIで実行可能であることを考慮して)。
したがって、/boot
おそらく別のパーティションはあまり気にする必要はないはずです。EFIシステムを使用している場合は、EFIモードを起動するための要件であるEFIシステムパーティションに既にアナログがあるでしょう。