11

ウィキペディアから: 8086 プロセッサのリセット ベクターはアドレス FFFF0h にあります。リセット ベクターはどこに保存されますか?

4

2 に答える 2

18

CPU のリセット ベクター (この場合は FFFF0h) のアドレスは、設計によりハードウェアで固定されています。CPUの仕様の一部です。CPU はそのアドレスに移動し、そこで見つかったアドレスをフェッチし、そのアドレスにジャンプして実行を開始します。これは、固定された最初のステップ (CPU はアドレス FFFF0h に移動します。これは、ある種の ROM にある可能性が最も高い) と、マシンに依存する 2 番目のステップを持つ一種の二重間接化です。PC では、ベクトルはブート プロセスを開始する BIOS の初期初期化コードを指しますが、より一般的には、そのアドレスにハードウェア メモリ マップできるものなら何でも構いませんが、99.9% の確率である種の ROM (PROM、EPROM、EEPROM など)。

たとえば、アドレス空間が 32 ビットの CPU の設計仕様が、コールド ブート (電源オン) ベクターが 0xffff4、リセット ベクターが 0xffff0、意図が下位 1MiB (0x00000 ~ 0xfffff) であるとします。 ) は、ROM ブート コード用に予約されています。そのアドレス空間にマッピングされた 1MiB ROM 用のソケットを備えたボードを購入したとします。

次に、このマシン用の ROM BIOS を作成します。これは、たとえば、約 0.5 メガバイトです。コンパイラとアセンブラをいじった結果、必要な最初のコードが含まれるオブジェクト コード ファイルができあがります。電源投入時に実行すると、ファイルへの 0x1230 バイトのオフセットがあり、そこで少し超基本的なセットアップを行い、ファイルのオフセット 0x3210 にジャンプします。ここで、コードはウォーム ブートまたはリセットから開始するのに適切です。この場合、オブジェクト コード ファイルを 1MiB にパディングし、値 0x00003210 がオフセット 0x000ffff0 にあり、値 0x00001230 がオフセット 0x000ffff4 にあることを確認します。

ファイル オフセットが 0x00000000 ~ 0x000fffff の範囲のアドレスに直接変換されるように、アドレス 0x0 から始まる互換性のある ROM にファイルを焼き付けます。マシンの電源を入れると、すぐにアドレス 0x000ffff4 に移動し、そこで値 0x00001230 を検出し、その値を命令ポインタ (またはプログラム カウンタなど、任意の名前) にロードし、アドレス 0x00001230 で実行を開始します。は。

CPU は、リセットされたか、完全にオフになってから再びオンになったかを認識します。CPU がリセットされた場合(たとえば、トリプル フォールトによって)、アドレス 0x000ffff4 に移動する代わりに、0x000ffff0 のリセット ベクターに移動し、値 0x00003210 をロードして、その実行開始します。これは基本的に、再起動時に PC が POST をスキップできる方法ですが、電源をオフにして再度オンにしたときはスキップできません。「寒い」か「暖かい」かによってベクトルが異なります。

実際には、最近の CPU はほぼ確実に、アドレス バスやデータ バスに近づいてリセットまたはブート ベクトルを取得する前に、一連のマイクロコードを内部で実行します。このマイクロコードは CPU にアップロード可能である可能性が非常に高いですが、アーキテクチャ レベルでの基本的な考え方は変わりません。 ) は、「アドレス 0x01230 へのジャンプ」に相当する命令を含むリセット アドレスの「ベクトル化」を手動で効果的に実行します。

于 2014-03-10T22:32:20.163 に答える