仮想86モード(かそうはちろくモード)は、IA-32プロテクトモードの特殊なもので、16ビットx868086)のほぼ完全な仮想化の提供をハードウェア的に支援するものであることが特徴である。

概要 編集

仮想86モードの実行環境は、プロテクトモードで動作する仮想86モニタおよび仮想86モードで動作する仮想86タスクの2つで構成される。

仮想86タスクにおいては、セグメントレジスタを使ったアドレスが単純な16ビットシフトしたアドレスのベースに加算されたり、普通の演算命令、ジャンプ命令などはプレフィックスが無い限り16ビットに解釈されたりするなど、8086およびリアルモードに似た動作をする。ただし、仮想86モードは特権レベルが3に固定されているので、CPUの実行モードを制御する命令やソフトウェア割り込み命令、入出力命令、フラグレジスタへのアクセスなどのシステムの動作に関わる命令は制限がかかる。

制限のかかった命令は基本的にはトラップされ、仮想86モニタによって処理されるが、入出力命令は仮想86タスクの制御構造体にある許可ビットマップにより、ポートごとに直接ハードウェアにアクセスするか、トラップを起こして仮想86モニタに制御を移すかを選択できる。また、これに加えてPentium以降に実装された仮想モード拡張 (VME) を使うと、ソフトウェア割り込み命令をタスク内で処理するかどうかを割り込みの種類ごとに設定することや、フラグレジスタへのアクセスをトラップを起こさずに仮想化し、割り込み禁止区間のエミュレーションができるなど、仮想86モードの実行の効率化ができるようになっている。

使用例 編集

通常想定されるような、Windows上でMS-DOSアプリを動かしたり(仮想DOSマシン)、32ビットOS上でグラフィックカード上のROM BIOSにアクセスして初期化するというような用途のほか、x86の制限を緩和する目的では各種トリックが必要だったため、他にも多くの利用があった。

MS-DOSのデバイスドライバとして、仮想86モニタを含み、ページングを行うことによってEMSのインターフェイスを実装する仮想86EMSと呼ばれるものでは、実アドレスにはBIOS ROMなどが存在する640KBから1MBまでの領域を仮想化するために使われている。また、DOSエクステンダでは、プロテクトモードでプログラム本体は動作しつつ、DOSのシステムコールやBIOSのコードはリアルモード相当で動作させる必要があるため、このモードを使っている。

x64(Intel 64やAMD64)の64ビットモード(ロングモード)のもとでは、このモードは使用できない。そのため、エミュレーションなどの新たな対応が必要になっている。

具体例 編集