在模拟器中寻址内存



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

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

我遇到的问题是如何正确寻址,例如,如果我需要内存的216位地址,这意味着什么吗。

  • 我需要2048个字的内存(其中每个字都是32位uint
  • 它可以被划分为32个字的64个块(每个块是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时,这显然是错误的,0xff8c给出whichBlock为511,blockLoc为3。

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

所以您有一些行,每个行包含32个uint32_t

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

最新更新