
別シリーズでx86(16bit)のアセンブラを使用。その際MS-DOS互換のFreeDOSのお世話になってます。屋上屋を重ねた環境ですが、さも8086のようなフリで命令を実行できてます。しかし前から気になっていたことが1点。手元のFreeDOS、V86(仮想86)モードで走ってます。誰がプロテクト・モード仕切ってるの?
※「トホホな疑問」投稿順Indexはこちら
当方のFreeDOSの実行環境
FreeDOSは「フリーのDOS環境」であり、IBM系アーキテクチャの現物パソコンにもインストール可能なハズ。そしてインストール後はさもMS-DOSみたいな感じで動作させることが出来るハズです。
しかし1台現物パソコンをアサインするのも物理的に場所を食うので、当方では以下のような環境で使用させていただいてます。
-
- Windows 11 (64 bit) のパソコン上の
- WSL2上の
- Ubuntu 24.04オペレーティングシステム上の
- QEMUエミュレータ(x86_64のシステムモード)上の
- FreeDOS 1.3
実体パソコンからみたら屋上屋を重ねた先でFreeDOSが動いている感じです。なぜにこんなまどろっこしいことをしているかと言えば、x86(x64)でも64ビットのOS環境では、32ビットのx86プログラムを動作させることは自然にできますが、16ビットのx86プログラムを走らせることは「自然」にはできないからデス。それでパソコンのCPUはx86なのにエミュレータ使って16ビットのプログラムを動かしてます。
まあそれでも、昔の486パソコン並み以上の速度でDOSが動作している雰囲気、感心しております。WSL2上のUbuntu上へのFreeDOSのインストールについては以下などご覧くだされ。
ソフトな忘却力(56) FreeDOS、WSL2上のUbuntu24.04 LTSで実行
一方、Raspberry Pi 4機上でもFreeDOSしています。これまたQEMUエミュレータ利用です。その件については、以下ご参照くだされ。
ソフトな忘却力(45) FreeDOS、その伝統はMS-DOS超え、進化も続くOS
Arm上でもFreeDOS動かせるならば、ということで実はスマホの上にインストールした Termux 上でFreeDOSもしています。「階層構造」はこんな感じです。
-
- Androidのスマホ
- Termux(Android上でLinux的なコンソールを使える環境)
- QEMUエミュレータ(x86_64のシステムモード)
- FreeDOS 1.3
これでも全然問題なくDOSできてます。しかし、その全てで
FreeDOS、仮想86モード(V86 mode)で動いてます
まあ、フツーの年寄はDOSだったらRealモードで動作していると思うじゃありませんか。大間違いっす。よく見れば仮想86モードで動いてます。まあ、いろいろやってみても、裏にいる「仮想86モニタ」プログラムの出来は悪くないようで、使っている限りはフツーにRealモードで8086のアセンブラプログラムを動作させている感じです。差はみえね~。
しかし、以下の状況に立ち至りました、別件シリーズ「ぐだぐだ低レベルプログラミング」が以下の回に到達、
ぐだぐだ低レベルプログラミング(239)x86(16bit)、286プロテクトモード
以降、286プロテクトモードの命令どもを動かさねばならなくなりました。もちろん「ベアメタル」環境からプロテクトモード書くのであれば、何の問題もありません。しかし、とってもメンドクセーです。年寄には過ぎたる負荷です。
FreeDOSがV86モードで動作しているならば、「誰かプロテクトモードを仕切っているプログラム」がいる筈。そこへ紛れ込ませてもらえばいいんでないかい?ということで今頃になって仕切っているヒトを探すことに。
結論から言えば、FreeDOSのFDCONFIG.SYS(MSーDOSのCONFIG.SYSに相当)内で、インストールしている
JEMMEX.SYS
こそが「プロテクトモード」を仕切っている親玉でした。
JEMM
そのお名前からは、EMSを管理するドライバに見えます。その認識は間違っておりませぬ。古のLIM(ロータス、インテル、マイクロソフト)規格のEMSについては以下の過去回で取り上げさせていただいており。
冥界のLSI(11) LIM-EMS Ver4.0 サポートハードウエア
また、EMSだのXMMだの、MS-DOSのメモリ管理など忘れてしまった方には以下に書付あるのでご覧ください。
ソフトな忘却力(54) FreeDOS、MS-DOSを継承するメモリ管理のあれこれ
どうもJEMMは、ハードウエアメモリを管理するEMSのドライバが386機上でソフト化したEMM386の後継であり、FreeDOS上でさらに高度化されたものみたいです。FreeDOSのドキュメント上は、JEMMという御名前で語られているプログラムには2種類あります。
-
- JEMMEX (XMM already included)
- JEMM386 (external XMM needed)
当方が愛用させていただいているJEMMEXの方は、XMMの管理まで含めてまとめて引き受けてくれるバージョン、JEMM386の方は、古のEMM386式にXMM管理ははまた別のプログラムにお任せするバージョンみたいです。JEMMEXの方が、下の方のメモリの占有量が少なかったりするみたい。
さて、このJEMMEXの機能をHELPしてみるとありました。
赤枠、VCPIサポート、黄色枠、V86-Mode Extensionsです。どちらもデフォでON。
VCPI=Virtual Control Program Interfaceです。古のDOSの時代、LIM-EMS規格のハードウエア・メモリボード無でも、386のMMU使ってEMSを実現していたEMM386です。しかし同様に「プロテクト・モード・メモリ」を当てにしていたDOSイクステンダ系と同じメモリを食い合う仕儀となったらしいデス。それはイケないということで談合?して決まったのが、VCPI規格らしいっす。DOSからプロテクトモードメモリを使うためのお約束ね。当然、プロテクトモードに出たり入ったりの制御はVCPIが仕切るのだと。ついでにリアルモードに戻るのではなく、プロテクトモード下のV86で実行しちゃる、ということになったみたい。
なお、FreeDOSはDOS4GというDOSイクステンダの一種にかなりを頼っているみたい。実際、Cコンパイラなどは、皆DOS4G命っす。
またDPMI規格(ドス・プロテクト・モード・インタフェース)というものもあり、こちらの方が機能的にカッケーみたいです。しかしJEMMのHELPには見当たらなかったです。
実際、OpenWatcomコンパイラ・パッケージが提供している rminfoというコマンドを使うと以下のごとく報告あります。
緑枠で、VCPIのホストが見つかってます。そして、黄色枠で、PM(プロテクトモード)へのスイッチもRM(リアルモード)へのスイッチも仕切っているのはVCPIであると。ようやくスッキリ?
黄色枠のところをご覧くだされ。16Mバイト(286の物理メモリ上限)までにあるのは15360Kバイト、一方その上(386以降で使える部分)は111Mバイトであると。
VCPIにお願いすれば、プロテクトモードメモリに忍び込んで練習できそうか?別シリーズなんだが。
