A20ゲートについて質問です。新しいCPUが古い20ビットバスの代わりに32ビットアドレスバスを取得したときに発生したアドレス「ラップアラウンド」の問題を解決するメカニズムが存在するという記事を読みました。
ラップアラウンドを処理する正しい方法は、A20 だけでなく、A20 ~ A31 のすべてのビットをオフにすることです。
問題を処理するためにビット A20 をオフにするだけで十分なのはなぜですか?
元の問題は、x86 メモリ セグメンテーションに関係していました。
メモリは を使用してアクセスされます。ここで、とはsegment:offset
両方とも16 ビット整数でした。実際のアドレスは として計算されました。20 ビットのアドレス バスでは、これは当然最下位の 20 ビットに切り捨てられます。segment
offset
segment*16+offset
この切り捨ては、同じコードが 20 ビットを超えるアドレス バスで実行された場合に問題を引き起こす可能性がありました。これは、プログラムがラップアラウンドの代わりに最初のメガバイトを超えてメモリにアクセスできるためです。それ自体は問題ではありませんが、これは下位互換性の問題である可能性があります。
この問題を回避するために、彼らはA20
アドレス行を強制的にゼロにする方法を導入し、それによってラップアラウンドを強制しました。
あなたの質問は次のとおりA20
です。A21
A31
segment:offset
16 ビットスキームを使用してアドレス指定できる最大位置は0xffff * 16 + 0xffff = 0x10ffef
. これは 21 ビットに収まります。したがって、行は常にゼロであり、制御する必要があるのはそれだけA21
でした。A31
A20