19

在 mmap() 联机帮助页中:

它的原型是:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

和描述:

The mmap() function asks to map 'length' bytes starting at offset 'offset' 
from the file (or other object) specified by the file descriptor fd into 
memory, preferably at address 'start'.

具体来说,对于最后一个论点:

'offset' should be a multiple of the page size as returned by getpagesize(2).

根据我的实践,offset必须是页面大小的倍数,例如,我的 Linux 上的 4096,否则 mmap() 会返回Invalid argumentoffset是文件偏移量,为什么它必须是虚拟内存系统页面大小的倍数?

谢谢,

4

1 回答 1

15

简单的答案:让它快速。更复杂的答案:每当您访问映射内存中某个位置的内存时,操作系统必须确保该位置充满了文件的内容。但是操作系统只能检测您是否访问内存页面 - 而不是单个位置。它所做的是,它在文件中的偏移量和内存页面之间创建了一个简单的关系 - 并且每当您访问内存页面时,文件的该部分就会被加载。为了使这些计算快速,它限制您从某些偏移量开始。

于 2014-02-20T06:01:52.637 回答