(译者注:本文的虚拟内存不是说把硬盘等外存拿来当内存的技术 是说现代分时操作系统中 每个进程所具有的虚拟内存空间 具体可以参看操作系统理论)
Playstation 2通过0号协处理(co-processor 0, COP0)来实现虚拟内存页。就算没有COP0,Playstation 2的内存映射已经够复杂的了,而且读取内存时内存映射还会根据不同的处理器而改变。如果用的是Emotion Engine(EE),默认的映射看起来就是下面这样的:
32Mb(译者注:国内用32MB更加好些 下同)主内存占用 0000_0000 - 01ff_ffff
硬件寄存器占用 1000_0000 - 1000_ffff
VU/BIOS/SPU2地址在 1100_0000 - 1fff_ffff
特殊核心模式等在 8000_0000 - bfff_ffff
还有一些零星的地址
当然了还有隐藏地址(真要谢谢索尼)
更 麻烦的是,这些映射还和COP0的设置有关。(在写这文章的时候,Pcsx2里面COP0的模拟度还不到一半)。最简单最直接的模拟方法就是通过软件快表 (快表 转换后缓冲器 Translation Lookaside Buffer TLB)实现另外一个内存层,把PS2地址直接转换成实际物理地址或者代表硬件寄存器的特殊代码等等。但是这样做的问题在于每次读写操作都需要先执行快表 查询,而且读写操作就像累加一样普遍,这样会浪费很多CPU周期。
当然,操作系统(OS)也用虚拟内存技术。实际中,每个处理器都有通过 硬件快表实现的特殊虚拟内存。如果我们可以把PS2 4Gb的地址空间映射到处理器的虚拟内存中,我们就可以避免使用软件地址转译(图1)。通过分析Windows XP所提供的虚拟内存功能,发现有两大问题:

1 WindowsXP保留了超过一半的地址空间给操作系统。Pcsx2也需要保留很多的地址空间给工作内存、执行代码和插件(尤其是ZeroGS)。看来只 有不到1.5 Gb的地址空间可以用来实现PS2的4Gb地址空间映射,而在64位系统上就没有这个问题,64位操作系统的地址空间事实上是无限的。(别拿我这话来说未 来20年的发展)
2 Playstation 2允许多于一个的虚拟页映射到相同的物理页,但是Windows XP不允许(不知道Linux怎么样 译者注:Linux是允许的 但是也有些核心页和用户页的重叠等问题)。假设PS2地址0x1000和0x0000指向的物理地址一样,每页4Kb,往0x1000写入后,游戏可以通 过读取0x0000来获得这个值,但是在Windows XP里面这两个地址必须是两个不同的页。除非发现有很聪明的方案或者技术,我们要和我们的虚拟机(VM)梦想说再见了。
第一问题通过在读写操作前引入特殊地址转换技术解决了。
也 要感激真还有一种聪明的方式来解决第二个问题:地址窗扩展(Address Windowing Extensions AWE),这使得Pcsx2可以直接访问物理页而不是虚拟页。虽然还是不能把两个虚拟页映射到同一个物理页,但是我们可以无数次切换物理页的映射。为了达 到这个效果,Pcsx2入侵根异常处理器(root exception handler),并监视程序产生的全部异常,一旦出现非法虚拟页访问(比如说没有实际的物理地址映射到虚拟页上),Pcsx2就会得到 EXCEPTION_ACCESS_VIOLATION异常,然后就会把正确的物理页映射过去,并返回值。
插入
有人指出CreateFileMapping和MapViewOfFileEx也可以达到同样的双重映射效果,也不用去搞物理页锁定和异常处理,但是地址页必须是64Kb的整数倍。多数PS2游戏的页大小是4Kb,这么搞可能无法完成全部映射。我希望有人能证明我是错的。
插入结束
我没有精确计算过,但是几乎可以肯定这样切换物理页的在运算量上的代价是高昂的。所以我们假设游戏设计者不会疯狂到频繁访问两个映射到同一个物理页的虚拟页。[打住]
实际上我们又错了(参看floating-point博客)。实际上存在缓存地址空间和非缓存地址空间,所以最好最好还是实现双重映射,从一个虚拟页写,从另一个虚拟页读。Pcsx2尽可能侦测这样的情况,但是并没有确实的方案。
我就此打住,以免写成一本书。
所 以说最终的问题在于为什么VM在有些1Gb内存并且自动更的电脑上不可以跑,有些又可以?某些进程的实时监测程序(可能也是操作系统的程序)可能会把剩下 的1.5Gb地址空间占掉一部分,我还发现了NvPerfHud这样的性能/错误监测器(performance/debugging monitor)也采用了类似的方法,也许还有其他的原因造成VM版Pcsx2不能使用,毕竟虚拟内存是一个比较棘手的问题。
博客中心思想:读一本操作系统的书籍,我推荐Abraham Silberschatz, Peter Baer Galvin, Greg Gagne 写的Operating System Concepts (恐龙级书籍)
更详细的请查看:Pcsx2的虚拟内存问题

