はい、電源投入後、すべての x86 CPU はリアル モードになりますが、CS 割り当てが見つかるまで奇妙な動作をします!!!.
いくつかの x86 ドキュメントを読み終えたので、これらは事実です:
電源投入後の「CS レジスタ」、「CS キャッシュ レジスタ」、および「EIP」の初期値は次のとおりです。
CS= F000h (常にあるべき 16 ビット幅!)
CS_segment_start_address= FFFF_0000h (RAM のどこかを指す 32 ビット値?)。CS_segment_length= 0_FFFFh (20 ビット サイズの値、はい、これは 64KB です)。
CS_segment はメモリ内に「存在」しています。
CS_segment は「読み取り/書き込み」チャンクです。
CS_segment が「アクセス」されました。
EIP= 0000_FFF0h
さて、次の人生の事実に注意してください。
==SOF== (事実の始まり)
新しい命令をフェッチするとき (実際のモード、プロテクト モードなど)、ハードウェア アドレッシング ロジックは常に「CS キャッシュ レジスタ」の値を使用して、アドレス バス ピンに配置するアドレスを決定しているようです。具体的には:
Next_Instruction_Address_on_Bus= CS_segment_start_address + EIP
==EOF== (事実の終わり)
したがって、電源投入後、次の数値が得られます。
Next_Instruction_Address_on_Bus = FFFF_0000h + 0000_FFF0h= FFFF_FFF0h
これは、電源投入後、1MB の制限から遠く離れた RAM の最後のコーナーにアクセスできるかどうかを意味します。はい!!!。ホーリーグリア!!!.
でも待って、まだ走ったりジャンプしたりしないで!!! これは、(ソフトウェア開発者によって) うまくいけば BIOS ROM 領域に配置されるコード チャンクへの「はるかなジャンプ」を配置することを目的としています。
ただし、リセット ベクター (0xFFFFFFF0h) の命令がシステム BIOS エントリ ポイント (0x0000: 0x000F0000h) にマップされたメモリ位置へのファー ジャンプであることを確認するのはマザーボードです。要約すると、すべての「マザーボード」はこの「ジャンプ ハック」を実装しています。[この説明をしてくれた Gustavo Duarte に感謝します。彼のスマート ブログをチェックしてください: http://duartes.org/gustavo/blog/post/how-computers-boot-up/]
上記の説明に続いて、言及された最後の 'far jump' は、'CS_segment_start_address' を適切に動作する 'Real Mode' 値で更新するものです。
CS= XYWZ h のような割り当て (far 'jump'、far 'call' などで実行) は、次のように変換されます。
CS_segment_star_address= 000 X_YZW 0h ( XYZWは CS ニブル値)
いつものように 4 ビット左シフト、1MB 制限、64KB セグメント長 cr..p でビジネスに戻ります!!!
最後に、この動作は、電源投入 (ブート?) コードが常に RAM の最後の隅にあることを保証するためのものだと思います。そうすれば、将来の OS 廃棄のために十分な RAM を確保できます。[正直なところ、私にとっては、この「リセット」ベクターを「割り込みベクター テーブル」@ベクター #0 内に配置した方が理にかなっています]。
私が間違っている場合は、私を修正してください。お役に立てれば。
PD: CS キャッシュレジスタとは何ですか? それは、使用中の CS セレクターに関連付けられた記述子の値です。他のすべてのセグメントにも、高速アクセスのためにこの「キャッシュ レジスタ」値があります。x86 CPU では、「セグメンテーション」を自由に無効にすることはできません。あなたはそれに対処しなければなりません。詳細については、セグメンテーションを含む「保護モード」をお読みください... 残念ながら (または幸いなことに?) セグメンテーションは廃止され、廃止されました。代わりに、ページングが保護メカニズムとして成功しています。
ところで、ウィキペディアの記事の中には、悪いロジックで編集されているものもあるようです。気をつけてね!!!