メモリその9

さて、大まかな管理構造は結構大きく違うWindowsのPage管理だが、意外に似ている部分もある。例えばこの回で、Valid bitが無効な4種類のPTEのケースを紹介したが、これを7.6.1「無効PTE」(上巻P513~)と比較してみると、非常に似ている事が判る。Invalid global pageに当たるものは無いが、これはWindowsが(VMSのSectionにあたる)Shared Pageに関してプロトタイプPTE(上巻P514)という仕組みを追加して、こちらで管理しているから、PTEのInvalid Statusからは外されたのだろう、と想像される。

そのプロトタイプPTEにしても、状態が6種類あって、これがこちらの図3に出てくるものと全く同じ、というあたりが、Page管理の共通性を伺わせる。

もっともPFNが取りうる値そのものはだいぶ拡張されている。WindowsのPFNのページ状態は7.11(上巻P548)の表7-20に詳しいが、スタンバイとか変更書き出し無し、ロム/使用不可といったステータスはVMSには存在しない。ただスタンバイは移行(VMSの"Page is in transition")を「移行」と「スタンバイ」に分けた関係で追加されたとわかるし、変更書き出し無しはNTFSトランザクションなどの機能に対応して追加されたものだ。ロムはWindows XP以降の導入だから、なければ困る訳ではなかった。恐らくWindows Embedded向けの機能と思われるが、別にWindows XPの以前からEmbedded向けNTは存在し、問題なく動作していたからだ。そもそもBIOSとかVGAなどのROMはメモリ空間にMapされていたわけで、それを別に問題なく扱えた(Read OnlyのReference Pageとして扱えば済むだけの話だ)。

一番謎なのが使用不可である。勿論、機能的には理解できる。パリティなりECCなりのエラーを検出したページを利用不能にするということだ。ただ筆者の知る限り、これを動的に管理できるWindowsは存在しない。例えばDatacenter Serverなどを利用する基幹系向けシステムの場合、メモリも冗長構成やホットスワップをサポートしているが、これらは何れもWindows以前にハードウェア(というか、インフラストラクチャ)レベルでサポートされている。例えばメモリエラーが出た場合、それがECCなどでリカバー可能であれば自動的にリカバーすると共にエラーレポートを上げる。エンジニアは定期的にエラーの頻度をサンプリングしておき、ある程度の頻度になったらそのメモリを交換するといった具合だ。またECCでもカバーできないような大規模エラーが発生した場合、ミラーリングを解除して故障したメモリをホットスワップで交換。復帰後にミラーの復元を行うといった具合になる。従って、理屈はともかく実際の運用でこんなページが存在しえる可能性が無い気がする。デスクトップにしても、エラーが出るメモリモジュールを使うとあっさりブルースクリーンが出て終わるのが普通な事を考えると、初期化時にエラー箇所を記録しておき、そこを使わないようにするなんて実装がなされているとは思いがたい。これは将来RAS機能がもっと充実した時用にあらかじめ用意したStateなのかもしれない(というか、他に理由が想像できない)。

話を元に戻すと、そんなわけで基本的にはVMSのPFNと基本的には取りうる値が殆ど変わらない事が理解できる。要するにWindowsもまた、PageTableをベースにメモリ管理を行っている事が判る。「Windowsの場合、PageTableの前にPageDirectoryがあるのでは?」という指摘は当然正しい。Inside Windowsでは軽く「PDEのフォーマットはハードウェアPTEと殆ど同じですから、ここでは説明せず、ハードウェアPTEを説明する後の節で説明します」(上巻P499)と流している。実際、PDEもPTEも、どちらも10bit分のアドレスを指定するから、同じフォーマットにしてしまったという事だろう。ではPDEの中で、PageTable指定の10bit以外には何が入っているかという話だが、これはPTEにおける"Page"を"Page Table"に読み替えれば良いという事だと思われる。Page DirectoryもPage Tableも、そのサイズは4KB(1024エントリで1エントリが32bit=4Bytes)になっているから、丁度1ページに収まる。なので、あるPageTableが作成されてオンメモリにあればValidだし、それがPage In/Outの最中なら移行になる。これからPage Tableを作成するというのであれば、Demand Zeroになっているかもしれない。流石にMapped Fileになることは無いとは思うが。