Unreal mode

Unreal modeとはIA-32プロセッサ(及び286)のリアルモードの特殊な状態で、通常は使用できない32ビットのリミットなどを設定した状態のことである。Unreal modeという名前ではあるが、これは俗称で、またx86の別のCPUモードではなくあくまでリアルモードの一種である。

動作原理

80286とそれ以降のx86プロセッサは、効率的な動作のためにリアルモードであってもセグメントレジスタそのものではなくセグメントのデスクリプタキャッシュ内のベースアドレス、サイズ、その他の属性を使用する。そのため、デスクリプタキャッシュ内の値を変更すれば、リアルモードからアクセスできるメモリ領域を変更することができる。

80386以降ではセグメントリミットを4GBに設定すればリアルモードのままで4GBのメモリにアクセスできる。いささか裏技的ではあったが、広く使われたため、それ以降のCPUでも使用可能なまま残された[1]。しかし、Unreal modeはプロテクトモードのOSとは互換性がない。

セグメントレジスタの構造[2]

可視部 ディスクリプターキャッシュ部
セグメントレジスタ ベースアドレス 属性 セグメントリミット

Unreal modeを有効にする方法

286では、非公開命令のLOADALLを使用してセグメントデスクリプタ内のベースアドレスを変更することで16MBまでのメモリにアクセスできる。

386でもLOADALL命令を使う手法は使用できる。しかし、486(以降)ではLOADALL命令は廃止された。

386以降(IA-32プロセッサ)ではLOADALLではなく別の手法を使うこともできる。一旦プロテクトモードに入り、リミットを4GBに設定したセレクタを 作成し、そのセレクタをセグメントレジスタにロードする。そのあとリアルモードに戻るとリミットが4GBのセグメントを使用できる。アドレスサイズプリフィックスを使えば、リアルモードでもDS:[EBX]のように32ビットレジスタを指定することで0xFFFF(64KB)を超えるメモリにアクセスできる。

脚注

  1. ↑ Cryptographic Security Architecture: Design and Verification. Springer Science & Business Media. (2004). p. 58. ISBN 978-0-387-95387-8 2017年1月4日閲覧. "[…] Unreal mode became so widely used […] that Intel was forced to support it in all later processors, although its presence was never documented […]"
  2. ↑ The LOADALL Instruction by Robert Collins