web-dev-qa-db-ja.com

ブートローダーはROM、RAMなどのどこに保存されますか?

ウィキペディアのエントリによると、ブートローダーはROM(メインメモリ(RAM)の一部、そうではないですか?)に格納されている小さなプログラムであり、読み取りのみが可能で、消去はできません。私はここで少し困惑しています。これは、購入するすべてのRAMにデフォルトでブートローダーがインストールされているということですか?また、ブートローダーを含むハードドライブ上にMBR(マスターブートレコード)と呼ばれる領域が通常存在するという本から読みました...

それで、このブートローダーは正確にどこにありますか?異なるオペレーティングシステムは、ブートローダーを異なる場所に保存しますか?

30
xczzhh

ROMはRAMとは別のチップです。内容を保持するための電源は不要で、元々はどのような方法でも変更できませんでしたが、工場から配線されていました。後でPROM、またはProgrammable Read Only Memoryが真のROMを置き換えました。これらのチップは工場出荷時に空であり、チップのビットを本質的に燃やし、状態を変更する特別な手順を使用して一度書き込むことができます。その後、これはEPROM、または消去可能なプログラマブルメモリに置き換えられました。これらのチップには小さな窓があり、紫外線を当てると消去され、再びプログラムできるようになります。その後、これらはEEPROM、または電気的に消去可能なプログラマブルメモリに置き換えられました。これらのチップには、再プログラムできるように消去する特別なソフトウェア手順があります。 ROMは通常、これらすべてのタイプを総称的に参照するために一般的に使用されています。

マザーボードには、ファームウェアを保持するROMチップの種類があります。これは、PC用語では通常BIOSまたはBasic Input Output Systemと呼ばれますが、最近ではEFIファームウェアに置き換えられています。これは、電源投入時にCPUが最初に実行を開始するソフトウェアです。すべてのファームウェアは、ハードウェアの初期化を実行し、通常は診断出力を提供し、ユーザーがハードウェアを構成する方法を提供します。次に、ブートローダーを見つけてロードし、次にブートローダーがOSを見つけてロードします。

PC BIOSを使用すると、ブートすることを決定したディスクから最初のセクターをロードして実行するだけです。これは通常、最初に検出されたハードディスクです。慣例により、マスターブートレコードと呼ばれるハードディスクの最初のセクターには、ディスク上のパーティションの場所を一覧表示するDOSパーティションテーブルが含まれており、ブートローダー用のスペースが残っています。 UbuntuはGRUBブートローダーを使用します。これにより、/boot/grub/core.imgをロードして実行するのに十分なコードがMBRに配置されます。通常、このファイルのコピーはMBRの後のセクターに配置されますが、最初のパーティションの前に配置されます。実際にMBRが読み込むのは、/boot/grub/core.imgの場所を見つけるのが非常に限られた場所MBRで使用可能なスペース。

Grubコアイメージには、ベースgrubコードに加えて、追加のモジュールをロードできるように/boot/grubにアクセスするために必要なモジュール、および起動できるオペレーティングシステムとそれらの場所を説明するgrub構成ファイルが含まれます。 。

Intel Macで使用され、最新のPCマザーボードのBIOSの代替として利用可能になるEFIファームウェアには、ブートローダーファイルを保持する専用パーティションが必要です。ファームウェアは、これらのファイルを見つけてロードするだけでなく、ロードするのに十分なスマートですディスクの最初のセクターにあります。

41
psusi

ROMがメインメモリにありません:

ROMはメインメモリの一部ではありません。これは別のチップであり、ほとんどの場合、より大きなICに組み込まれています。たとえば、PCは複数のROMで構成できます。これらはマザーボードに組み込まれています。

一般的に:

  • ROMのメモリサイズは非常に小さいです。ある意味で、これらのメモリは不揮発性です。ROMに保存されているプログラムは、電源を切っても消去されません。
  • ROMは恒久的なプログラムを保存するために使用されます。これは、ハードウェアが正しく動作するために非常に重要です。
  • ROMの典型的な例はBIOSチップです。非常に低レベルの起動および初期化ハードウェアのプログラムが保存されている場所

あなたは、あなたが著者が「ROMはメインメモリの一部である」と言った記事を読んだと言いました。通常、 メインメモリ はRAMなどの揮発性のメモリを参照するため、これは混乱を招きます。ただし、PCのメモリスペース全体にMain Memoryという用語を使用する場合、ROMはそのメモリスペースの一部です。 一般に、メインメモリはROMなどの種類のメモリを除外することに注意してください。

