编写一个简单的32位模拟器(用C ++编写),但管理内存会让我陷入循环。
我的计划是拥有一个2D数组,第一个是指向每个指向内存块的指针,这些指针是在第一次读/写到块中时创建的。
我遇到的问题是如何正确地解决它,如果我需要,例如,2 16 位地址用于内存就意味着。
uint
)我认为这会出现如下情况
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。
显然我的计算方法已经完全出错,但我无法弄清楚在哪里!
答案 0 :(得分:0)
所以你有一些行,每行包含32 uint32_t
s。
这意味着,如果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;