跳到正文
PS5PCEM
可用固件与 HLE

直接内存、灵活内存与池

客户机地址就是真实的主机地址。直接内存是映射进这块空间的稀疏共享物理池,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 单位提交页面,解除映射会解除提交,外层预留仍然保留。两次使用之间,别的主机分配不能抢走客户机地址。

直接内存与灵活内存

直接内存是客户机对物理显存的称呼。游戏先预留一段物理范围,再映射它。两步是分开的。映射会检查整段物理范围都已预留,转换 CPU 与 GPU 保护,然后要么在精确的固定地址上提交,要么搜索一个对齐的空洞。同一个物理偏移可以映射到多个虚拟地址,这些别名是一致的,因为它们共享一个稀疏后备对象。

映射到游戏已经预留的范围时,固定映射在预留内部提交。若先释放预留,游戏对尚未映射的那些片段的主张就会丢失。物理内存按游戏所要求的形状释放,中间可以是一个洞,也可以横跨若干预留。灵活内存使用同一张地址空间表,平台默认预算为 4 GiB,先从 0x02_0000_0000 搜索系统管理窗口,再回退到用户窗口。

MemoryPool 与 Windows 提交

六个 libkernel MemoryPool 导出负责预留虚拟区域、扩展物理容量、提交和解除提交共享后备、运行有序批处理,并报告块统计。捐出的块在已提交时不能当作普通直接内存来映射,也不能释放。批处理的提交、解除提交、保护和类型变更可以工作。批处理 MOVE 仍然不受支持,它返回错误,而不是假装这些块已经移动。

在 Windows 上,对齐的直接内存视图共享 64 KiB 的节视图。因此临时上传、回读和 16 KiB 客户机页不会各自变成不断增长的提交配额。查询预留时使用客户机的 72 字节虚拟查询记录,并带上原始保护位报告半开区间。

已经实现的部分

  • 固定的客户机地址窗口,按 16 KiB 页提交,释放时不放弃预留。
  • 同一个直接内存物理偏移的一致别名。
  • 默认预算为 4 GiB 的灵活内存,以及固定、不覆盖和部分解除映射。
  • MemoryPool 的预留、扩展、提交、解除提交、统计和有序批处理,MOVE 除外。

尚未实现的部分

  • MemoryPool 的批处理 MOVE 被明确标为不受支持。
  • 释放游戏并不拥有的范围仍然是错误。
  • 预留是虚拟的。只有游戏映射的页面才消耗主机提交量。

相关机制

这些页面说明什么

文字依据 PS5PCEM 仓库中的架构说明和 2026 年 10 月的报告。单项测试通过并不等于新的帧率,也不等于新的通关。

全部技术