Unreal mode
From Wikipedia, the free encyclopedia
動作原理
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)を超えるメモリにアクセスできる。