在模拟器中寻址内存
Addressing memory in a simulator
编写一个简单的 32 位模拟器(在 C++ 中)但管理内存让我陷入困境。
我的计划是拥有一个二维数组,第一个是指针,每个指针都指向在第一个 read/write 中创建的内存块。
我遇到的问题是如何正确解决它,如果我需要,例如,内存的 216 位地址是否意味着。
- 我需要 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.
显然我的计算在某处完全出错了,但我想不通在哪里!
所以你有一些行,每行包含 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;
编写一个简单的 32 位模拟器(在 C++ 中)但管理内存让我陷入困境。
我的计划是拥有一个二维数组,第一个是指针,每个指针都指向在第一个 read/write 中创建的内存块。
我遇到的问题是如何正确解决它,如果我需要,例如,内存的 216 位地址是否意味着。
- 我需要 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.
显然我的计算在某处完全出错了,但我想不通在哪里!
所以你有一些行,每行包含 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;