はじめて読む486　第12章 DOSエクステンダーとDPMI

## 12.1 DOSエクステンダー

- DOSエクステンダーは、MS-DOS上でプロテクトモードを活用するプログラムの実行を可能にする役割を持つ
- DOSエクステンダーの仕組み
    - プロテクトモードメモリ内にプロテクトモードプログラムを読み込む
        - リアルモードの状態でMS-DOSメモリ領域にプロテクトモードプログラムのファイル内容を読み込む
        - プロテクトモードに移行してからそれをプロテクトモードメモリに転送する
    - プロテクトモードに移行して、プロテクトモードプログラムを実行する
    - 実行が終了するとリアルモードに移行し、MS-DOSに制御を戻す
- MS-DOSシステムコールの中継
    - プロテクトモードでは、MS-DOSのシステムコールを直接呼び出してファイルアクセスなどの入出力を行うことはできない
    - プロテクトモードプログラムがMS-DOSシステムコール呼び出しを行うと、DOSエクステンダーがそれを受け取り、CPUの実行モードをリアルモードに移行させてからMS-DOSを呼び出す
    - MS-DOSから戻ってくると、DOSエクステンダーはCPUの実行モードを再びプロテクトモードに移行させ、制御を戻す
    - メモリアドレスをパラメータとするシステムコールを呼び出す場合など、リアルモードではアクセスできないプロテクトモードメモリを使用する場合は、アドレスをMS-DOSに渡すことが出来ないケースもある
        - MS-DOSメモリ領域内に中継用の領域を確保し、このアドレスをパラメータとして、MS-DOSのシステムコールを呼び出す
- 割り込み再実行
    - 割り込み処理ルーチンもプロテクトモードでは実行することが出来ないため、DOSエクステンダーは、以下の手順で割り込みの中継を行う
        - 割り込みディスクリプタテーブルに割り込み中継ルーチンを登録する
        - プロテクトモードで実行中に割り込みが発生すると、中継ルーティンが呼び出される
        - 中継ルーチンは、CPUの実行モードをリアルモードに移行させ、割り込みベクタに登録されている割り込みルーチンを呼び出す
        - ルーチンから戻ってくると、CPUの実行モードを再びプロテクトモードに移行させ、割り込み中継ルーチンを終了させる

## 12.2 DPMI

- XMS（eXtenxed Memory Specification）
    - プロテクトモードメモリをDOSエクステンダーやRAMディスクなど複数のソフトウェアを組み合わせて使う場合、プロテクトモードメモリの割り当て方式を統一する必要がある
    - XMS方式のメモリ管理を行うソフトウェアのことをXMSドライバソフトウェアという
        - XMSドライバソフトウェアは、プロテクトモードのメモリの確保と解放に加え、リアルモードメモリとプロテクトモードメモリ間のデータ転送やアドレスバスのA20ビット制御、HMA領域の管理などもXMS規約の一部として取り決められている
    - XMSが登場する以前にはプロテクトモードメモリ領域の調整手段に幾つかの方式が併存しており、ソフトウェアの組み合わせによっては利用できないことがあったが、XMSにより共通規約として取り決められた
- VCPI（Virtual Control Program Interface）
    - 仮想8086モードとプロテクトモードとの間の移行方式を統一するために生まれた規約
    - EMSドライバソフトウェア内部では、ページテーブルの変更などを行う際に、仮想8086モードからプロテクトモードへ移行する処理をしており、VCPIでは、この部分を外部から共通の手順で呼び出せるようにしている
    - VCPIの呼び出し方法は、EMSドライバソフトウェアの呼び出し方法を拡張する形になっている
        - EMSドライバソフトウェアの呼び出しは、AHレジスタにファンクション番号を入れてINT67Hを実行する
        - この時AHレジスタにDEを入れるとVCPIを呼び出すことになる
        - ALレジスタにはVCPIのファンクション番号を入れる
        
        | VCPIファンクション番号 | 機能 |
        | --- | --- |
        | 0H | VCPIを利用可能かどうかを調べる |
        | 1H | プロテクトモードインターフェイスの取得 |
        | 4H | 4Kバイト単位のページを確保する |
        | 5H | 4Kバイト単位のページを解放する |
        | AH | 割り込みコントローラの割り込みベクタの対応を得る |
        | BH | 割り込みコントローラの割り込みベクタの対応を設定する |
        | CH | 仮想8086モードからプロテクトモードに移行する
        プロテクトモードから仮想8086モードに移行する |
        - DOSエクステンダーは、VCPIのファンクション0を呼び出して、EMSドライバソフトウェアがVCPIに対応しているかどうかを調べる
        - 対応していればファンクションCHを呼び出してプロテクトモードに移行する
        - DOSエクステンダーは、自分自身でセグメントディスクリプタテーブルや割り込みディスクリプタテーブルの設定を行い、プロテクトモードプログラムをロードして実行する
