3GBの壁についてのまとめ(後編)

ご注意
この記事は私が様々なWebsite、Blog、掲示板等をあくまで個人的に回ってまとめたものであり、内容の正確さを保証するものではありません。書いてある情報通りに行動して何かしらのトラブル等が起こったとしても、当方では責任はもてません。あくまで自己責任でお願いします。

なお、記述してある内容は一般的な(x86アーキテクチャの)Windowsマシンを対象にしています。

「3GBの壁」FAQ その2

いわゆる「3GBの壁」問題のまとめの後編です。今回は「なぜそれが起こるのか?」という技術的な観点の話になります。一般的な対処方法などの話題は前編を読んでください。

なぜ32bit版Windowsでは4GBのすべてを認識することができないのですか?

一般的なPCがWindows・ハードウェア共に制御の方法として、「メモリマップドI/O」(以下MMIO)という仕組みを利用しているからです。

まず前提として、32bit Windowsが扱えるアドレス空間は32bit=4GB[4,294,967,296Byte](2の32乗)です。Windowsは扱うことができるアドレス空間にメインメモリを割り当てて、初めてメモリを使用することができます。

逆にPCに搭載されていても、アドレス空間に割り当てられていないメモリは使用できないので、ある意味“存在しない”のと同じです。要するに、「32bitのWindowsはアドレス空間を4GBしか持っていない」から「使用できるメモリは4GBまで」ということになるわけです。ここまでの話ならば、単純にアドレス空間=メモリ容量と考えることができるでしょう。

そこで最初のMMIOの話に戻ります。

MMIOは有限であるアドレス空間に、メモリと様々なデバイス制御用の空間を共有させる仕組みです。接続しているデバイスの制御(使用)をするには、アドレス空間が必要になるということです。

PCはまずデバイス制御用に必要な空間をアドレス空間に予約し、残りをメインメモリに割り当てます。領域を被って使用することはできないからです。デバイス制御用に割り当てられる領域が多ければ、その分使用できるメインメモリは少なくなります。

アドレス空間(4GB)-デバイス制御用予約分(1GB前後)=使用できるメモリ量(3GB前後)

32bit Windowsの場合は上記のような形となります。つまり、一般的な32bit版Windowsの「4GBメモリサポート」というのは、「4GBのアドレス空間をサポートする(扱える)」と言い換えた方が正しいかもしれません。

3GBの壁(図解)
3GBの壁(図解)

なぜ64bit版Windowsならば4GBをフルに使用できるのですか?

64bit OSの名前のとおり、アドレス空間が64bitに拡張されているからです。(64bit=16EB(エクサバイト)=17,179,869,184GB)アドレス空間が絶対的に広がっているため、デバイス予約用にアドレス空間が割り引かれても問題にはなりません。

ただし、実際は64bit OSなら16EBのメモリを搭載できるということにはなりません。現実的な限界量はハードウェアとWindowsのエディションによって決まっています。(Vistaの例)例えばVistaの日本での最低グレードであるHome Basicは、64bitでもメモリサポートは8GBまでです。

つまり、64bit OSだからといって物理アドレスを64bit=16EB持っているわけではないのです。上記のとおり、具体的に物理アドレスをどれだけ持っているかは、OSのバージョンやエディションによって仕様として決められています。

例えばXP 64bit Editionの物理アドレス量は128GBですから、37bitということになります。上限が64bitとしても、実際にどれだけの物理アドレスを使用可能にするかは、マイクロソフトの設定次第というわけです。

一部の32bit版Windowsはなぜ4GB以上のメモリが扱えるのですか?

OSのアドレス空間を32bit以上に拡張してあるからです。メモリを拡張されたアドレス部分に再割り当てすることによって、MMIOでデバイスが予約している領域を回避してメモリを使用することができます。例えば36bitまで拡張してあれば、64GB[68,719,476,736byte]のアドレス空間を持ちます。

使えない部分のメモリをRAMディスクに割り当てることはできませんか?

断言することはできませんが、現状では不可能な模様です。RAMディスクを作るためのユーティリティやアプリケーションがメモリを3GBまでしか認識しないため、その部分をRAMディスクを割り当てることができないようです。無理矢理アドレスを書き換えて割り当ててみたという情報もありましたが、やはり使うことはできなかったという結論のようでした。

Gavotte Ramdiskというソフトで使用可能になりました。

64bit版Windowsを入れましたが、4GBフルに認識しません

ハードウェアがきちんと対応しているなら、BIOS設定の可能性があります。マザーボードのメーカやBIOSによって名前は違うようですが、「Memory Hole Remapping」や「Memory Remap Feature」などの項目をEnableにすると解決するとのことです。項目が存在しないようならばBIOSを最新のものにアップデートして、それでも存在しないならマザーボードを買い換えるしかないかもしれません。

後編の続きの補足を書きました。

アドレス空間がよくわからない(区別が付かない)という方のために以下の記事を書きました。興味がある方は参照してください。

参考になったサイト