小编Ren*_*ena的帖子

Linux:在我的进程中管理虚拟内存映射以实现快速仿真

最近我发现很多模拟器都很慢,因为它们不仅需要模拟CPU,还要模拟模拟设备的内存.当设备具有内存映射I/O,虚拟内存或仅未使用的地址空间时,必须在软件中模拟每个内存访问.

如果操作系统通过虚拟内存为我们这样做,我觉得它可能会快得多.为了简单起见,我将使用Game Boy仿真作为示例,但显然这种方法对于更新,更强大的机器会更好.

Game Boy记忆图大致是:

  • 0x0000 - 0x7FFF:映射到盒式ROM
    • 大多数墨盒固定为0x0000 - 0x3FFF,写入0x2000时可将0x4000 - 0x7FFF存储区切换
  • 0x8000 - 0x9FFF:视频RAM(仅在当前未呈现时可访问)
  • 0xA000 - 0xBFFF:映射到盒式磁带(通常由电池供电的RAM)
  • 0xC000 - 0xDFFF:内部RAM(0xD000 - 0xDFFF是GB颜色上的bankwitched)
  • 0xE000 - 0xFDFF:内部RAM的镜像
  • 0xFE00 - 0xFE9F:对象属性存储器(精灵RAM)
  • 0xFEA0 - 0xFEFF:未映射(打开总线或其他东西,不确定)
  • 0xFF00 - 0xFF7F:内存映射I/O(音响系统,视频控制等)
  • 0xFE80 - 0xFFFF:内部RAM

因此,传统的模拟器必须转换每个内存访问,如:

if(addr < 0x4000) return rom[addr];
else if(addr < 0x8000) return rom[(addr - 0x4000) + (0x4000 * cur_rom_bank)];
else if(addr < 0xA000) {
    if(vram_accessible) return vram[addr - 0x8000];
    else return 0xFF;
}
else if(addr < 0xC000) return saveram[addr - 0xA000];
else …
Run Code Online (Sandbox Code Playgroud)

linux memory emulation virtual-memory memory-mapping

5
推荐指数
1
解决办法
693
查看次数