Unreal modeとはIA-32プロセッサ(及び286)のリアルモードの特殊な状態で、通常は使用できない32ビットのリミットなどを設定した状態のことである。Unreal modeという名前ではあるが、これは俗称で、またx86の別のCPUモードではなくあくまでリアルモードの一種である。
動作原理 80286とそれ以降のx86プロセッサは、効率的な動作のためにリアルモードであってもセグメントレジスタそのものではなくセグメントのデスクリプタキャッシュ内のベースアドレス、サイズ、その他の属性を使用する。そのため、デスクリプタキャッシュ内の値を変更すれば、リアルモードからアクセスできるメモリ領域を変更することができる。
80386以降ではセグメントリミットを4GBに設定すればリアルモードのままで4GBのメモリにアクセスできる。いささか裏技的ではあったが、広く使われたため、それ以降のCPUでも使用可能なまま残された。しかし、Unreal modeはプロテクトモードのOSとは互換性がない。
セグメントレジスタの構造The LOADALL Instruction by Robert Collins 可視部ディスクリプターキャッシュ部 セグメントレジスタ ベースアドレス 属性 セグメントリミット
Unreal modeを有効にする方法 286では、非公開命令のLOADALLを使用してセグメントデスクリプタ内のベースアドレスを変更することで16MBまでのメモリにアクセスできる。
386でもLOADALL命令を使う手法は使用できる。しかし、486(以降)ではLOADALL命令は廃止された。
386以降(IA-32プロセッサ)ではLOADALLではなく別の手法を使うこともできる。一旦プロテクトモードに入り、リミットを4GBに設定したセレクタを 作成し、そのセレクタをセグメントレジスタにロードする。そのあとリアルモードに戻るとリミットが4GBのセグメントを使用できる。アドレスサイズプリフィックスを使えば、リアルモードでもDS:[EBX]のように32ビットレジスタを指定することで0xFFFF(64KB)を超えるメモリにアクセスできる。
脚注