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