Memory 如何在N64仿真器中构造内存映射?

Memory 如何在N64仿真器中构造内存映射?,memory,emulation,ram,Memory,Emulation,Ram,根据Wikipedia,N64只有4MB的RDRAM(扩展包为8MB),其他数量也同样小(4KB左右的一级缓存)。然而,我在Google上找到的技术文档指出,它的内存地址范围从$0000:0000到$FFFF:FFFF——也就是4GB!既然像Project64这样的现有N64模拟器不使用4GB的RAM,那么模拟内存映射是如何工作的呢?我试着翻阅了各种各样的文件,所有这些文件似乎都略有不同。有人对这个问题有什么建议吗 具体来说,这是我找到的内存映射: 0x0000 0000 to 0x03EF F

根据Wikipedia,N64只有4MB的RDRAM(扩展包为8MB),其他数量也同样小(4KB左右的一级缓存)。然而,我在Google上找到的技术文档指出,它的内存地址范围从$0000:0000到$FFFF:FFFF——也就是4GB!既然像Project64这样的现有N64模拟器不使用4GB的RAM,那么模拟内存映射是如何工作的呢?我试着翻阅了各种各样的文件,所有这些文件似乎都略有不同。有人对这个问题有什么建议吗

具体来说,这是我找到的内存映射:

0x0000 0000 to 0x03EF FFFF RDRAM Memory
0x03F0 0000 to 0x03FF FFFF RDRAM Registers
0x0400 0000 to 0x040F FFFF SP Registers
0x0410 0000 to 0x041F FFFF DP Command Registers
0x0420 0000 to 0x042F FFFF DP Span Registers
0x0430 0000 to 0x043F FFFF MIPS Interface (MI) Registers
0x0440 0000 to 0x044F FFFF Video Interface (VI) Registers
0x0450 0000 to 0x045F FFFF Audio Interface (AI) Registers
0x0460 0000 to 0x046F FFFF Peripheral Interface (PI) Registers
0x0470 0000 to 0x047F FFFF RDRAM Interface (RI) Registers
0x0480 0000 to 0x048F FFFF Serial Interface (SI) Registers
0x0490 0000 to 0x04FF FFFF Unused
0x0500 0000 to 0x05FF FFFF Cartridge Domain 2 Address 1
0x0600 0000 to 0x07FF FFFF Cartridge Domain 1 Address 1
0x0800 0000 to 0x0FFF FFFF Cartridge Domain 2 Address 2
0x1000 0000 to 0x1FBF FFFF Cartridge Domain 1 Address 2
0x1FC0 0000 to 0x1FC0 07BF PIF Boot ROM
0x1FC0 07C0 to 0x1FC0 07FF PIF RAM
0x1FC0 0800 to 0x1FCF FFFF Reserved
0x1FD0 0000 to 0x7FFF FFFF Cartridge Domain 1 Address 3
0x8000 0000 to 0xFFFF FFFF External SysAD Device

不管您模拟了多少内存,主机上都不需要那么多可用内存(不需要4GB,甚至不需要4MB)。相反,请使用一种数据结构,您可以通过地址值访问模拟内存。仅当您需要在模拟内存中存储某些内容时,才在真实内存中分配空间

然而,实际分配上面描述的内部内存量可能并不重要

和Simon一样,我也会首先假设段:偏移理论,但上面列出的地址范围似乎完全与该理论相矛盾。还有,整个“64位地址空间”


请注意,大部分地址空间分配给外部接口(盒带等),而不是内部硬件资源。

您拥有的映射是抽象的,如果您查看,您会注意到未映射内存的巨大间隙。不包括映射的外部盒式ROM(等),将可用内存的每个部分相加。最终,包括RDRAM在内,您将分配略多于4MB的内存。还要注意,0x8000000以上的地址实际上是较低地址的镜像,区别在于有些直接映射(物理内存),有些是TLB映射(虚拟内存)


另外,请注意,盒带内存映射到0xb0000000。内存映射中没有明确显示这一点。

AFAIK系统的处理器最多可以有4 GB,没有任何问题,但n64本身没有使用这一功能。因此,我认为如果处理器从该区域请求数据,它只会返回00。

也许它们是段:偏移地址,比如16位x86?嗯,我想这是真的。我应该意识到这一点。谢谢
0x00000000 - 0x7fffffff  KUSEG  TLB mapping
0x80000000 - 0x9fffffff  KSEG0  Direct map, cache
0xa0000000 - 0xbfffffff  KSEG1  Direct map, non-cache
0xc0000000 - 0xdfffffff  KSSEG  TLB mapping
0xe0000000 - 0xffffffff  KSEG3  TLB mapping