ブートローダーの保存場所:

最新のシステムでは、2段階のブートロードが使用されます。最初のステップでは、ハードディスクのセクター(ブートセクターと呼ばれることが多い)から小さなプログラムがロードされます。この小さなプログラムは、ブートローダーと呼ばれるディスクのどこかからプログラムをロードします。最後に、ブートローダーがOSをロードします。

Ubuntuシステムに関しては、プロセスは次のとおりです。

  1. PCの電源を入れると、BIOS(ROMに格納されている)が自動的に実行され、PCハードウェアのさまざまな部分が初期化されます。次に、定義された最初のブートデバイス(通常はハードディスク)の特定のセクターをチェックします。このセクターは、サイズが512バイトのブートセクターです。

  2. ブートセクターのプログラムはメモリにロードされます(第1段階)。この小さなプログラムには、次にメモリに読み込むプログラムと、そのプログラムがディスクまたはブートデバイスのどこにあるかという情報があります。そのプログラムをロードします。 Ubuntuでは、/boot/grub/core.imgです。

  3. 第2段階では、OS-Loader、GRUBがカーネルと初期RAMディスクをメモリにロードし、カーネルにハンドオーバー制御を行うことでUbuntuをロードします。次に、カーネルが実行され、ディスプレイマネージャー、Guiなどの必要なプログラムがすべてロードされます。

したがって、ブートローダーはROMにもRAMにも保存されておらず、実際にはハードディスク(またはブート可能なCDROM、USBドライブなどの他のブートデバイス)に保存されており、正確に言えば、 512バイトのサイズで、多くの場合boot-sectorと呼ばれるハードディスク。また、このブートローダーはOSローダー(Ubuntuではgrub)を読み込みますが、これもハードディスク(つまり/boot/grub/フォルダー)に常駐し、タスクはOS(たとえばUbuntu)を読み込みます。

テストとして、ハードディスク(および他のすべての起動デバイス)を取り外して、起動を試みます。 BIOSステップに進むことはできますが、そのステップの後は何も起動できません。ほとんどの場合、BIOSは「No Boot device Found」または「No Operating System found」または同様のメッセージを表示します。

この回答が役立つことを願っています。


詳細については、次のリンクをご覧ください。

  1. http://en.wikipedia.org/wiki/Read-only_memory
  2. http://en.wikipedia.org/wiki/Random-access_memory
22
Anwar

X86互換プロセッサは、常にいわゆる「リアル」モードで起動します。これは、1メガバイトのアドレス可能なメモリが利用可能な16ビットモードです。そのアドレス空間から、プログラム用に640Kが使用可能になり、上記のアドレスはmappedさまざまなデバイスになります。

たとえば、0xA000:0x0000から始まるアドレスはビデオRAMにマッピングされるため、そこにデータを書き込むと、実際には画面にピクセルを表示するビデオアダプターのメモリにデータが書き込まれます。

同様に、 BIOS ROMは0xF000:0000から開始するため、CPUは電源がオンになると、事前に定義された命令から1つずつ命令を実行します住所。 BIOS ROMには、「パワーオンセルフテスト」またはPOSTを実行して起動する初期プログラムが含まれています。ウィキペディアから:

BIOSソフトウェアはPCに組み込まれており、電源投入時にPCによって実行される最初のコードです(「ブートファームウェア」)。 PCの起動時、BIOSの最初のジョブは電源投入時のセルフテストで、CPU、RAM、ビデオディスプレイカード、キーボードとマウス、ハードディスクドライブ、光ディスクドライブなどのシステムデバイスを初期化して識別します。他のハードウェア。 BIOSは、ハードディスクやCD/DVDなどの周辺機器(「ブートデバイス」として指定されている)に保持されているブートローダーソフトウェアを見つけ、そのソフトウェアをロードして実行し、PCの制御を提供します 2 このプロセスは、ブートまたはブートアップと呼ばれ、ブートストラップの略です。

BIOSファームウェアは、ディスクからメモリに最初のセクターを読み取り、制御を小さなプログラムに渡します。小さなプログラムは、そこにある特定のアドレスにあります。 MBR ブートローダーは、(MS-DOSの場合のように)OSの直接読み込みを開始するか、「第2段階」の読み込みを開始します。単一のディスクセクター。

