映射文件并索引到内存中以进行读/写
mmapping a file and indexing into the memory for read/ write
我正在尝试通过映射一个 1 MiB 文件(对应于 RAM 大小)来为基本 CPU 建模。我想要 read/write 这个文件。我的困惑是我认为我可以只映射我的文件,然后索引到内存块中,就好像它是一个数组一样。我在网上看到了一些例子,它们已经完成了同样多的工作。例如,给定以下代码段:
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);
我如何访问此映射文件中的特定位置以进行读写?我认为它会像 ram[36]
这样简单,这将使我能够访问 mmap 返回的指针的第 36 个字节偏移量,但情况似乎并非如此。为了测试我做了一个 printf("%p\n", (void *) &ram);
来查看 mmap 指向哪个地址给我 0x7fffffffde18
(顺便说一下,它离我指定的 mmap 参数 0 很远)。同时,printf("%p\n", (void *) &ram[36])
returns 0x7ffff7ee1048
。
mmap 不是以线性块的形式给我内存吗?我在这里错过了什么?
这个
printf("%p\n", (void *) &ram);
为您提供局部变量 ram
在堆栈上的地址。你要
printf("%p\n", (void *)ram);
获取您映射的 ram 的地址。此外,由于您将 ram
声明为 uint16_t
,ram[36]
将是内存的第 36 个 1 16 位字(字节 72 和 73 ).
1当然是从0开始数
我正在尝试通过映射一个 1 MiB 文件(对应于 RAM 大小)来为基本 CPU 建模。我想要 read/write 这个文件。我的困惑是我认为我可以只映射我的文件,然后索引到内存块中,就好像它是一个数组一样。我在网上看到了一些例子,它们已经完成了同样多的工作。例如,给定以下代码段:
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);
我如何访问此映射文件中的特定位置以进行读写?我认为它会像 ram[36]
这样简单,这将使我能够访问 mmap 返回的指针的第 36 个字节偏移量,但情况似乎并非如此。为了测试我做了一个 printf("%p\n", (void *) &ram);
来查看 mmap 指向哪个地址给我 0x7fffffffde18
(顺便说一下,它离我指定的 mmap 参数 0 很远)。同时,printf("%p\n", (void *) &ram[36])
returns 0x7ffff7ee1048
。
mmap 不是以线性块的形式给我内存吗?我在这里错过了什么?
这个
printf("%p\n", (void *) &ram);
为您提供局部变量 ram
在堆栈上的地址。你要
printf("%p\n", (void *)ram);
获取您映射的 ram 的地址。此外,由于您将 ram
声明为 uint16_t
,ram[36]
将是内存的第 36 个 1 16 位字(字节 72 和 73 ).
1当然是从0开始数