x64のWindowsのメモリマップについての調査メモ

木村屋です。この記事は私のブログからの転載です。
今回はx64のWindowsのメモリマップについて簡単に調べてみました。
調査結果のメモをまとめたので備忘録として公開します。以下は調査結果のメモです。
急いで調べたため、間違いや勘違いも含まれていると思われます。予めご了承ください。
正確性を期した積もりですが誤りがあった場合は文責はすべて私にあります。
以下は調査結果のメモです。

Windowsのメモリ管理は仮想アドレス空間を使って行われる。物理アドレス空間から仮想アドレス空間への切り替えはWindowsが担当しているため（ページング処理）、Windowsのアプリケーションを書くプログラマの目から見えるメモリは仮想アドレス空間である。物理アドレス空間にどの様にWindowsが展開しているのかなどはアプリケーションを作るプログラマは意識しなくても問題が無いようになっている。
x64のWindowsのメモリ管理の詳細については『インサイドWindows 第6版 下』の『第10章メモリ管理』を参照のこと。
64bitの場合、仮想アドレス空間の理論上の限界は16EB（エクサバイト。テラバイト、ペタバイトに続く次の記憶装置の大きさを表す単位）である。
しかし、Windows 7などは現在、実装上の制限によりすべてが使われてはいない。将来的に拡張が行われ、実際に使われる仮想アドレス空間が16EBに近づいていく事は十分に考えられる。
x64のWindowsの仮想アドレス空間のサイズの上限は現在、16TBである。
x64のWindowsではメモリ空間の使用目的をアプリケーションとカーネルに分けている（x64のアプリケーションが使えるメモリの限界は8TB。残り半分の8TBはWindowsのカーネルが使用する。0x0000000000000000H～0x000007FFFFFFFFFFHまでの領域をユーザー空間としてアプリケーションが使用する。
0xFFFFF80000000000H～0xFFFFFFFFFFFFFFFFHのアドレスはカーネルが使用し、全プロセスで共有する）。
Windowsの種類とエディションによって、サポートされる最大物理アドレス空間には制限がある。ここではすべてを載せないが、例を挙げるとx64のWindows 7 Home Premiumの物理アドレス空間の上限は16GBであり、Windows 7 Professional、Windows 7 Enterprise、Windows 7 Ultimateの物理アドレス空間の上限は192GBである。Windows 8の各エディションでは最大物理アドレス空間が更に拡張されており、今後も増加していくことが見込まれる。
現在、CPUのアーキテクチャを単純化し、アドレス変換で不要なオーバーヘッドを避けるため、AMDとIntelがx64プロセッサの実装でサポートする仮想アドレス空間を256TBに制限している。ハードウェアの進歩に合わせ、この制限も徐々に緩和され、x64プロセッサがサポートしている仮想アドレス空間の上限も拡張されていることが予想される。
0x0000000000000000H～0x000007FFFFFEFFFFHはユーザーモードのプロセスの仮想アドレス空間として使用される。プロセスごとに個別に存在する。
0x000007FFFFFF0000H～0x000007FFFFFFFFFFHは64KBのアクセス不能領域として使用される（詳細不明）。
0xFFFF080000000000H～0xFFFFF67FFFFFFFFFHはシステム空間の先頭として使用される。
0xFFFF680000000000H～0xFFFF6FFFFFFFFFFFHは4つのレベルで構成される512GBのページテーブルマップとして使用される。
0xFFFF700000000000H～0xFFFF77FFFFFFFFFFHはハイパースペース：ワーキングセットリストとプロセスごとのメモリ管理構造がマッピングされる512GBの領域として使用される。
0xFFFF780000000000H～0xFFFF780000000FFFHは共有システムページとして使用される。
0xFFFF780000001000H～0xFFFF788000000F80Hはシステムキャッシュワーキングセット情報が格納される512GB-4KBの領域として使用される。
0xFFFFF80000000000H～0xFFFFF87FFFFFFFFFHはローダによって初期化されたマッピング（512GB領域）として使用される。FFFFF80000000000Hから上の領域をx64のWindowsのカーネルが使用する。
0xFFFFF88000000000H～0xFFFFF89FFFFFFFFFHはシステムPTE領域の先頭（カーネルモードアクセス専用の128GB領域）として使用される。
0xFFFFF8A000000000H～0xFFFFF8FFFFFFFFFFHはページシステム領域の先頭（カーネルモードアクセス専用の128GB領域）として使用される。
0xFFFFF90000000000H～0xFFFFF97FFFFFFFFFHはwin32k.sysのセッション構造体（512GB領域）として使用される。
0xFFFFF98000000000H～0xFFFFFA7FFFFFFFFFHはMI_DYNAMIC_KERNEL_VA_BYTESの長さのMM_SYSTEM_SPACE_STARTはMiSystemVaBitMapによって管理される。一般的には1TBで、システムキャッシュ、システムPTE、特別なプールの為の領域として使用される。
0xFFFFFA8000000000H～0xFFFFFFFF00BFFFFFHはPFN（ページフレーム番号）データベースと初期および拡張非ページプール（カーネルモードアクセス専用で最大128GB）として使用される。この領域すべてを使用するわけではなく、この領域の一部に配置されると思われる。詳細については不明。
0xFFFFFFFF00C00000H～0xFFFFFFFFFFFFFFFFHはHALの為に少なくとも4MBが予約される。カーネルのブート時にマッピングされたままにしておくと、ローダー/HALが追加の仮想アドレス空間を利用できる。

ユーザーアドレス空間のレイアウトについては、ASLR（Address Space Layout Randomization）というメカニズムを通じ、スレッドスタック、プロセスヒープ、実行可能ファイルのテキスト領域、DLLなどのアドレスは動的に計算される。
ただし、アプリケーションとそのイメージがASLRをサポートしている事が前提となる。
ASLRがサポートされていない場合、スレッドスタック、プロセスヒープ、実行可能ファイルのテキスト領域、DLLなどのアドレスは固定されたアドレスに読み込まれるものと推察するが詳細については不明。今後、調査が必要。

以上です。今後も調査を実施し、必要に応じて記事の訂正、記事の追加などを行います。

**引用文献**
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 10.5.1 x86のユーザーアドレス空間レイアウト インサイドWindows 第6版 下 247
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 10.5.5 64ビットのアドレス空間のレイアウト インサイドWindows 第6版 下 255
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 10.5.6 x64の仮想アドレスの制限 インサイドWindows 第6版 下 259
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 10.5.9 ユーザーアドレス空間のレイアウト インサイドWindows 第6版 下 266
Windows TIPS：Windows OSでサポートされている最大物理メモリサイズは？ - ＠IT http://www.atmarkit.co.jp/ait/articles/0903/06/news136.html

**引用元**
南関東開発機構 : x64のWindowsのメモリマップについての調査メモ
http://blog.livedoor.jp/south_kanto_dm/archives/52099134.html