11. 仮想8086モード
11.1 仮想8086モードのしくみ
- プロテクトモードでもリアルモード用のプログラムを部分的に実行することができるが、セグメントレジスタへのロードやセグメント間ジャンプ命令をリアルモードと同じように実行することはできない
- 286用のOS/2バージョン1.Xでは、MS-DOS用のアプリケーションソフトウェアを実行するときには一旦リアルモードに戻る仕様であった
- これではプロテクトモードの保護機能は全く働かず、信頼性が犠牲になる
- リアルモードでアプリケーションソフトウェアが暴走しても制御が取り戻せない
- アプリケーションソフトウェアがI/Oポートをアクセスするとオペレーティングシステムは周辺機器の状態を把握できなくなる
- これではプロテクトモードの保護機能は全く働かず、信頼性が犠牲になる
- 仮想8086モードは、セグメントの扱い方をリアルモードと同じにしながらも、プロテクトモードの一部として実行される動作モード
- 仮想8086モードへ移行するためには、EFLAGSレジスタのVMビットを1にセットする
- 一般レジスタで切り替える理由は、モード移行をタスク切り替えや割り込み処理と連動させるため
- 仮想8086モードでのアドレス変換の仕組みは、セグメントレジスタの値を16倍して(4ビット左へシフト)オフセットアドレスの値を加えることによってリニアアドレスを生成する
- リアルモードとの違いは、リニアアドレスがページング機構によって物理アドレスに変換されること
- 仮想8086モードでは、セグメント機構による保護機能が働かないが、以下の保護機能が代わりに働く
- 特殊命令実行不可(常に動作レベル(CPL)が3で実行される)
- I/O許可マップによるポートアクセス制御
- フラグレジスタの変更命令のIOPLによる制御
- 割り込みディスクリプタを介した割り込みの呼び出し
- ページング機構による保護機能(メモリアクセス)
- IDTのディスクリプタにMS-DOSをエミュレートするルーチンを登録しておくことで、仮想8086モードで実行されているMS-DOS用のアプリケーションソフトウェアは、MS-DOS上のファイルをアクセスしているつもりでプロテクトモードのオペレーティングシステムの管理するファイルをアクセスすることができる
- リニアアドレス空間は仮想8086モードとプロテクトモードの双方で共有
- 下位1Mバイトを仮想8086モード
- プロテクトモードはリニアアドレス空間全体を使用できるが、下位1Mバイトは仮想8086モードのプログラムとデータ共有する場合にのみ使用する
- ページング機構は両モードに共通で、プロテクトモードで設定したページ割り当て状態を保って、全く同じ動作を続ける
- 仮想8086モードでは、必ずしリニアアドレスの最下位1Mバイトのアドレス空間を使用するため、複数のタスクを実行することができないように思えるが、タスクごとにページテーブルを切り替えることによって、同じ値のリニアアドレスを使用しながらも、異なる物理メモリを割り当てることができるようになる
11.2 MS-DOSと仮想8086モード
- 8086は最大で1Mバイトまでのメモリを扱うことができるので、その空間をすべてメモリ領域に割り当てていれば、MS-DOSの利用できるメモリ空間は1Mバイトとなるが、実際はブートプログラムやBIOSを格納するROM、画面表示のためのメモリ領域などが必要なので、1Mバイトのアドレス空間の後半はそのための領域(VRAM・ROM領域)として割り当ててある
- 640KバイトのMS-DOSメモリ領域だけではメモリが不足するようになったため、様々な拡張メモリの利用方式が考え出された
- EMSやUMBは、VRAM・ROM領域の空き部分を利用して、メモリを割り当てる方式
- HMA(High Memory Area)
- リアルモードでもA20ビットを有効にすることでプロテクトモードメモリ先頭の64K-16バイトの領域をアクセスできるようになる
- この約64KバイトのメモリのことをHMAという
- MS-DOS5.0からはHMAにDOS本体を置くことによってアプリケーションソフトウェアの利用できるメインメモリを空けておくことができるようになった
- EMS(Expanded Memory Specification)
- メモリ空間を拡張する方式の一つ
- もともとは拡張ボード上の電子回路によって実現するハードウェア方式として考案されたが、現在は仮想8086モードを活用したソフトウェアだけでEMSを実現するソフトウェア方式が主流
- EMSメモリとは、16Kバイトごとのページ単位で扱う拡張メモリのこと
- EMSページフレームとは、8086のの1Mバイトのアドレス空間の一部に割り当てた、16Kバイトのアドレス空間のことで、一般には、VRAM・ROM領域の一部をEMSページフレームとして使用する
- EMSページをアクセスするには、EMSドライバソフトウェアを呼び出して、EMSページフレームをEMSページと連結する
- UMB(Upper Memory Block)
- VRAM・ROM領域にある未使用部分にEMBの一部を割り当てる(UMB)
- EMSでは同じアドレスに対応する物理メモリを切り替えながら使うが、UMBは対応させるメモリは固定されているの
- そのため利用できるアドレス範囲は狭い
- UMBの割り当てを要求する処理を組み込んだソフトウェアでなくても利用できる
- UMBはデバイスドライバソフトウェアや常駐型プログラムなど、主にメモリを占有し続けるソフトウェアをロードするために利用する
11.3 仮想8086モードを体験
- 仮想8086モードへの移行方法は以下の2つがある
- タスク切り替えによる方法
- 仮想8086モードで実行するタスク用のTSSを用意しておき、あらかじめそのTSS中のEFLAGSレジスタを保存する領域のVMビットに当たるビットをセットしておく
- セグメントレジスタを保存する領域にも仮想8086モードにおけるセグメントレジスタの値をセットしておく
- このTSSに対してタスク切り替えを実行すると、タスク切り替えが完了すると同時に仮想8086モードへ移行する
- IRET命令による方法
- 割り込みの仕組みを逆向きに応用する
- スタック領域に仮想8086モードで割り込みが発生した時の状態を作っておくと、IRET命令によって、仮想8086モードへ移行することができる
- タスク切り替えによる方法