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

时间:2014-05-28 03:06:07

标签: c++ c memory computer-architecture instruction-set

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

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

  1. 接受值和地址,并将该值分配给内存的特定地址。
  2. 获取某个地址的值。如果之前已经分配了某些东西,那就获得该值。否则,返回0。
  3. 我想到的是我需要一个搜索算法才能找到我感兴趣的地址。

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

    总而言之,我想实现一个可以轻松找到记忆的案例(我正在思考二元搜索,但我可以接受更多建议),而且我也希望有关安排的建议我的记忆块vector<block*>。我目前正在使用矢量,因为我不知道我需要的内存大小。

2 个答案:

答案 0 :(得分:5)

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

假设您的模拟应用程序试图在地址byte存储0x05001234

那将在内存页面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;

之类的字节

答案 1 :(得分:1)

您是否尝试过使用std :: map?那就完全符合你的要求。地址将是关键,值将是数据。