6

リセットベクターのウィキペディアページには次のように書かれています(386以上のプロセッサの場合):

リセット時の CS レジスタのセレクタ部分の値は F000h、CS レジスタのベース部分の値は FFFF0000h、リセット時の IP レジスタの値は FFF0h で、セグメント化されたアドレス FFFFF000h:FFF0h をリアル モードで形成します。 .

コンピューターの起動に関する私のすべての読書は、プロセッサがリアルモードで起動することを示しているため、「セレクター」は表示されません。では、なぜここで言及するのですか?また、ここで言及されている「ベース部分」とは何ですか。また、どのレジスタに格納されていますか? 基本的に、リセット ベクターが 386 プロセッサと以前のプロセッサでどのように異なって設定されているかがわかりません。

4

2 に答える 2

4

アクセスする必要があるアドレスは、メモリの最後の 16 バイトです。これは、リセット ベクターが格納されている場所です。

CS の値が異なるのは、8086/80186 プロセッサと 80286+ プロセッサの違いによるものです。80286 プロセッサ以降では、システムでのメモリのアクセス方法と使用方法を指定するグローバル記述子テーブル (GDT) が存在します。8086 には GDT がなかったため、メモリ アクセスは基本的に固定されていました。 286+ のリアル モードでも、GDT エントリが存在します。

参照するベース値とセレクター値は、GDT エントリのベース部分とセレクター部分にすぎませ

したがって、GDT エントリが存在し、すべてのプロセッサ モードで 286 以上のプロセッサに影響を与えるため、リセット ベクターは異なる方法で設定されます。新しく起動したシステムでは、次の segment:offset 値が使用されます。

8086/80186 (16-bit):             0xFFFF:0x0000
80286      (16-bit):             0xF000:0xFFF0
80386+     (32-bit):         0xFFFFF000:0xFFF0
           (64-bit): 0xFFFFFFFFFFFFF000:0xFFF0

基本的に、80286 以上のプロセッサでは、32 ビット プロセッサと 64 ビット プロセッサでセグメント値が符号拡張されることを除いて、オフセットとセグメント値は同じです。

于 2014-06-14T01:13:13.190 に答える
1

はい、電源投入後、すべての 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 では、「セグメンテーション」を自由に無効にすることはできません。あなたはそれに対処しなければなりません。詳細については、セグメンテーションを含む「保護モード」をお読みください... 残念ながら (または幸いなことに?) セグメンテーションは廃止され、廃止されました。代わりに、ページングが保護メカニズムとして成功しています。

ところで、ウィキペディアの記事の中には、悪いロジックで編集されているものもあるようです。気をつけてね!!!

于 2015-09-22T15:55:29.197 に答える