我正在尝试用 C 编写指令集模拟器来模拟运行 ARM 的机器。我需要能够有效地表示 4GB 内存,经过一番挖掘后,我找到了创建一个由 1024 个指针组成的数组的解决方案,每个指针指向一个 4MB 的块,该块在首次使用时动态分配
#define MEMSIZE 1024 //1024 * 2Mb = 4Gb
#define PAGESIZE 4194304 //4 Mb
#define PAGEEXP 22 //2^PAGEEXP = PAGESIZE
uint32_t* mem[MEMSIZE];
我的问题是如何访问某个内存地址?
我尝试将地址分解为索引和偏移量,如下所示,但这似乎只为索引和偏移量返回 0。(memAdd 是我要访问的地址)
memIdx = memAdd >> PAGEEXP;
memOfs = memAdd & PAGESIZE;
获得地址后,我用来读/写的功能如下:
void memWrite(uint32_t idx, uint32_t ofs, uint32_t val)
{
if(mem[idx] == 0)
mem[idx] = malloc(PAGESIZE);
*(mem[idx] + ofs) = *(mem[idx] + ofs) & val;
}
uint32_t memRead(uint32_t idx, uint32_t ofs)
{
if(mem[idx] == 0)
return 0;
else
return *(mem[idx] + ofs);
}
这些在我的脑海中似乎是正确的,但是我仍然不是 100% 对指针感到满意,所以这可能是错误的。
抱歉,如果这已经在某处讨论过,但我找不到任何与我需要的东西相关的东西(我的关键字非常广泛)