ダイレクトメモリ、フレキシブルメモリ、プール
ゲストのアドレスは本物のホストのアドレスです。ダイレクトメモリはその空間にマップされる疎な共有の物理プールで、MemoryPool は同じ裏付けの上で予約、コミット、バッチ操作を追加します。
2026年10月10日 までのリポジトリノート
ゲストのアドレスはホストのアドレス
ゲストの x86-64 コードはネイティブに実行され、絶対アドレスを含むため、PS5PCEM はプロセスを任意の割り当てに再配置できません。メモリモジュールは、モジュールを読み込む前に本体のレイアウトを予約します。システム管理のウィンドウは 0x40000 から始まり、32 GiB のすぐ手前まで続きます。その後にシステム予約とデバイスのウィンドウが続きます。Windows と Linux のユーザーウィンドウは 0x10_0000_0000 から 0xFC_0000_0000 まで、944 GiB のアドレス空間です。macOS ではこのウィンドウがより高い位置から始まり、560 GiB になります。
これらの範囲は予約であって、コミット済みの RAM ではありません。ページはマッピングの作成時に 16 KiB 単位でコミットされ、アンマップすると外側の予約を残したままデコミットされます。使っていない間に別のホストの割り当てがゲストのアドレスを奪うことはできません。
ダイレクトメモリとフレキシブルメモリ
ダイレクトメモリは、ゲストが物理ビデオメモリを指す名前です。タイトルは物理範囲を予約し、それからマップします。この 2 つの手順は別々です。マップでは、物理範囲全体が予約済みかを確認し、CPU と GPU の保護を変換して、正確な固定アドレスをコミットするか、アラインされた空きを探します。同じ物理オフセットを複数の仮想アドレスにマップでき、それらのエイリアスはひとつの疎な裏付けオブジェクトを共有するため一貫しています。
タイトルがすでに予約した範囲への固定マップは、予約の内側でコミットされます。先に予約を解放すると、タイトルがまだマップしていない部分の権利を失ってしまいます。物理メモリはタイトルが求める形で解放され、それは途中の穴のこともあれば、複数の予約にまたがる範囲のこともあります。フレキシブルメモリは同じアドレス空間のテーブルを使い、プラットフォームの既定の予算は 4 GiB で、ユーザーウィンドウにフォールバックする前に 0x02_0000_0000 からシステム管理のウィンドウを探します。
MemoryPool と Windows のコミット
libkernel の 6 つの MemoryPool のエクスポートは、仮想領域の予約、物理容量の拡張、共有の裏付けのコミットとデコミット、順序付きバッチの実行、ブロック統計の報告を行います。寄贈されたブロックは、コミット中は通常のダイレクトメモリとしてマップしたり解放したりできません。バッチでのコミット、デコミット、保護、種類の変更は動作します。バッチの MOVE は未対応のままで、ブロックを移動したふりをせずにエラーを返します。
Windows では、アラインされたダイレクトメモリのビューが 64 KiB のセクションビューを共有します。そのため、一時的なアップロード、リードバック、16 KiB のゲストのページが、それぞれ増え続けるコミット負担になることはありません。予約の問い合わせはゲストの 72 バイトの仮想問い合わせレコードを使い、元の保護ビットとともに半開区間を報告します。
実装済みのこと
- 16 KiB のページでコミットされ、予約を手放さずに解放される固定のゲストアドレスウィンドウ。
- ひとつのダイレクトメモリの物理オフセットに対する一貫したエイリアス。
- 既定の予算 4 GiB のフレキシブルメモリと、固定、上書きなし、部分的なアンマップ。
- MOVE を除く MemoryPool の予約、拡張、コミット、デコミット、統計、順序付きバッチ。
まだ足りないこと
- MemoryPool のバッチ MOVE は明示的に未対応です。
- タイトルが所有していない範囲の解放は、依然としてエラーです。
- 予約は仮想的なものです。ホストのコミットを消費するのは、タイトルがマップしたページだけです。
関連するしくみ
これらのページについて