指令集模拟器的高效存储器设计

Designing Efficient memory for an Instruction Set Simulator

本文关键字:存储器 高效 模拟器 指令集      更新时间:2023-10-16

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

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

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

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

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

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

您可以创建类似于实际操作系统处理进程内存的方式。您可以有页的内存,比如说,每个64KB,并以以下方式存储它们:

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

应该在内存页0x0500(十进制1280)中。您可以简单地读取前16位以获得页面地址,这是使其恰好为64KB的好处。

使用std::map来保持内存页面的组织。比如std::map<int, char*> pages;。或者在32位系统中使用256KB内存的数组char *pages[0x00010000];。别忘了把它调零。

检查是否已经在您的集合中有一个内存页0x0500。你只需要看到pages[0x0500]不是NULL。如果它不在那里,pages[0x0500] = new char[0x00010000];创建它。如果有必要,可以把它调零。

现在把字节写成pages[0x0500][0x1234] = byte;

您试过使用std::map吗?这正好符合你的要求。地址是键,值是数据。