- DPMI（Dos Protected Mode Interface）
    - Windowsの持つDOSエクステンダーとしての働きを実現するための機能
        - Windows用のアプリケーションソフトウェアの行う入出力は、Windowsが一手に引き受け処理するようになるが、ファイルアクセスなど一部の機能に関してはMS-DOSの機能を呼び出す点で、WindowsはDOSエクステンダーの一種と言える
    - VCPIがEMSドライバソフトウェアとDOSエクステンダーの共存を目標とし、その機能を必要最低限に絞っているのに対し、DPMIは複数のプロテクトモードを同時に実行するマルチタスク処理を可能にすることを念頭に開発されている
- DPMIとVCPIの違い
    - どちらもMS-DOS上でプロテクトモードを利用するための仕組み
    - システム資源の管理をDPMIホストが行う、というのが重要な違い（VCPIサーバは、プロテクトモードプログラムを実行するDOSエクステンダーのようなソフトウェア（VCPIクライアント）の内部でシステム資源の管理を自分自身で行う）
    - VCPIでは、1つのプロテクトモードプログラムがシステム資源を独占してしまうため、同時に複数のプログラムを実行することが出来ない
    - DPMIでは、システム資源をDPMIホストの管理下で分け合って利用することができるため、複数のプロテクトモードプログラムを同時に実行することができる
- DOSプロンプト
    - MS-DOS用のアプリケーションソフトウェアをWindows管理下で安全かつ高速に実行できる環境のこと
- VCPI対応のEMSドライバソフトウェアを組み込んだ状態でVCPIを呼び出すことによって仮想8086モードからプロテクトモードに移行できるのと同様に、WindowsのDOSプロンプト環境のなかでDPMIを呼び出すことによって仮想8086モードからプロテクトモードに移行できる
- DPMIエントリポイントを取得（AXレジスタに1687Hを入れて、INT 2FHのソフトウェア割り込みを呼び出す）して、DPMIエントリポイントを呼び出すと、プロテクトモードに移行する
- DPMIの個々の機能は、AXレジスタに機能番号を入れて、INT 31Hのソフトウェア割り込みを実行することによって呼び出す

## 12.3 32ビット対応コンパイラによるプロテクトモードプログラム開発

- Windows 3.1はプロテクトモードに対応しているが、486に完全に対応しているわけではなく、16ビットセグメントしか利用できない
    - Windows 3.1がアプリケーションソフトウェアに提供する機能群のことをWin16 APIという
- Windows NTやChicago（Windows 4.0）では32ビットセグメントを利用して64Kバイトを超える連続したメモリ領域を扱うことができる
    - Windows NTがアプリケーションソフトウェアに提供する機能群のことをWin32 APIという
- Win32s APIと呼ばれる機能群を提供するシステムソフトウェアを組み込むと、Win16 API上で擬似的にWin32 APIを利用できるようになる
    - Win32s APIとWin16s APIとの間をWin32s APIが中継し、32ビット対応アプリケーションがWindowsを呼び出す際にパラメータとして渡す32ビットセグメントを16ビットセグメントに変換する
    - Win32s APIは、ちょうどMS-DOSにおけるDOSエクステンダーのような働きをする