指令集模拟器的高效存储器设计
Designing Efficient memory for an Instruction Set Simulator
我正在用c++设计一个指令集模拟器,它由CPU类、内存类和指令集本身组成。我目前正在尝试设计我的内存类,它将由uint32_t
数据类型组成。
基本上,内存类必须执行以下操作:
- 接受一个值和地址,并将该值分配给内存的特定地址。
- 获取某个地址的值。如果之前已经为它分配了一些值,则获取该值。否则返回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吗?这正好符合你的要求。地址是键,值是数据。
- C++中高效的大型稀疏块压缩线性方程
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何在C++中高效地构造随机骰子
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 更高效地在微控制器上对C++进行基准测试
- 从C++无序集合中高效提取元素
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- C++中特征对角矩阵类型的高效存储
- 高效简单的结构比较运算符
- 使用 Rcpp 的高效矩阵子集
- C++ 包含特征矩阵的类的高效算术运算符重载
- CUDA 高效的 nd-array(张量)切片
- 大多数基本类型的高效二进制序列化
- RAM高效C++属性
- 如何为球形物体和三角形地形提供高效的碰撞检测和响应
- 如何实现四个 i8 元素组的高效_mm256_madd_epi8点积
- 如何在嵌套映射(C++)中高效地查找密钥
- 在C++中高效地保存许多连续记录的图像
- C++ - 将函数链接到触发器的有效和高效方法
- 指令集模拟器的高效存储器设计