3

x86 の保護モードの部分を調べています。GDTについて学びました。以前に、保護モード (つまり、すべての 32 ビット アドレス ラインを使用する) に入るには、A20 ゲートを有効にする必要があることを調べました。では、A20 を有効にするコードは 16 ビットである必要があります。最近、wiki.osdev サイトを調べたところ、A20 を有効にするコードが x86 アセンブリで記述されていることがわかりました。X86 アセンブリは、16 ビット モードでロードできない 32 ビット オペコードを生成しますか?

可能であれば説明してください。ありがとうございました。

4

2 に答える 2

11

8086 アドレッシング モデルでは、16 ビット セグメントと 16 ビット オフセットを組み合わせてsegment * 16 + offset.
最小アドレスは000000hで、最大アドレスは10ffefhです。
後者は技術的には 21 ビットの値ですが、CPU には 20 ビットのアドレス バスしかなかったため、アクセス可能な最大のアドレスは0fffffh 1でした。

0fffffhより上のアドレスは単純に2でラップされているため、10ffefhは0ffefhのエイリアスです。
一部のプログラムはそれに依存し始めました。

80286 が登場したとき、アドレス バスは 24 ビットでした。10ffefh
のようなアドレスはラップアラウンドしなくなりました。 当時、古い動作をエミュレートするにはあまりにも多くのトランジスタが必要だったため ( AND で10ffefhをマスクすることはできません)、A20 マスクが導入されました。

名前が示すように、21 番目のビットであるアドレス ライン 20 は、8055/8042 チップの特定のレジスタの特定のビットと AND 演算されます。
BIOS は起動時にそのビットをクリアしたため、21 番目のビットが強制的にゼロになり、古い動作がエミュレートされました。

A20 を有効にしない場合、すべての物理アドレスの 21 番目のビットは常にゼロになります。


「32ビットモード」に最も近いフラットモデルでプロテクトモードでA20を有効にすることは可能ですが、コードをメモリに配置する際には注意が必要です。

x86 アセンブリは、アセンブラーにターゲット サイズを伝えるだけで、16 ビットまたは 32 ビットのコードを生成するために等しく使用できます。


1たとえば、セグメント0f000hとオフセット0ffffhによって指定されます。
2 21 番目のビットは単に破棄されました。
3簡単に言えば、16 ビットまたは 32 ビットのコードを書いている場合です。

于 2016-07-18T18:12:25.970 に答える