在模拟器中寻址内存

Addressing memory in a simulator

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

我的计划是拥有一个二维数组,第一个是指针,每个指针都指向在第一个 read/write 中创建的内存块。

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

我的印象是这会像下面这样

    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.

显然我的计算在某处完全出错了,但我想不通在哪里!

所以你有一些行,每行包含 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;