如何找到mmap()映射的数据?

时间:2018-01-30 05:48:25

标签: mmap

如果使用mmap()来读取文件,我怎样才能找到mmap()映射的数据的数量。

float *map = (float *)mmap(NULL, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);

1 个答案:

答案 0 :(得分:3)

mmap system call无法读取数据。它只是映射virtual address space中的数据(通过间接配置您的MMU),并且成功的mmap更改了虚拟地址空间。之后,您的程序将读取该数据(或不读取)。在您的示例中,如果map[356]成功,您的程序可能会稍后阅读mmap(并且您应该对其失败进行测试)。

仔细阅读mmap(2)的文档。第二个参数(在您的代码中,FILESIZE)定义映射的大小(以字节为单位)。您可以检查它是sizeof(float)的倍数,并将其除以sizeof(float),以获取map中有意义且从文件中获取的元素数。映射的大小向上舍入为多个页面。 mmap(2)man页说:

  

文件以页面大小的倍数映射。对于一个文件          不是页面大小的倍数,剩余内存在归零时归零          映射,并写入该区域不会写入文件。

数据映射到pages。页面通常为4096字节。详细了解paging

页面大小由getpagesize(2)sysconf(3)返回_SC_PAGESIZE(通常为4096)。

考虑阅读一些像Operating Systems: Three Easy Pieces这样的书(可免费下载),以了解virtual memory的工作原理以及memory mapped file的内容。

在Linux上,/proc/文件系统(请参阅proc(5))对于了解某个进程的虚拟地址空间非常有用:在终端中尝试cat /proc/$$/maps,并阅读更多内容以了解其输出。对于pid 1234的过程,请尝试cat /proc/1234/maps

process内部,您甚至可以按顺序读取/proc/self/maps伪文件以了解其虚拟地址空间,例如here