写一个简单的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
。
这意味着,如果n
是uint32_t
的索引(从0到2047),则行是n / 32
,列是n % 32
。
你没有说你是如何映射地址的,但我想你的意思是地址0
到3
是第一个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;