我在C ++中设计一个指令集模拟器,它由CPU,内存和指令集本身的类组成。我目前正在尝试设计我的内存类,它将包含uint32_t
数据类型。
基本上,内存类必须执行以下操作:
我想到的是我需要一个搜索算法才能找到我感兴趣的地址。
我已经实现了最简单的可用版本,它将是一个线性内存搜索,其中所讨论的内存块只是一个简单的结构*block
,其值和地址存储在{{1 }}。但是,正如您可能猜到的那样,对于大型案件来说这是非常昂贵的。
总而言之,我想实现一个可以轻松找到记忆的案例(我正在思考二元搜索,但我可以接受更多建议),而且我也希望有关安排的建议我的记忆块vector<block*>
。我目前正在使用矢量,因为我不知道我需要的内存大小。
答案 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?那就完全符合你的要求。地址将是关键,值将是数据。