PCが最初に起動すると、物理アドレス0xffff0で実行が開始されます。このアドレスには、BIOSへのjmp命令が含まれています。
今私の質問では、私は常に物理アドレスがRAMにマップされていると仮定しています。RAMに最初にガベージ値が含まれている場合、jmp命令を0xffff0に正確に配置するものは何ですか?jmp命令は常に同じですか、それともBIOSごとに異なりますか?0xffff0はRAMからBIOSにマップされますか(「ハードマップ」されていることを意味します)?
上位64kB程度は、RAMではなくBIOSROMにマップされます。
PCの起動シーケンスを見てください。Ignacioがすでに回答しているように、BIOS読み取り専用メモリに「ハードマップ」されています。
このIntelマニュアルをチェックしてください:
9-6ページ以降に進むと、CPUの初期起動モードがすべて説明されています。フェッチされる最初の命令は、ffffff00(ROM BIOSにハードワイヤード)からのものです。
The first instruction that is fetched and executed following a hardware reset is
located at physical address FFFFFFF0H. This address is 16 bytes below the
processor’s uppermost physical address. The EPROM containing the software-
initialization code must be located at this address.
そして、この段階でそれはまだリアルモードであることを思い出してください:
The CS register has two parts: the visible segment selector part and the
hidden base address part. In real-address mode, the base address is normally
formed by shifting the 16-bit segment selector value 4 bits to the left to produce a
20-bit base address. However, during a hardware reset, the segment selector in the
CS register is loaded with F000H and the base address is loaded with FFFF0000H. The
starting address is thus formed by adding the base address to the value in the EIP
register (that is, FFFF0000 + FFF0H = FFFFFFF0H).
さらに、図9-3で、64Kメモリの場所(ffffffffからffff0000まで)を確認します。これは、RAMではなくEPROMまたはシステムBIOSがあることを示しています。
図8.4を参照してください: http ://www.iakovlev.org/index.html?p = 946
実際、それよりも少し複雑です。まず、386以降のプロセッサでは、実際にはfffffff0(つまり、32ビットアドレス空間の先頭より16バイト短い)から始まります。プロセッサが最初にファージャンプ命令を実行するまで、リアルモードで実行している場合でも、32ビットアドレス空間全体を表示するために特別なマッピングを行います。ファージャンプが実行されると、「通常の」リアルモード動作が開始されます。
いずれにせよ、ハードウェア側では通常、(フラッシュ)ROMがその場所にマップされているため、実行を開始すると、ROM内のコードが実行されます。ただし、最初に実行されるのは実際にはBIOSではありません。実際のBIOSをROMからRAMに解凍し、そのRAMをBIOSアドレス範囲に再マップするだけのコードです。