RAMDisk

Iharaさんからさりげないフリ(http://d.hatena.ne.jp/hideakii/20090614#20090614fn1)があったので、
この機会にメモリ領域の仮想ハードディスク化(RAMDisk)について調べつつ、物理メモリの保全などとの関係を
考えてみました。


RAMDisk自体の解説はwikipediaがわかりやすいです。

RAMディスク
http://ja.wikipedia.org/wiki/RAMディスク

"RAMディスク(ラムディスク)は、Random Access Memory (RAM) を利用した外部記憶装置。あるいは
主記憶の一部を外部記憶装置(ディスクドライブ)のように利用する仕組み。"

とあり、HDDが高価だった頃から使われている技術とのことです。Linuxではtmpfsやramfsがカーネル
モジュールでRAMDiskの機能を提供しています。最近のLinuxでdfすると、特に設定していなくても
Filesystemのところにtmpfsと表示されるので、デフォルトでRAMDiskを使っている(必要としている)
ということになります。


Windows方面で調べてみるとマイクロソフトのサイトでソース付きのサンプルドライバが提供されています。

FILE: Ramdisk.sys sample driver for Windows 2000
http://support.microsoft.com/kb/257405

デバイスドライバのプログラミングなどは全然わからないので自信はありませんが、なんとなくソースを
眺めてみるとRAMDisk専用の領域を作るためにExAllocatePoolWithTag()でタグ付のプール領域を確保
しつつ、FATを操作するための処理が書かれています。つまり、メモリ内にRAMDisk専用の領域をいったん
確保して、そこにファイルシステム(FAT)を作ってファイルを置いたりしているようです。

一方最近(といっても結構前からだと思いますが..)話題になっているGavotte Ramdiskなどのツール
では動きが違ってきます。OSでメモリとして認識していない領域をRAMDisk化しており、mddやwin32ddで
保全してもその領域は取得できません。

そして最近公開されたBUFFALO RAMDISK ユーティリティは、BUFFALO製メモリであればOS管理外の
領域を、BUFFALO製メモリでなければOS管理領域をRAMDiskとして割り当てることができます。

BUFFALO RAMDISK ユーティリティ
http://buffalo.jp/download/driver/memory/ramdisk.html

BUFFALO製メモリは手元に無いのでOS管理領域にRAMDiskを作ってみましたが、mddやwin32ddで
その領域は取得できませんでした。

調べてみると、RAMDisk領域として設定した容量分を搭載(認識)しているメモリ容量から差し引いた値が
boot.iniの/MAXMEMオプションで記載されていました。例えば1.5Gのメモリを積んでいるマシンで128Mを
RAMDiskとして設定すると/MAXMEM=1383となります。この動きから、結局はOS管理外の領域として扱って
いることになるのかなと思います。

ということで、ソフトウェアベースのメモリイメージングツールでこのようなOSが認識しない領域を
技術的に取ることができるのか気になるところです。自分にはまだまだわかりそうにないですが、なんとなく
HDDのHPA/DCOと似ているなと思いました。確実に全部取りたいなら以前話題になっていた冷却してから
とか、Guillotine, Firewireなどで行くんでしょう。


少し話が変わりますが、32bitのWindows XPでは仕様上のメモリ最大値は4Gとなっているのに、実際には
3~3.5G程度しか認識しません。この理由は知らなかったんですが、Sysinternals作者のMark Russinovich
さんのブログに書かれていました。

Pushing the Limits of Windows: Physical Memory
http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx

Gavotte Ramdisk系のツールはこの内容とMemory Remapping, PAE, AWEが絡んでいるようなので、
このあたりをしっかり調べて仕組みがわかれば保全にも適用できるかもしれません。