XMS規格のメモリには次のものがあります。
このうちEMBはXMS規格メモリマネージャ(XMM)のファンクションによって、メモリ空間の確保、開放、ロックなどの管理をしながらアプリケーションが使用します。
本プログラムは、EMBの割り当て状況を表示したり、ダミーのEMBを割り当てたり、割り当てを取り消したりすることができるツールです。NEC PC-9800シリーズのみならずPC/AT互換機でも使用できます。XMSの利用にあたってCPUは80386以上であることが望ましいですが、XMSの規格は80286以上で定義されており、本プログラムは80286でも動作します。
まずMS-DOSでは HIMEM.SYSなどのXMMを config.sysに記述し、インストールしておいてください。MS-DOS純正のHIMEM.SYS 以外でも、仮想86EMSマネージャ単独でHIMEM.SYSと同等の機能を提供するものがあります。PC-98版ではVMM386,VEM486,LEMMなどです。それらも使用可能です。
コマンドラインから EMBCHK と打って実行します。コマンドラインオプション無しの場合、 EMBの占有状況を表示します。下記では表示例と読み方について説明します。
XMS(EMB) information. V3.50 Copyright(C) 1992,2024 DOSsoft EMB使用状況 XMM driver version 2.60 , HMA is installed. [386] [REAL] EMB memory 16383 KB free(maximum), 17407 KB free(total). EMB handle F72Ah --> base address 00110000h~ 960 KB (000F0000h) EMB handle F730h --> base address 00200000h~ 1024 KB (00100000h) EMB handle F73Ch --> base address 00400000h~ 12288 KB (00C00000h) EMB handle F742h --> base address 01000000h~ 32768 KB (02000000h)
まず XMM driver version が表示されます。MS-DOS 6.20以上では 3.xx のはずです。2.xx の場合は扱える最大メモリ容量などに機能的に制約があります。"HMA is installed." というのは XMMによってHMAが提供されている場合に現れます。config.sys で DOS=HIGHの指定があれば必ず表示されます。
free(maximum) で表示されるのは1度のXMMファンクション手続きで確保できる最大の容量を示します。占有中のメモリブロックがなければ搭載メモリに等しいはずです。ただしXMM バージョン 3 未満の場合、約64MBだったり 約15MBだったりするかもしれません。 free(total) で表示されるほうは、複数回の手続きで確保できる合計の容量を示します。XMMのバージョンが古いと、搭載メモリより少なく表示されることがあります。
EMBの管理は handle という一意の16bit値で行われます。base addressというのはEMB各ブロックの基底アドレスです。CPUがリアルモードで動作している場合は物理アドレスと等しいものになります。~ の後にブロックの占有サイズが十進数で示されます。後続の()内はそのバイト単位の十六進数表記です。
コマンドラインを指定することによりEMBの確保と開放が可能です。
+ のあとにKB容量値を十進数で記述すると、その容量を確保します。例えば +512 とすると、
XMS(EMB) information. V3.50 Copyright(C) 1992,2024 DOSsoft EMBを確保します XMM driver version 2.60 , HMA is installed. [386] [REAL] Allocation size = 512 KB EMB memory 16383 KB free(maximum), 16895 KB free(total). EMB handle F72Ah --> base address 00110000h~ 960 KB (000F0000h) EMB handle F730h --> base address 00200000h~ 1024 KB (00100000h) EMB handle F736h --> base address 00300000h~ 512 KB (00080000h) EMB handle F73Ch --> base address 00400000h~ 12288 KB (00C00000h) EMB handle F742h --> base address 01000000h~ 32768 KB (02000000h)
このように新たにハンドル F736h が割り当てられ、空いていた 300000hから 512KBの領域が確保されます。
- のあとにハンドル値を十六進数で記述すると、そハンドルが管理するブロックのメモリを開放します。ハンドルも消滅します。例えば上記のときに -F742 とすると
XMS(EMB) information. V3.50 Copyright(C) 1992,2024 DOSsoft EMBを解放します XMM driver version 2.60 , HMA is installed. [386] [REAL] EMB handle F742h was purged. EMB memory 49151 KB free(maximum), 49663 KB free(total). EMB handle F72Ah --> base address 00110000h~ 960 KB (000F0000h) EMB handle F730h --> base address 00200000h~ 1024 KB (00100000h) EMB handle F736h --> base address 00300000h~ 512 KB (00080000h) EMB handle F73Ch --> base address 00400000h~ 12288 KB (00C00000h)
のように handle F742h が占有していた 32768KBのエリアが開放され、free の大きさがそのぶん増えます。
確保や開放をしただけでは、システムになんの影響も与えません。実際にそこに あるメモリを使うためには、アプリケーション内でXMS の確保ファンクションを 実行し、そこで得たハンドルを使ってアドレスと範囲を把握し、それにより プロテクトモードでメモリアクセスを行う必要があります。XMMにはファンクション 0Bhというメモリ転送機能があるので、DOSアプリケーションでは一般的にこれを 利用して1MB以内の空間とEMBとの間でデータの移動を行いながら使います。
なお全くEMBの割当がない場合でも free(maximum) と free(total) の異なる 値が表示される理由は、15-16MBシステム空間による分断が原因です。例
XMS(EMB) information. V3.50 Copyright(C) 1992,2024 DOSsoft EMB使用状況 XMM driver version 3.5F , HMA is installed. [386] [REAL] [EXfunc] EMB memory 131072 KB free(maximum), 145344 KB free(total). No active EMB handles.
一般に、確保と開放を繰り返した場合、中程に占有域があれば分断化は普通に起こり えます。
* のあとにハンドルの値十六進数で記述すると、そのハンドルが管理するブロックのメモリに値E5hを書き込んで埋めます。その後読み出します。データが一致しない場合は " Test failure!" というメッセージが出て終了します。成功した場合は次のような表示となります。
EMBCHK *54A8 XMS(EMB) information. V3.50 Copyright(C) 1992,2024 DOSsoft EMBをチェックします XMM driver version 3.5F , HMA is installed. [386] [REAL] [EXfunc] EMB memory 18432 KB free(maximum), 30720 KB free(total). EMB handle 548Ah --> base address 00110000h~ 960 KB (000F0000h) EMB handle 5494h --> base address 01000000h~ 14336 KB (00E00000h) EMB handle 549Eh --> base address 00200000h~ 1024 KB (00100000h) EMB handle 54A8h --> base address 01E00000h~ 98304 KB (06000000h) EMB handle 54A8h Checking memory 01E00000h - 07DFFFFFh OK.
この機能は、既に使用しているEMBのブロックには絶対に適用してはいけません。 本ツールで新規に割り当てたEMBハンドルだけを対象としてください。例えばSMARTDRVが既に使用しているEMBブロックに対して実施すると、ディスクのデータが壊滅的に破壊されるといったことが起こります。自己責任でお試し下さい。
コマンドラインオプション文字列が "+" か "-" か "*" で始まるものでない場合は全て無視され、EMB割当状態の表示のみとなります。警告は出されません。なお "?" で始まる文字列を指定した場合は、使用法が表示されます。
80286機ではCPU自体が遅いことに加え、リアルモードとプロテクトモードの間を行き来するXMMの動作が非常に遅いので、EMBハンドルを検索している時間が長くなります。これは搭載メモリ量には比例しません。数秒はかかると考えて下さい。EMB memory **** KB free(maximum) のあとハングアップしたかのようになります。
V30/8086機ではまったく動作せずエラーで終了します。HIMEM.SYSなどのXMMドライバがない環境でもエラーで終了します。
MS-DOS バージョン3.30未満では実行できません。画面出力は標準出力に行っています。PC-98では色もついて表示されますが、色指定にはエスケープシーケンスを使用しておらず、DOS拡張ファンクション int DChを使用しています。これはMS-DOSバージョン3.30以上,FreeDOS(98)でサポートされています。標準出力をリダイレクトしたものには色を指定するコードのようなものは付きません。プレインテキストです。
仮想86モードではEMBのベースアドレスは実アドレスである保証がありません。 というよりほとんどの場合実アドレスではありません。
PC/ATで実行した場合、文字に色はつきません。日本語DOS/Vと判定される場合は 一部日本語表示が行われます。英語モードの場合は英語です。
XMSの規格は80286が登場してしばらく後に制定されました。概ねXMS 2.0というバージョンになります。このバージョンでは各EMMファンクションは16bitの単位で行われており、指定できるメモリの容量の最大はどうやっても 15MB以内です。
80386が登場するとメモリ空間は16MBを超えるようになります。16itでキロバイト単位のメモリサイズを指定すると最大65535KB(約64MB)まで可能です。しかし1990年後半からはもっとメモリを搭載できる機種が現れたことから、XMMは拡張の必要が生じました。そこで XMS バージョン 3.xxの規格からは 32bitで指定できる「拡張ファンクション」が追加されました。これにより一回で65536以上のメモリを確保したり、合計の空き容量が 65536MB以上であっても正しく取得できるようになりました。
なおXMS 3の拡張ファンクションは、Microsoft/NEC/IBM純正以外のXMMドライバでは意外にもほとんどサポートされていないようです。
XMMのファンクションでは、サイズ 0の確保を行うとサイズ 0でハンドルが割当られるのが仕様のようです。しかしそのハンドルに存在意義はないと考えられるため、本プログラムでは、サイズが0の場合は確保ファンクションの実行自体を回避します。
黄色文字で示される次の表示は動作モードを示し、以下のようなことを意味します。
[286] CPUが80286である
[386] CPUが80386以上である
[REAL] リアルモードである
[V86] 仮想86モードである(EMM386など実行下)
[EXfunc] XMS 3 拡張ファンクションが装備されている
[PC/AT] PC-9800シリーズでない
PC/AT互換機(uEFIでないBIOS搭載機)では例えば次のようになります。BIOS起動後にリアルモードで見えている4GB空間のRAMは、ACPIでの利用など、システムにより相当に分断化がなされています。EMBもその分断境界を跨ぐことができません。maximumに現れる値で逐次確保して行くとこのように割り当てられます。最大のブロックは 2316MBとなっています。4GBを超えて物理メモリを実装していても、DOS 7.1 時代のHIMEM.SYS は対応しきれません。ただし本体BIOSの新しいint 15hファンクションで4GBを超えるメモリの使用状況を取得できます。詳しくは拙作 「mempap」をお試しになるかその説明書をご覧下さい。
XMS(EMB) information. V3.50 Copyright(C) 1992,2024 DOSsoft EMB使用状況 XMM driver version 3.5F , HMA is installed. [386] [PC/AT] [REAL] [EX-func] EMB memory 56 KB free(maximum), 60 KB free(total). EMB handle E58Eh --> base address 00110000h~ 331 KB (00052C00h) EMB handle E598h --> base address 20200000h~ 522256 KB (1FE04000h) EMB handle E5A2h --> base address 40005000h~ 2316220 KB (8D5EF000h) EMB handle E5ACh --> base address CDE0F000h~ 580 KB (00091000h) EMB handle E5C0h --> base address CE59A000h~ 7908 KB (007B9000h) EMB handle E5D4h --> base address 00162C00h~ 522869 KB (1FE9D400h)
ソースファイルも添付されています。source.zip というアーカイブファイルです。 XMS.S というファイルをアセンブル、リンクするとCOM形式の実行プログラムが得られ ます。それをEXE形式に変換するついでに名前を変えたものが EMBCHK.EXE です。
【参考文献】(従来ファンクション)
日本電気 1991
MS-DOS 5.00 プログラマーズ リファレンスマニュアル Vol.2 第6章
このプログラムは「フリーソフト」ですが、著作権は作者にあります。著作権者の意向を無視したことはしないでください。たとえば不特定多数がダウンロードできる場所への無断転載は禁止とします。
このプログラムを使用した結果について、たとえば既に使用しているEMB領域を開放したりテストすることでディスクドライブのデータを破壊するような誤操作の損害などについて、作者は一切責任は負わないものとします。
連絡先メールアドレスは、トップページに記載されています。
日付 版 内容 年 月 日 版 内容 1992年末 2.00 EMBハンドルの検索のみの機能のものを作成 1993-12-5 3.01 16MBを超える表示に対応、確保と開放機能を追加 2024-7-30 3.50 拡張ファンクションに対応, 80286機に対応 2024-8- 1 3.51 仮想86モード時の表示が誤っていたのを修正(機能的には無問題)
2024-8-1 まりも