0xFFFFFFF0
x86互換CPUは、電源がオンになると命令の実行を開始します。これは、CPUのハードワイヤードで変更不可能な(追加のハードウェアなしで)側面であり、異なるタイプのCPUは異なる動作をします。
最初のBIOS命令が4 GB RAMの「上部」にあるのはなぜですか?
4 GBのアドレススペースの「最上部」にあり、電源投入時にBIOSまたはUEFI ROMがこれらのアドレスの読み取りに応答するように設定されています。
これがなぜであるかについての私の理論:
プログラミングのほとんどすべてが、連続したアドレスでより良く機能します。CPU設計者は、システムビルダーがCPUで何をしたいのかわからないため、CPUがさまざまな目的でスペースの真ん中にアドレススマックを必要とするのは悪い考えです。アドレス空間の最上部または最下部に「邪魔にならないようにする」ことをお勧めします。もちろん、この決定は、8086がMMUを持たない新しいときに行われたものであることを忘れないでください。
8086では、メモリ位置0以上に割り込みベクトルが存在していました。割り込みベクトルは既知のアドレスにある必要があり、柔軟性のためにRAMに配置することが望まれていましたが、CPU設計者はシステムにどのくらいのRAMが配置されるかを知ることができませんでした。したがって、0から始めてそれらを処理するのは理にかなっています(1978年に8086が発明されたシステムには4ギガバイトのRAMがないため、RAMが0xFFFFFFF0であると期待するのは良い考えではありませんでした)。上限で。
もちろん、少なくとも80286以降では、割り込みベクトルは0以外の別の開始位置に移動できますが、最新の64ビットx86 CPUは8086モードで起動するため、互換性のためにすべてが古い方法で動作します(とんでもないように) DOSを実行できるようにx86 CPUを引き続き必要とするのは2015年のことです)。
したがって、割り込みベクトルは0から開始して上方向に動作するため、ROMは上から開始して下方向に動作しなければなりません。
コンピューターのRAMが1 GBしかない場合はどうなりますか?
32ビットCPUには、4,294,967,296個のアドレスがあり、0(0x00000000)から4294967295(0xFFFFFFFF)までの番号が付けられています。ROMは一部のアドレスで使用でき、RAMは他のアドレスで使用できます。CPUのMMUを使用すると、オンザフライで切り替えることもできます。RAMはすべてのアドレスに存在する必要はありません。
RAMが1 GBのみの場合、一部のアドレスは読み取りまたは書き込み時に何も応答しません。これにより、そのようなアドレスにアクセスしたとき、またはシステムがロックアップしたときに、無効なデータが読み取られる可能性があります。
4 GBを超えるRAM(8 GB、16 GBなど)を搭載したシステムはどうですか?
多少シンプルに保つ:64ビットCPUには、たとえば、より多くのアドレス(64ビットにするものの1つです。たとえば、0x0000000000000000から0xFFFFFFFFFFFFFFFF)があるため、余分なRAMは「適合」します。CPUがロングモードにあると仮定します。それまではRAMがあり、アドレス指定できません。
スタックが何らかの値(この場合、0xFFFFFFF0にある値)で初期化されるのはなぜですか?
電源投入時にx86がスタックポインターを割り当てるものについてはすぐには見つかりませんが、システム内のRAMの量がわかると、初期化ルーチンによって最終的に再割り当てする必要があります。(以下のコメントの@Eric Towersは、電源投入時にゼロに設定されると報告しています。)