連載
» 2009年03月13日 05時00分 UPDATE

Tech TIPS:32bitクライアントOSで利用できる物理メモリは最大4Gbytesまで

32bitのクライアントOSでは、利用可能な最大物理メモリ・サイズは4Gbytesまでに制限されている。実際には、さらにデバイスなどのためにいくらかアドレス空間が削られるので、最大でも3Gbytesとか3.5Gbytes程度までしか利用できない。システムのプロパティには、物理メモリ・サイズではなく、OSが認識しているメモリ・サイズが表示されるので、いくらか少なくなる。

[打越浩幸,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows XP/Windows Vista


解説

●OSのエディションやアーキテクチャで異なる最大物理メモリ・サイズ

 最近ではメモリも安価になっているので、4Gbytesやそれ以上のメモリをシステムに搭載することは簡単だろう。だが使用するOSによってはそのすべてを利用することはできない(関連記事参照)。具体的にいうと、Windows XPやWindows Vistaのx86版といったクライアント向けOS(およびStandard EditionのServer OS)では、サポートされている最大物理メモリ・サイズが4Gbytesに制限されているため、4Gbytesよりも多くのメモリを搭載しても、システムからは4Gbytes分しか認識されず、それ以上のメモリは無駄になる。

 さらにこの4Gbytesという数値も、OSが扱うことが可能な理論的な最大サイズであり、4Gbytes分の物理メモリをすべてこの空間に割り当てて利用できるわけではない。実際のシステムではシステム・デバイス(グラフィックス・カードなど)のために、数百Mbytes〜1Gbytes程度のアドレス空間が消費されるため(グラフィックス・デバイスはアドレス空間にマッピングして利用される)、4Gbytesからそのデバイスのためのアドレス空間を除外しなければならない。結局、32bit版のクライアントWindows OSでは、メモリをいくら搭載しても、3〜3.5Gbytes程度しか利用できないということになる。

 この結果、例えば1Gbytes程度のメモリを消費するプログラムがあるとすると、3つまではすべてメモリ中に配置できるが、4つ目を動作させようとすると、ほかのプロセスはディスクへスワップアウトしながら動作させなければならない(実際にはOSカーネルやキャッシュなどもオンメモリに置く必要があるので、ユーザー・プロセスで利用可能なメモリは2.5〜3Gbytes程度になるだろう)。これではパフォーマンスの低下は避けられないので、例えば64bit OSへ移行するか、Server OSを導入するといった対策を考慮する必要がある。

●4Gbytes以上のメモリを搭載した場合のメモリ・マップ

 32bit版のクライアントOSは4Gbytesの物理メモリしか扱えないが、たいていのPCでは、もっと広い物理アドレス空間をサポートしている。Pentium Pro以降のCPUでは36bit分(64Gbytes)とかそれ以上のアドレス・ライン(アドレス空間)をサポートしており、チップセットやマザー・ボードなどが適切に設計されていれば、8Gbytesや16Gbytesといった、より多くの最大物理メモリをサポートすることができる。

 以下は、4Gbytesの物理メモリを装着したPCにおける、システム起動直後のメモリ・マップの例である。システムが起動すると、BIOSはシステムに装着されているメモリのサイズを調査し、それを物理アドレスの0の場所から順番にアドレスの上方に向かって割り当てていく。途中、いくつかデバイスのためにもアドレス空間を割り当てるので、メモリのサイズと、このメモリ・マップの最後のアドレスは一致しない。

Linux version 2.6.24.4 (root@Knoppix) (gcc version 4.2.3 (Debian 4.2.3-2)) #2 SMP PREEMPT Tue Mar 25 21:35:28 CET 2008
BIOS-provided physical RAM map: ……起動直後のメモリ・マップ
 BIOS-e820: 0000000000000000 - 000000000009f800 (usable) ……メモリ領域1
 BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
 BIOS-e820: 0000000000100000 - 00000000bfed0000 (usable) ……メモリ領域2
 BIOS-e820: 00000000bfed0000 - 00000000bfee3000 (ACPI NVS)  ……システム領域開始
 BIOS-e820: 00000000bfee3000 - 00000000c0000000 (reserved)
 BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
 BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
 BIOS-e820: 00000000fed00000 - 00000000fed00400 (reserved)
 BIOS-e820: 00000000fed14000 - 00000000fed1a000 (reserved)
 BIOS-e820: 00000000fed1c000 - 00000000fed90000 (reserved)
 BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
 BIOS-e820: 00000000ff000000 - 0000000100000000 (reserved)  ……システム領域終了
 BIOS-e820: 0000000100000000 - 0000000140000000 (usable) ……メモリ領域3
Warning only 4GB will be used.
Use a HIGHMEM64G enabled kernel.
……(以下省略)……

※これはCPUから見た物理アドレスのメモリ・マップ。Windows OS上では簡単に確認できないので、代わりに「Knoppix Linux」のカーネル・メッセージから取得したが、この部分はOSによらず同じである(OS起動前に設定されている情報だから)。アドレスは16進数16桁(64bitアドレス)で表現されている。「(usable) 」はRAMが割り当てられている領域、「(reserved)」はデバイスなどが割り当てられている領域。「BIOS-e820」は、メモリ・マップを返すBIOSの機能の名称(番号)。OSは起動時に、このAPIなどを呼び出してメモリ・マップを作成し、どこにメモリが存在するかを把握している。



 メモリやデバイスをCPUの物理アドレス空間に割り当てるのはシステムBIOSの責任だが(システム起動後、OSのロード前にこの作業を行う)、そのBIOSが返すメモリ・マップが上のリストである。システムに搭載しているメモリは4Gbytesなので、物理メモリ・アドレスがすべて連続しているとすると0〜ffff_ffff(16進数表示)になりそうだが、そうなっていない。分かりやすく書き直すと次のようになる。

メモリ領域 アドレス範囲(サイズ)
領域1 0000_0000〜0009_f800(640Kbytes)
領域2 0010_0000〜bfed_0000(3Gbytes)
領域3 1_0000_0000〜1_4000_0000(1Gbytes)
システム起動直後のメモリ・アドレス
このシステムでは4Gbytesのメモリが3つの領域に分かれて物理アドレスにマップされている。領域2と領域3の間にはデバイスなどがマップされている。最新のグラフィックス・カードではなく、VGA程度の機能しか持たない場合は、デバイス用領域がほとんど存在せず、領域2が4Gbytes近くなることもある。そのようなシステムでは、32bit OSでもほぼ4Gbytesのメモリを利用できる。システムによっては、メモリが連続しておらず、さらに細分化されている可能性もある。

 領域1は1Mbytes以下の領域(いわゆるDOS用のアドレス空間)に割り当てられたメモリである。DOSなどとの互換性のために存在する。

 領域2は4Gbytes以下のアドレス空間に割り当てられたメモリである。32bitアドレスでアクセスできる。

 領域3はそれ以外の残りのメモリである。このシステムでは、デバイス用に(4Gbytesのうち)1Gbytesのアドレス空間が予約されているので、領域3には1Gbytesのメモリが存在する。一般的には、領域1と領域2で割り当てた残りの物理メモリは、すべてこの領域にまとめて割り当てられる。この部分をアクセスするには、33bit以上のアドレス・ライン・サポートと、それを考慮したプログラム・コードが必要になる。

●なぜ32bitのクライアント向けOSでは4Gbytesまでしかサポートされないのか?

 Windows XP Professional/Home EditionやWindows Vistaの32bit版OSでは、上記のメモリ領域のうち、領域1と領域2にしかアクセスしないため、利用できるメモリは最大でも4Gbytesに限定されることになる。領域3の部分(オーバー4Gbytesの空間)にアクセスしない理由ははっきりとは公開されていないが、互換性のためであろうと推測される。領域3の部分をアクセスするには33bit以上のアドレス・ラインとそれを考慮したコードが必要になるが、そのようなシステムをサポートしない(対応していない)デバイスもあるし(特に古いデイバスやコンシューマ向けのデバイスの場合)、デバイス・ドライバも十分テストされておらず、動作しないことがあるからだ。トラブルを避けるため、4Gbytes以上をサポートしていないものと思われる(そのような用途では、64bit版OSを推奨しているという事情もある)。

 サーバOSの場合は、十分にテストされたデバイスを使うように推奨しているし、サポートされているデバイスも限定的なので、Enterprise Edition以上のServer OSでは、32bit OSであっても8Gbytesとかそれ以上のメモリがサポートされている。

●4Gbytes以上のメモリを装備した場合のシステムのプロパティ表示について

 Windows VistaのSP1以降では、システムに装備されている物理メモリのサイズをプロパティ画面で報告するようになっている。これは、実際に装着した物理メモリのサイズと異なるという問い合わせなどに対応したものと思われる。

システムのプロパティにおけるメモリ・サイズ表示 システムのプロパティにおけるメモリ・サイズ表示
Windows Vista SP1では、システムに実際に装着されているメモリのサイズがこの画面に表示されるようになっている。
  (1)メモリ・サイズは4Gbytes。SP未適用では、物理サイズではなく、4Gbytes以下の空間にあるメモリ・サイズが表示されていた(3Gbytesとか、3.5Gbytesなどとなっていた)。
  (2)これは32bit版のWindows Vista Ultimate SP1。

 しかしこれはあくまでも、搭載されているメモリのサイズを表しているだけである。実際にOSが認識しているメモリ・サイズ、つまりOSカーネルやユーザー・プロセスなどで利用可能なメモリ・サイズは4Gbytes以下の領域にある部分に限定される。この値はタスク・マネージャなどで確認できる。

タスク・マネージャで見る物理メモリ・サイズ タスク・マネージャで見る物理メモリ・サイズ
Windows OSが実際に利用可能なメモリのサイズは、タスク・マネージャや[アクセサリ]−[システム ツール]−[システム情報]ツールなどで確認できる。
  (1)これがWindows OSが認識しているメモリ・サイズ。実際の物理メモリとの差である1Gbytes分は、通常のアプリケーションからは利用できない。管理外メモリを利用するRAMディスクなどでのみ利用可能。

 OSが認識している以外のメモリ(4Gbytes以上のアドレス空間に存在するメモリ)は、管理外メモリとなる。これは例えば「RAMディスク導入ガイド」で紹介したRAMディスクのようなソフトウェアを使えば活用できる。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。