c++ - 模拟游戏机的内存映射,根据提供的地址访问不同的位置

标签 c++ low-level emulation memory-mapping

我正在为旧游戏机实现模拟器,主要用于学习目的。

此控制台将 rom 和许多其他内容映射到其地址空间内的区域。某些位置也被镜像,以便多个地址可以对应于相同的物理位置。我想效仿这一点,但我不确定这样做的好方法是什么(也不知道这个过程叫什么,因此这个有点笼统的问题)。

一个有用的东西是一个简单的、无序的 map 。让它包含绝对地址和指向我的数据结构的相应指针。这样,我就可以轻松地将我需要的所有内容映射到系统的地址空间中。这种方法的问题在于,它显然是一种内存消耗。由于上述镜像,即使是小 rom,我最终也有近千万个条目。当然,这不是正确的做法吗?

非常感谢任何帮助。

编辑:

提供一些关于我是如何做到这一点的细节:

有问题的系统当然是 SNES。使用 this wiki作为我的主要资源,我按如下方式实现了上面提到的内容:

  • 创建 std::unordered_map<uint32,uint8_t*> mMemoryMap;
  • 检查rom是LoRom还是HiRom
  • 对于rom中的每个字节
    • 计算应该映射到的地址,并将地址和指向该字节的指针放置在映射中
    • 如果该部分需要镜像到其他地方,重复上述操作
  • 这将应用于我需要提供的任何其他内容,例如视频或系统内存

如果我现在想访问地址空间内的任何内容,我可以简单地使用系统将在内部使用的地址。

最佳答案

我假设对于连续地址,物理位置在特定内存块或“ block ”内也是连续的。也就是说,如果地址 0x0000 映射到 0xFF00,则 0x0004 映射到 0xFF04。

enter image description here

如果它们是这样工作的,那么您可以制作一个包含这些 block 信息的列表。说:

struct Chunk
{
   int addressStart, memoryStart, size;
}

block 可以按 addressStart 排序,因此您可以找到任何地址所需的正确 block 。这需要您迭代列表,但如果您只有几个 block ,这可能是可以接受的。

关于c++ - 模拟游戏机的内存映射,根据提供的地址访问不同的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933177/

相关文章:

c++ - 如何跳过 ddd (gdb) 中的过去循环

c++ - 为什么以及何时应该使用 IPC_NEW 创建信号量?

c++ - 公共(public)静态变量访问

performance - 在哪里可以了解低级、核心性能的东西?

.net - 从 .NET 程序集 (dll) 中获取所有静态(内部)字符串

c++ - GetTempPath() 写入的内存是否比发送的内存多?

audio - 关于音频直播应用的性能

c++ - 减少模拟器中 switch 语句的大小?

ruby - Perl:如何模拟 Ruby 的 "include/extend"机制?

android - Xamarin 函数错误