ビッグ リアル モードでは、リアル モード アドレスのエイリアシングが失敗していました。ビッグ リアル モードで、DS の値が 0x6000 であるとします。DS のディスクリプタ キャッシュがリロードされているため (ビッグ リアル モードの定義そのもの)、DS:0 の物理アドレスは 0x60000 ではありません。別のセグメント レジスタで 0x60000 にヒットした場合、それは同じメモリ位置にはなりません。
それではレシピをどうぞ。データ セグメントにスクラッチ変数を作成します。offset
DS との相対関係に注意してください。ES に DS-1 の値をロードし、変数の値を変更して、ES:( offset
+0x10) で同じ値が得られるかどうかを確認します。偽陰性を防ぐために、2 回行います。
これは、仮想 86 モードを検出しません。また、ES がキャッシュされた記述子を介してハイ メモリを指していた場合も、ES をリロードすると失われます。呼び出し元のコードが、ES がそのままであることに依存しないことを確認してください。
ビッグ リアル モードは、それ自体は CPU モードではありません。「現在ビッグ リアルにいる」というレジスタ ビットはありません。これは、バニラ リアル モードの i386 固有のロジックを使用してハイ メモリにアクセスする方法にすぎません。上記の手順は、DS がそのように処理されているかどうかのみを確認します。実装によっては、DOS エクステンダは、DS をバニラのままにしながら、ES 記述子のリロードを介して大きな実数を実装している可能性があります。ウィキペディアによると、CS でさえこのようにエイリアス化されることがありますが、これは割り込みのためにトリッキーな提案です。