マルチステージアプローチを使用するブートローダーは、オペレーティングシステムをロードするディスクまたはパーティションをユーザーが選択できるテキストまたはグラフィカルインターフェイスでは非常に複雑になる可能性があります。

Uriが示唆しているように、WindowsブートローダーとGRUBが共存できるかどうかに興味がある場合、答えは次のとおりです。実際のMBRには、単一の第1段階ブートローダーのみを含めることができますセクターはわずか512バイトです)が、ブートローダーの第2ステージでは、異なるパーティションからオペレーティングシステムを「チェーンロード」できる場合があります。 WindowsブートローダーはWindowsのみを認識してロードできますが、GRUBはLinuxをロードしたり、 ボリュームブートレコード に格納された別のブートローダーに制御を渡したりできますパーティションのWindows、または他のOSを起動できるようにします。後者のプロセスはチェーンローディングと呼ばれます。

WindowsがインストールされているコンピューターにUbuntuをインストールすると、GRUBがMBRにインストールされ、UbuntuとWindowsの両方を起動できるようになります。

ただし、Ubuntuの後にWindowsがインストールされている場合、GRUBはWindowsブートローダーに置き換えられるため、Ubuntuを再起動するにはGRUBを再インストールする必要があります。

15
Sergey

ブートローダーがROMにあることとMBRにあることについての矛盾は、おそらくbootloaderが使用されているためですマルチステージブートの各状態など、コンピューターに何か便利なことをさせるために最小限のコードをロードする方法を実行するコード。

したがって、開始状態は、プログラム可能なデバイスであるコンピューターを持つことですが、ソフトウェアがロードされていないため、実行するソフトウェアをロードする方法がわかりません。 (したがって、bootfrombootstrapsからプルアップします)。

歴史的に、この問題にはいくつかの異なる解決策がありましたが、最近ではROM(ほとんどの場合厳密にEEPROM)のコードから始めます。これは異なるデバイスを調べて試してみるのに十分です起動可能なものが見つかるまで回します。

(これが、多くのシステムがOSインストーラーディスクをハードディスクドライブに挿入した場合にCDまたはDVDから起動する理由です。そうでなければ、BIOS [私たちが話しているコードやその他の低いコードを含むROMのコード物事を開始するレベルのもの]は、最初にCD/DVDドライブを調べ、次に何も見つからない場合はハードドライブを調べるように設定されます。調整者は、手動で要求しない限り、CD/DVDドライブを無視するように設定することがよくありますドライブに残っている起動できないディスクをスピンアップする時間を無駄にしません)。

ROMのこのコードは時々と呼ばれるbootloaderです。

調べるドライブがわかると、プライマリパーティションに関する情報が含まれるMBRを調べます。MBRで、/または/ bootまたはC:/(Windowsシステムで)ディスクのどの部分がどのパーティションであったかを知っています。各パーティションがどのようにマウントされたかは気にしませんか? -実行する追加の命令を含むコード。 (ちなみに、これはWindowsなどの一部のOSがプライマリパーティションにのみインストールでき、それらのパーティションの詳細はMBRにあり、それがブートローダーが読み取った唯一のパーティション情報であり、EBRをロードしない理由を説明しています論理パーティションについては、それらのパーティションがまだ存在しないという限りです。

その実行可能コードはalsobootloaderと呼ばれます。これと次に来るものを区別したい場合、プライマリブートローダーと呼ばれます(独自のBIOSを作成していない限り、_は無視しますROM制御不能ビット)。

そのコードは非常に小さくなり、約400バイトしか収まりません。したがって、実際に何かを行うには、この制約を処理する必要がないため、さらに多くのコードを読み込むことができます。

このコードは、alsobootloaderとして知られています。これと以前のものを区別したいときは、セカンダリブートローダーと呼ばれます。

そのコードは、おそらくプロセスの最終段階になる可能性があります。 OSが1つしかない場合、またはシステム上のすべてのOSが互換性のあるブートローダーを使用している場合(たとえば、両方がGRUBを使用する2つのLinuxインストールで、最後に更新されたGRUBそれらのいずれか)それから、カーネルでメニュー(必要な場合)のロードを提示し、オペレーティングシステムの制御を渡します。

そのブートローダーと互換性のないOSを使用している場合、チェーンロードされる可能性があります。例えば。同じマシンにWindowsとLinuxがある場合、WindowsをロードするためのGRUBオプションは、実際には、Windowsインストールのみを知っている別のブートローダーをロードし、それに渡します。これはプロセスの第三段階でしたが、セカンダリブートローダーと呼ばれています。これは、実行中の別のセカンダリブートローダーが存在することを知らず、気にもしないためです。その前に。これは、異なるタイプのセカンダリブートローダーを使用したLinuxインストールの場合にも当てはまります。

ほとんどの場合、Linuxの観点からbootloaderについて話すときは、通常ROMコードを意味しません(一部ではありません) Linux、またはLinuxのインストールによって変更されます)。 update-grubを実行すると、セカンダリブートローダーが変更されます。これは通常、特定のインストールの/ bootにあります。 install-grubを実行すると、MBR内のプライマリブートローダーも変更されるため、/ bootがどこにあるか(おそらくソフトウェアRAIDをそのまま開始する)を知るのに十分なコードを持ち、それ、それ自体が実行されます。

