将文件映射并索引到内存中以进行读/写

时间:2017-06-13 23:01:29

标签: c mmap

我正在尝试通过mmapping 1 MiB文件来建模基本CPU,对应于RAM大小。我想读/写这个文件。我的困惑是,我认为我可以mmap我的文件,然后索引到内存块,就好像它是一个数组。我已经在网上看到了一些做得同样多的例子。例如,给出以下代码段:

int16_t ramD;
if ( (ramD = open("ramMap.txt", O_RDWR | O_CREAT, 1)) == -1)
{
    errx(EX_OSERR, "RAM could not be initialized");
}
uint16_t* ram = mmap(0, ram_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, ramD, 0);

如何访问此mmapped文件中的特定位置以进行读写?我认为它会像ram[36]那样简单,它可以让我访问mmap返回的指针的第36个字节偏移量,但似乎并非如此。为了测试,我做了一个printf("%p\n", (void *) &ram);来查看mmap指向的是哪个地址给了我0x7fffffffde18,(顺便说一下,它与我指定的mmap参数0无关)。同时,printf("%p\n", (void *) &ram[36])返回0x7ffff7ee1048

mmap是不是在线性块中给我记忆?我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

printf("%p\n", (void *) &ram);

为您提供堆栈上本地变量ram的地址。你想要

printf("%p\n", (void *)ram);

获取你映射的ram的地址。此外,由于您将ram声明为uint16_tram[36]将是内存的第36个 1 16位字(字节72和73)。< / p>

1 从0开始计数