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