[PR]看護師の好条件求人なら:転職のプロがサポート!年間5万人が利用

DOSアプリケーションやBIOSコール、割り込みハンドラなどを実現するには 16bitの仮想86モードへの切り替えが必要になります。
では、仮想86モードとは何なのでしょう?

仮想86モードは リアルモードに似た振る舞いをするプロテクトモードです。 リアルモードではありません。
アドレス長やseg:offの計算方法はリアルモードと同じですが、 次のような点が違います。

機能リアルモード仮想86モード
ソフトウェア割り込み(INT命令)割り込みを実行#GP(0)
ハードウェア割り込み・例外割り込みを実行プロテクトモードで割り込みを実行
割り込みハンドラ4バイトのfarポインタ8バイトのdescriptor
IN/OUT命令そのまま実行TSSで許可されていない場合は #GP(0)
CLI/STI命令そのまま実行EFLAGS.IOPL != 3 のとき #GP(0)
PUSHF/POPF命令そのまま実行EFLAGS.IOPL != 3 のとき #GP(0)
IRET命令そのまま実行EFLAGS.IOPL != 3 のとき #GP(0)
特権命令(HLT命令など)そのまま実行#GP(0)


仮想86モードからプロテクトモードに戻るときには、 通常のプロテクトモード割り込みと同様の処理が行われます。

次の準備を行えば仮想86モードを利用できます。
  • TSSを作成し、SS0、ESP0を設定する。
  • 例外0x0d(#GP)のハンドラをDPL0で用意し、IDTにハンドラを設定する。他の割り込みもDPLを0に設定しておく。
  • INT命令や特権命令などで#GPが起こった場合、リアルモードの動作をシミュレートする。
  • 仮想86モードに切り替える。

  • まずは TSS を作成します。
    TSS はタスク状態セグメントのことで、 割り込み処理と、 マルチタスクでのタスク切り替えに使う構造体です。 その構造は次のとおりです。
    多くの情報を持っていますが、 割り込み処理では、このうち ss0:esp0とiobaseのみが意味を持ちます。 その他はタスク切り替え用の情報です。
    ss0:esp0には32bitモードのスタックを与えます。
    iobaseはIN/OUT命令をポートごとに許可/禁止する I/OポートビットマップのTSS先頭からのオフセットです。
    I/OポートビットマップのサイズはTSSのリミットで与えるようです。
    0で許可、1で禁止を表し、 I/Oポートビットマップの終端には1バイトのFFhを与えます。
    もしすべてのポートに対して許可/禁止を設定する場合は、 8192バイト(=64K/8)のデータが必要になります。

    TSS を作成するには、 まずこの構造体をメモリ上に準備し、 ss0:esp0とiobaseをセットして GDT 内に TSS を指すセレクタを作成します。
    次に、LTR 命令により TSS を指すセレクタを TR (タスクレジスタ)に読み込みます。

    次に例外ハンドラを用意します。
    例えば、割り込みのシミュレートは次のように行います。
    v86_gpfault_handler() は 32bit割り込みハンドラの実装 で説明した gpfault_handler() から 呼び出されるハンドラです。
    他の命令も同様に、 リアルモード命令と同等の処理をシミュレートします。
    このとき、0x66、0x67(サイズプリフィックス)などの プリフィックスも処理する必要があります。

    #GP(0) を処理すれば、後は 32bit割り込みハンドラの実装 で説明した switch_to_v86 のような方法で 仮想86モードを開始することができます。

    仮想86モードから戻るハンドラを作成したい場合は、 例えば特定のアドレスに HLT 命令を書いておき、 v86_gpfault_handler()内で HLT 命令(0xf4) と #GP(0) を 起こしたアドレスを検出します。

    switch_to_v86 で16bitモードに切り替え、HLT で 32bitモードの呼び出し元に戻る場合は 切り替えの直前に SS:ESP を TSS にコピーします。
    このとき、 C/C++ 言語から呼び出す関数は ほとんどのレジスタ(VC++やgccの場合、EAX/ECX/EDX 以外のレジスタ)を 保存する必要があります。

    なおメンテナンスのことを考えると、 v86_gpfault_handler() で goto を使ったり、case 内に処理を書いている部分は 書き直したほうが良いかもしれません。


    2005-09-19: ページ作成 (最終更新)
    Copyright (C) 2005 hoverkid, all rights reserved.
    [PR]正社員転職はマイナビ転職:全国の厳選求人と転職活動を支える情報