はじめてのDPMI

「いまどき使う?」の感もありますが、WindowsXP上でDPMI(DOS Protected Mode Interfaceを使ったDOSプログラムを作成・アセンブル・実行してみます。DOS上で手軽に32ビットプロテクトモードのプログラムを実行できることがわかります。

(本記事の初稿は2004年です。64ビットCPUが普及した現在でも有用な内容と思われるので、そのままの内容で公開します。)

なお本稿ではMS-DOS用のアセンブラーとリンカーが必要になります。ここではBorland社製のTurbo Assembler(TASM)とTurbo Link(TLINK)を使います。もしもこれらを持っていない場合は、フリーウェアのアセンブラー・リンカーを入手してください。

■DPMIとは

DPMI(DOS Protected Mode Interface)とは、16ビット(リアルモードもしくは仮想86モード)のOSであるMS-DOS上でプロテクトモードのプログラムを実行させるためのインターフェースを提供するためのものです。以下のようなことができます。

  • CPUモードの切り替え(リアルモード(仮想86モード)とプロテクトモード)
  • LDTディスクリプタの管理
  • 割り込み(ハードウェア割り込み, ソフトウェア割り込み), 例外の管理
  • 仮想記憶, ページング関係のサービス
  • メモリ管理

DPMIでは80286などの16ビットプロテクトモードでプログラムを実行させることもできるようになっていますが、メインはやはり32ビットプロテクトモードです。仮想記憶、ページング関係の機能は当然ながら80386以上でないと使うことができません。

DPMIのプログラム(DPMIクライアント)はCPUのリング3で動作し、DPMIホスト(DPMIサーバー)はリング0で動作します。

DPMIが使える環境として最初に登場したのは、Windows3.0でした。(これ以前にWindows386(Windows/386)がありましたね。なつかしい。)Windows3.0にはリアルモード、スタンダードモード、386エンハンストモードがあり、このうちの386エンハンストモードのMS-DOSプロンプトでDPMIを使うことができました。NECのPC-9800シリーズ用のMS-DOS ver 5.0Aでは単体のDPMIホストが付属しており、これはよく使いました。(IO・DATAから販売されていたMEMORY SERVERにもDPMIホストが付属していたものの、DOS 5.0A付属のDPMIとはえらく使い勝手が異なり、ほとんど使わなかった。)

■アセンブルから実行まで

さっそく試してみましょう。全部で3ファイルあります。main.asm, switch.asm, io.asm です。main.asmはメインプログラムで、32ビットプロテクトモード上でやらせたいことを記述します。swicth.asmはCPUの動作モードをリアルモード(仮想86モード)とプロテクトモードの間で切り替えるためのものです。手順が多いですが、DPMIの生の姿に触れられておもしろいと思います。io.asmは32ビットプロテクトモード上から呼び出すための入出力ルーチンです。
実際にはDOSのファンクションコールを呼び出します。プログラムはDOS用のEXEファイルとして生成し、プログラムのエントリーポイントはswicth.asm内に設定します。switch.asm内でCPUモードを切り替え、main.asm内のルーチンへ飛びます。main.asmからリターンすると、swicth.asm内でプログラムを終了し、DOSへ戻ります。

さっそく、アセンブル・リンクしてみましょう。なおリンクの順序に注意してください。EXEプログラムとしてのエントリーポイントはswitch.asmに設定します。以下の作業はWindowsXPのコマンドプロンプトで行っています。MS-DOSサブシステムの起動はWin9X(Windows95/98/Me)では不要です。(ただしWin9Xの場合、実行すると「プライベートデータエリアを確保できません」エラーになるかもしれません。)

■解説

io.asmでは32ビットプロテクトモードからDOSのファンクションコールを呼び出しています。なぜこんなことができるのかと言うと、DPMIホストがトラップゲート経由でCPUをリアルモード(仮想86モード)に切り替え、対応するDOSのハンドラを呼び出してくれるからです。

執筆日:2004年9月26日(日)(www.marbacka.net内の別のサイトで公開)
最終更新日:2017年2月19日(日)

スポンサーリンク