回答:
ROMはRAMとは別のチップです。内容を保持するための電源は必要なく、元々はどのような方法でも変更できませんでしたが、工場から配線されていました。後でPROM、またはProgrammable Read Only Memoryが真のROMを置き換えました。これらのチップは工場出荷時に空であり、チップのビットを本質的に燃やし、状態を変更する特別な手順を使用して一度書き込むことができます。その後、これはEPROM、または消去可能なプログラマブルメモリに置き換えられました。これらのチップには小さな窓があり、紫外線を当てると消去され、再びプログラムできるようになります。その後、これらはEEPROM、または電気的に消去可能なプログラマブルメモリに置き換えられました。これらのチップには、再プログラムできるように消去する特別なソフトウェア手順があります。
マザーボードには、ファームウェアを保持する何らかのタイプのROMチップがあり、PCの用語では通常BIOSまたはBasic Input Output Systemと呼ばれていますが、最近ではEFIファームウェアに置き換えられています。これは、電源投入時にCPUが最初に実行を開始するソフトウェアです。すべてのファームウェアはハードウェアの初期化を実行し、通常は診断出力を提供し、ユーザーがハードウェアを構成する方法を提供し、ブートローダーを見つけてロードし、OSを見つけてロードします。
PC BIOSを使用すると、起動することを決定したディスクから最初のセクターをロードして実行するだけで、通常は最初に検出されたハードディスクです。慣例により、マスターブートレコードと呼ばれるハードディスクの最初のセクターには、ディスク上のパーティションの場所をリストするDOSパーティションテーブルが含まれ、ブートローダー用のスペースが残ります。UbuntuはGRUBブートローダーを使用します。これは、MBRにロードして実行するのに十分なコードを配置します/boot/grub/core.img
。通常、このファイルのコピーは、MBRに続くセクターに配置されますが、最初のパーティションの前に配置されます。MBRで/boot/grub/core.img
使用可能な非常に限られたスペースで場所を見つけるのが難しいため、MBRが実際に読み込みます。
grubコアイメージには、ベースgrubコードに加えて、/boot/grub
そこに追加のモジュールをロードできるようにアクセスするために必要なモジュール、および起動できるオペレーティングシステムとそれらの場所を説明するgrub構成ファイルが含まれています。
Intel Macで使用され、最新のPCマザーボードのBIOSの代替として利用可能になるEFIファームウェアには、ブートローダーファイルを保持する専用パーティションが必要です。ファームウェアは、これらのファイルを見つけて、単に何でもロードして実行するのではなく1ディスクの最初のセクターにあります。
ROMがメインメモリにありません:
ROMはメインメモリの一部ではありません。これは別のチップであり、ほとんどの場合、より大きなICに組み込まれています。たとえば、PCは複数のROMで構成できます。これらはマザーボードに組み込まれています。
一般的に:
あなたは、あなたが著者が「ROMはメインメモリの一部である」と言った記事を読んだと言いました。通常、メインメモリはRAMなどの揮発性のメモリを指すため、これは混乱を招きます。しかし、はい、PCのメモリスペース全体に対してメインメモリという用語を使用する場合、ROMはそのメモリスペースの一部です。一般に、メインメモリはROMなどの種類のメモリを除外することに注意してください。
ブートローダーの保存場所:
最新のシステムでは、2段階のブートロードが使用されます。最初のステップでは、ハードディスクのセクター(ブートセクターと呼ばれることが多い)から小さなプログラムがロードされます。この小さなプログラムは、ブートローダーと呼ばれるディスクのどこかからプログラムをロードします。最後に、ブートローダーがOSをロードします。
Ubuntuシステムに関しては、プロセスは次のとおりです。
PCの電源を入れると、BIOS(ROMに保存されています)が自動的に実行され、PCハードウェアのさまざまな部分が初期化されます。次に、定義された最初のブートデバイス(通常はハードディスク)の特定のセクターをチェックします。このセクターはブートセクターで、サイズは512バイトです。
ブートセクターのプログラムはメモリにロードされます(第1段階)。この小さなプログラムには、次にメモリに読み込むプログラムと、そのプログラムがディスクまたはブートデバイスのどこにあるかという情報があります。そのプログラムをロードします。Ubuntuでは、です/boot/grub/core.img
。
第2段階では、OSローダーGRUBがカーネルと初期RAMディスクをメモリーにロードし、カーネルに制御を渡すことでUbuntuをロードします。次に、カーネルが実行され、ディスプレイマネージャー、Guiなどの必要なプログラムがすべてロードされます。
したがって、ブートローダーはROMにもRAMにも保存されておらず、実際にはハードディスク(または起動可能なCDROM、USBドライブなどの他のブートデバイス)に保存されており、正確に言えば、 512バイトのサイズで、多くの場合boot-sectorと呼ばれるハードディスク。そして、このブートローダーは、OSローダー(Ubuntuではgrub)をロードしますが、これもハードディスク(/boot/grub/
フォルダー)にあり、タスクはOS(Ubuntuなど)をロードすることです。
テストとして、ハードディスク(および他のすべての起動デバイス)を取り外して、起動を試みます。BIOSステップに進むことはできますが、そのステップの後は何も起動できません。ほとんどの場合、BIOSは、「ブートデバイスが見つかりません」または「オペレーティングシステムが見つかりません」または同様のメッセージを表示します。
この回答が役立つことを願っています。
詳細については、次のリンクをご覧ください。
x86互換プロセッサは、常にいわゆる「リアル」モードで起動します。これは、1メガバイトのアドレス可能なメモリが利用可能な16ビットモードです。そのアドレス空間から、プログラム用に640Kを使用でき、上記のアドレスは異なるデバイスにマップされます。
たとえば、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のロードを開始することができます。
マルチステージアプローチを使用するブートローダーは、オペレーティングシステムをロードするディスクまたはパーティションをユーザーが選択できるテキストまたはグラフィカルインターフェイスでは非常に複雑になる可能性があります。
Uriが示唆するように、WindowsブートローダーとGRUBを共存させることができるかどうかに興味がある場合、答えは次のとおりです。実際のMBRには、単一の第1ステージブートローダーのみを含めることができます(セクター全体は512バイトのみです) 、しかし、ブートローダーの第2段階では、異なるパーティションからオペレーティングシステムを「チェーンロード」できる場合があります。WindowsブートローダーはWindowsを認識してロードすることしかできませんが、GRUBはLinuxをロードするか、パーティションの1つのボリュームブートレコードに格納されている別のブートローダーに制御を渡すことができます。後者のプロセスはチェーンローディングと呼ばれます。
WindowsがインストールされているコンピューターにUbuntuをインストールすると、GRUBがMBRにインストールされ、UbuntuとWindowsの両方を起動できるようになります。
ただし、Ubuntuの後にWindowsがインストールされている場合、GRUBはWindowsブートローダーに置き換えられ、Ubuntuを再度起動できるようにGRUBを再インストールする必要があります。
ROMにあるブートローダーとMBRにあるブートローダーについてあなたが言うことの矛盾は、おそらく、ブートローダーが、コードをロードするための最小限の方法を実行するコードに使用されており、マルチステージブートの状態。
したがって、開始状態は、プログラム可能なデバイスであるコンピューターを持つことですが、ソフトウェアがロードされていないため、実行するソフトウェアをロードする方法がわかりません。(したがってブートからのブートストラップからプル自体アップ)。
歴史的に、この問題にはいくつかの異なる解決策がありましたが、最近はROM(ほとんどの場合厳密にEEPROM)のコードから開始します。これは、異なるデバイスを見て、それが見つかるまで順番に試すのに十分です起動可能。
(これが、多くのシステムがOSインストーラーディスクをハードディスクドライブに挿入した場合にCDまたはDVDから起動する理由です。それ以外の場合、BIOS [私たちが話しているコードやその他の低いコードを含むROM上のコード-物事を始めるレベルのもの]最初にCD / DVDドライブを調べ、次に何も見つからない場合はハードドライブを調べるように設定されます。手動で要求されない限り、調整者はしばしばCD / DVDドライブを無視するように設定しますドライブに残っている起動不可能なディスクをスピンアップする時間を無駄にしません)。
ROM内のこのコードは、ブートローダーと呼ばれることもあります。
調べるドライブがわかると、MBRを調べます。MBRには、プライマリパーティションに関する情報が含まれています。後で、/または/ bootまたはC:/(Windowsシステムで)ディスクのどの部分がどのパーティションであったかを知っています。各パーティションがどのようにマウントされたかは気にしませんか?-実行するための追加の命令を含むコード。(ちなみに、これはWindowsなどの一部のOSがプライマリパーティションにのみインストールでき、それらのパーティションの詳細はMBRにあり、それがブートローダーが読み取った唯一のパーティション情報であり、EBRをロードしない理由を説明しています論理パーティションについては、それらのパーティションがまだ存在していないという限りです。
その実行可能コードは、ブートローダーとも呼ばれます。これと次に来るものを区別したい場合、それはプライマリブートローダーと呼ばれます(独自のBIOSを作成していない限り、ROMビットを制御不能として無視するため)。
そのコードは約400バイトしか収まらないため非常に小さくなります。そのため、実際の処理を行うには、この制約を処理する必要がないため、さらに多くのコードを読み込むことができます。
このコードは、ブートローダーとも呼ばれます。これと以前のものとを区別したい場合は、セカンダリブートローダーと呼ばれます。
そのコードは、おそらくプロセスの最終段階になる可能性があります。OSが1つしかない場合、またはシステム上のすべてのOSが互換性のあるブートローダーを使用している場合(たとえば、両方がGRUBを使用する2つのLinuxインストールで、最後に更新されたGRUBのいずれかが起動できる場合)カーネルにメニュー(必要な場合)の読み込みを表示し、オペレーティングシステムの制御を渡します。
そのブートローダーと互換性のないOSを使用している場合、チェーンロードされる可能性があります。たとえば、同じマシン上にWindowsとLinuxがある場合、WindowsをロードするためのGRUBオプションは、実際には、Windowsインストールのみを知っている別のブートローダーをロードし、それに渡します。これはプロセスの第3段階でしたが、その前に別のセカンダリブートローダーが実行されていることを認識せず、気にもしないため、セカンダリブートローダーと呼ばれます。これは、異なるタイプのセカンダリブートローダーを使用したLinuxインストールの場合にも当てはまります。
ほとんどの場合、Linuxの観点からブートローダーについて話すとき、通常はROMコードを意味しません(Linuxの一部ではないか、Linuxのインストールによって変更されます)。行うときはupdate-grub
、セカンダリブートローダーを変更します。これは通常、特定のインストールの/ bootにあります。実行するときinstall-grub
、MBRのプライマリブートローダーも変更するため、/ bootがどこにあるか(おそらくソフトウェアRAIDをそのまま開始する)を知るのに十分なコードを持ち、それが実行されるとそれをロードして実行します。
したがって、要約すると、ROMはメインメモリ*の一部であると言ったとき、あなたは間違っていました。(実際、RAMはROMに反するものとして扱われます)。それらはプロセスの2つのステップであり、両方がその名前で呼び出されることがあるため、ブートローダーがそことMBRにあると言ったのはどちらも正しかったです。また、「異なるOSはブートローダーを異なる場所に保存しますか?」互換性のないセカンダリブートローダーが他のブートローダーを隠す場合(Linuxをインストールした後にWindowsをインストールする場合)または要求があれば他のブートローダーにチェーンロードする(その状況を修正する場合、またはWindowsの後にLinuxをインストールする場合)互換性がある場合はセカンダリブートローダーを共有できます(同じタイプのセカンダリブートローダーを使用する別のLinuxの後にLinuxをインストールし、他のLinuxを見ることができる場合(ソフトウェアRAIDが混乱し、チェーンローディングが必要になる場合があります)。
*プログラムでROMとRAMの両方を使用する日では、これは異なっていました。たとえば、ZX Spectrumの場合、ROMは16kiBであり、BASICインタープリターを含みます。また、48kiBまたは128KiB(ページング)またはRAM(この場合、基本的に起動するもの)に何かをロードするための開始点を提供します。そのBASICインタープリターとそれを使用してテープ上にあるものを起動します)、RAMのプログラムが使用できるBASICインタープリターからの機能の全体がありました(コンピューターが既知の位置に既にある場合にトリガー機能を書く理由) ?特に、独自のコードを実行するのに48kiBしかない場合)。このROMは、RAMと同じ方法で、異なるアドレスにのみ表示されました。このような場合、ROMはRAMと同じくらいメインメモリの一部でしたが、書き込みはできませんでした。
最小限の実用例を作成し、エミュレータで実行して、これらの概念を理解します。
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コードでアドレス指定可能なセットアップの任意の部分の任意のメディアに配置できます。
A small portion of a computer's main memory where the CPU expects to find its initial program is constructed from special nonvolatile memory cells. Such memory is known as read-only memory(ROM)
ます。メインメモリは、RAMとROMの2つの部分で構成されています。いわゆるブートローダーがメインメモリのROM部分にインストールされているかどうかを知りたいだけです... @Sergey