为指令集模拟器设计高效内存

use*_*175 2 c c++ memory instruction-set computer-architecture

我正在用C++设计一个指令集模拟器,它由CPU,内存和指令集本身组成.我目前正在尝试设计我的内存类,它将包含uint32_t数据类型.

基本上,内存类必须执行以下操作:

  1. 接受值和地址,并将该值分配给内存的特定地址.
  2. 获取某个地址的值.如果之前已经分配了某些东西,那就获得该值.否则,返回0.

我想到的是,我需要一个搜索算法来查找我感兴趣的地址.

我已经实现了最简单的可用版本,它将是一个线性内存搜索,其中所讨论的内存块只是一个简单的结构,*block其值和地址存储在一个vector<block*>.但是,正如您可能猜到的那样,对于大型案例来说这是非常昂贵的.

总而言之,我想实现一个可以轻松找到内存的情况(我正在考虑二进制搜索,但我愿意接受更多建议),而且我也希望有关安排内存块的建议*block.我目前正在使用矢量,因为我不知道我需要的内存大小.

Hav*_*ard 5

您可以创建类似于实际OS处理进程内存的方式.你可以拥有每页 64KB 的内存页面,并按以下方式存储它们:

让我们说你的模拟应用程序试图byte在地址存储一个0x05001234.

这将在内存页面0x0500(十进制1280).您可以简单地读取前16位以获取页面地址,这样可以使其完全达到64KB.

使用a std::map来保持内存页面的有序性.有点像std::map<int, char*> pages;.或者char *pages[0x00010000];在32位系统中应该使用256KB内存的数组.别忘了把它归零.

检查您的设备中是否已有内存页面0x0500.你只需要看到pages[0x0500]不是NULL.如果不存在,则pages[0x0500] = new char[0x00010000];创建它.如果你必须把它归零.

现在就像写字节一样pages[0x0500][0x1234] = byte;.