最近のパソコンでは4GBを超えるメモリが実装できます。 それに合わせて、システムがどう管理しているかをアプリケーション側が知る方法が用意 されています。1MB以上のメモリに関するさまざまな情報を返すソフト ウェア割り込みがそれです。メモリ4GB時代を見越して用意されているのが int15h、AX=E820というファンクションですが、MS-DOS時代にはこれは 存在していませんでした。そこでこのファンクションが返すテーブルを テキスト表示するDOSプログラム「MEMMAP」を作成しました。
MS-DOS(Windows9xのコマンドプロンプト起動のDOS)で動作します。 WindowsNT系やWindows9xでも、いわゆるDOS窓(DOSプロンプト)では 動作しないので注意してください。またEMM386の仮想86モードでも 動作しません。必ずリアルモードのDOSで実行してください。なお HIMEM.SYSは組み込んであって構いません。HIMEM.SYSが組み込まれて いるだけの状態はリアルモードです。
まずはLHAアーカイブを解凍してMEMMAP.EXEを取り出し、 カレントディレクトリに置いてください。 DOSコマンドから MEMMAPと打ってENTERキーを押します。 結果は標準出力(DOSコンソール画面)に表示されます。
もともと本プログラムを必要としている人にはあまり説明の必要は
ないかもしれませんが、一応解説しておきます。詳しいことはネット上に
情報がたくさんあります。またMS-DOS以外のOSでは、このプログラムと
同等のことができるソフトウェアは多数あると思われます(とくにLinux)。
最近の H67チップセット、EFI対応BIOSのマザーボードで実行したときの
表示例を以下に示します。
アドレス値はすべて十六進数であり、最大40bitで表示します。ただし通常は 32bitすなわち十六進の8桁で表示します。32bit(4GB)を超えた場合には桁数を2増や して40bit(1024GB)で表示します。この例では8GBの物理メモリを搭載しており、 4GB以上のところには約5GB(5118MB)ぶんのメモリが割り当てられています。
typeが1のエリアにはメモリが存在し、アクセス制限(MTRRやPCI-PAMの設定)が とくになければ読み書きできます。メモリのエリアはその連続の大きさもMBまたはGB 単位で表示します。
typeが2のエリアはRAMとしてアクセスできない(しないほうがよい)領域で、 正しくは「システム予約」という属性です。この領域が実際にはROMなのか、 RAM化ROMなのか、メモリマップトI/Oデバイスなのかといった区別は、 このファンクションからはわかりません。
1MB以下のSystem BIOS E0000-FFFFFのような所は実際にはRAM化したBIOS ROM なので、書き換えようと思えば書き換えることは可能です。 しかし例えば 9F800000, size= 20200000のエリアなど(赤線の下)は、PCIデバイスの メモリマップトI/Oの領域です。ここを読みに行くだけでデバイスが誤動作 する可能性があります。またはマシンチェック例外が発生するかもしれません。 FF000000, size= 01000000のあたりは、システムROMがROMチップの物理 アドレスと一意対応してマップされているようです。この例では少なくとも 16MBのROMを搭載していると考えられます。なおこれはE0000-FFFFF空間の RAM化BIOS ROM空間とは内容はまったく別物です。1MB以下のROM空間の内容は、 システム起動の途中でRAM上に形成されるもので、ROMの内容そのものでは ありません。
typeが3,4のエリアは、ACPIと書かれていますが、読み書き可能なメモリ上に あります。ただしシステムに深く関わるACPIの情報が存在しており、勝手に 書き換えや消去をしてはいけない領域です。
この表示を少し整理すると、以下のようになります
物理メモリ4GBを搭載した場合には、PCによって次の2通りあるようです。
(1) 3GB程度上限メモリまでで4GB以上のメモリは出現しない
(2) 3GB程度上限メモリと4GB以上に残りの約1GBメモリ
36bitアドレス拡張が何らかの形で(物理配線、チップセット設定、BIOS設定など)
無効になっているマザーボードでは(1)になり、4GB超え空間は一切使用できません。
少なくともintel 945/955/975世代以降は(2)となっているようです。
以下に示すのは Core2世代、G41チップセットマザーボードでの例です。
実装物理メモリは4GBで、36bitアドレス拡張がデフォルト設定です。
いわゆる3GB程度上限の正確な値ですが、これには興味深い傾向があります。 Core2世代のマザーボードまでは、この値が広めで、3.0GBから3.5GB程度 (アドレスでは C0000000からE0000000)になるのですが、Core i世代では 上限が下がってしまい、上記のようにアドレス上限 9EDB4000(2.48GB)となって いて、3GBを割り込んでいます。つまり32bitのOSで使用する限りでは、最近の Core i世代のマザーボードでは、利用できるメモリが少なくなるというわけです。 またCore2世代と比べ、Core i世代では、3GB-4GBまでのシステムが使用する 領域が複雑に分断化しています。Core2世代ではACPIエリアは一つしかありま せんでした。Core i 世代のマザーボードのほとんどは、従来のBIOSに取って 代わるEFIを搭載しています。EFIを搭載(または搭載準備)とすることで システム予約領域が増大しているのではないかと考えられます。
次は上と同じG41マザーボードに物理メモリ3GBを実装した例です。
いわゆる3GB上限のアドレスは少し下がり、実装メモリ量だけで4GB未満の アドレスを使い切ります。その結果4GBアドレス以上の部分はなくなります。 32bitOSで使う限り、メモリ3GBと4GB実装との違いは、使用可能メモリでは 3317-3061=256MB増えるだけということになります。
「4GBのメモリを実装しても64bit Windowsで使えるのは3GB程度まで」などという PC評論家の記事を見かけたことがありますが、少なくとも36bitアドレス拡張が なされているマザーボード(2)ではそのようなことはありません。
システムが占有してしまう約3GB-4GBのアドレスにマップされないメモリは、4GB以上 の位置にちゃんとマップされることがわかります。ただし1GBのうちRAM化BIOS,ACPI エリアやshared video メモリで食われるため 、上の図のように768MBにはなって います。しかしこれは例えば2GB,3GBしか実装していなくてもシステムやビデオ デバイスに食われるぶんですから、そのような記事は誤りだとわかります。
このプログラムが呼び出すファンクションがいつ頃からBIOSに用意される ようになったのか定かではありませんが、このファンクションが無効の マザーボードでは、何もせずAbortと表示されて終わります。 おそらくそのようなマザーボードでは、64bitのOSは、インストールも、 インストール済みHDDの起動も、できないと推定されます(その他の制限、 例えばCPUにEMT64がないことで先に拒否されるとは思いますが)。
このプログラムを実行させたことにより何かの損害が発生するという ことは、全くないと考えられますが、万一そのようなことを訴えても、 当方は一切責任を負わないものとします。それを条件にこのプログラムの 使用を認めるものとします。またこれ以上のこのプログラムの説明責任も 負わないものとします。
著作権は保持します。著作権および著作人格権侵害のない常識的な範囲で、 上記の免責条件を満たした場合には、コピーと使用が自由にできる 「フリーソフトウェア」とします。しかしこのプログラムを公衆送信できる 状態に置くことは認めません(転載不可)。このプログラムの公開が終了 した場合でも公衆送信できる状態での再配布を認めません。 連絡先メールアドレスは、 トップページに記載されています。