在模拟器中寻址内存

时间:2015-03-29 06:33:51

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

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

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

我遇到的问题是如何正确地解决它,如果我需要,例如,2 16 位地址用于内存就意味着。

  • 我需要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。

显然我的计算方法已经完全出错,但我无法弄清楚在哪里!

1 个答案:

答案 0 :(得分:0)

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

这意味着,如果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;