したがって、要約すると、ROMはメインメモリ*の一部であると言ったとき、それは分離されていたので間違っていました。 (実際、RAMROMに反意語として扱われます)。それらはプロセスの2つのステップであり、両方ともその名前で呼び出されることがあるため、そことMBRにブートローダーがあったと言うことの両方で正しかったです。また、「異なるOSはブートローダーを異なる場所に保存しますか?」互換性のないセカンダリブートローダーが他のブートローダーを隠す場合(Linuxのインストール後にWindowsをインストールする場合)または要求された場合に他のブートローダーにチェーンロードする場合(その状況を修正する場合、またはWindowsの後にLinuxをインストールする場合)、OS互換性がある場合、セカンダリブートローダーを共有できます(同じタイプのセカンダリブートローダーを使用する別のLinuxの後にLinuxをインストールし、他のLinuxを見ることができる場合(ソフトウェアRAIDが混乱し、チェーンローディングが必要になる場合があります)。

*プログラムでROMとRAMの両方を使用する日では、これは異なっていました。たとえば、ZX Spectrumの場合、ROMは16kiBであり、BASICインタープリターが含まれます。また、48kiBまたは128KiB(ページング)またはRAM(ここで、場合は、基本的にそのBASICインタープリターを起動し、それを使用してテープにあるものを起動します)、RAMのプログラムが使用できるBASICインタープリターからの機能全体がありました(なぜ既知の位置にコンピューターが既にある場合、特に、すべての独自のコードを実行するのに48kiBしかない場合は、trig関数を使用します)。このROMは、RAMと同じ方法で、異なるアドレスにのみ表示されていました。そのような場合、ROMはRAMと同じくらいメインメモリの一部でしたが、書き込み可能ではありませんでした。最近は、ブートの最初の段階を過ぎたら、ROMをほとんど無視します。

4
Jon Hanna

最小限の実用例を作成し、エミュレータで実行してこれらの概念を理解します:

printf '\364%509s\125\252' > main.img
qemu-system-x86_64 -hda main.img

これは、単一のhlt命令を実行する非常にシンプルな「ブートローダー」です。詳細: https://stackoverflow.com/a/32483545/895245

その後、以下を使用して実際のハードウェアで実行できます。

Sudo dd if=main.img of=/dev/sdX

コンピュータのUSBを接続して、そこから起動します。

これを行うと、ブートローダーがUSBやハードディスクなどの永続的なストレージディスク上にあることが明らかになります。

ROMにあるのは、 ファームウェア (またはあまり正確ではないBIOS)と呼ばれるブートローダーを起動するコードです。

昔は、ブートプログラムは、電信機やパンチカードメディアで使用されていたものに似たパンチ紙テープに常駐していました(「両方はもう見えません」)。プロセスはIPLと呼ばれていました。初期プログラムロードの略です。紙テープまたはカードリーダーが利用できない場合、フロントパネルのコンソールを介してプロセッサにバイナリIPLコードを直接入力する必要があります。なんて!

現在、IPLコードはpROMにあり、実行されると、目的のオペレーティングシステムをロード(ブートアップ)するように調整されたセカンダリブートローダーをロードして実行します。セカンダリローダーは、IPLコードが認識している、またはIPLコードでアドレス指定可能なセットアップの任意の部分の任意のメディアに配置できます。

0
Loi