【问题标题】:Addressing memory in a simulator在模拟器中寻址内存
【发布时间】:2015-06-02 07:05:21
【问题描述】:

编写一个简单的 32 位模拟器(在 C++ 中)但管理内存让我陷入了循环。

我的计划是有一个二维数组,第一个是指针,每个指针指向内存块,这些内存块是在第一次读/写内存块时创建的。

我遇到的问题是如何正确解决它,例如,如果我需要 216 位内存地址是否意味着这一点。

  • 我需要 2048 个单词的内存(其中每个单词都是 32 位 uint
  • 可以分为 64 个 32 个字的块(每个块为 1024 字节,或 8192 位)

我的印象是这会如下所示

    uint32_t* m[64];
    // When first read or write into a block create as follows
    m[block] = new uint32_t[32];

这意味着最后一个可访问的地址是 0xfffc(因为 0x10000 是地址的总数)。

现在,如果这一切都正确(我不确定它是否正确),我认为实际进入内存将如下所示

    uint32_t whichBlock = addr / (32 * 4);
    uint32_t blockLoc = (addr % 32) / 4;

这似乎适用于,例如 0x80,因为whichBlock 的地址为 1,blockLoc 为 0(即第二块中的第一个字),但当地址类似于0xff8c 将whichBlock 设为 511,blockLoc 设为 3。

显然我在某个地方的计算完全出错了,但我不知道在哪里!

【问题讨论】:

  • 如果您只需要 2^16 位的内存,只需创建一个大小合适的向量(或数组,如果需要),然后完成。所涉及的内存量太小了,不值得麻烦(实现它可能会使用足够多的代码,最终导致成本超过节省的成本)。
  • 对不起,我想我应该说清楚,但我实际上必须处理 2^32 位的内存,这对于向量来说太大了。我只是说 2^16,因为我试图使用较小的值以便于理解,谢谢
  • 2^32 位对于矢量来说仍然不算大。它确实提供了一点更多的理由,但我仍然会至少在第一次切割时使用向量(并在以后减少内存使用量,当/如果测量表明它是一个重要因素 - - 但它可能不会)。
  • 我看错了规范,我很傻,感谢您的反馈,因为阅读您的回答让我意识到我从根本上误解了规范。我一直在寻找的是地址本身是 32 位(或在我的示例中为 16 位),这意味着该数组太大而不能仅作为单个数组。我已经编辑了原始问题以反映这一点

标签: c++ memory memory-management 32-bit memory-address


【解决方案1】:

所以你有一些行,每行包含 32 uint32_ts 。

这意味着如果nuint32_t 的索引(从0 到2047),那么行是n / 32,列是n % 32

你没有说你是如何映射你的地址的,但我假设你的意思是地址 03 是第一个 uint32_t 等等。如果是这样,那么将地址除以sizeof(uint32_t) 得到我上一段中的n

所以你可以:

size_t address = 0x1234;
size_t index = address / sizeof(uint32_t);
size_t whichBlock = index / 32;
size_t blockLoc = index % 32;

【讨论】:

  • 非常感谢@Matt 我想我真的只是想多了,把我的大脑炸了
猜你喜欢
  • 2012-05-11
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多