Why file starting offset in mmap() must be multiple of the page size

password636 picture password636 · Nov 20, 2013 · Viewed 11.1k times · Source

In mmap() manpage:

Its prototype is:

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

and description:

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'.

Sepcifically, for the last argument:

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

From what I practised, offset MUST be a multiple of the page size, for example, 4096 on my Linux, otherwise, mmap() would return Invalid argument, offset is for file offset, why it must be multiple of virtual memory system's page size?

Thanks,

Answer

Tobias Langner picture Tobias Langner · Feb 20, 2014

The simple answer: to make it fast. The more complex answer: whenever you access the memory at a location within the mapped memory, the OS must make sure that this location is filled with the contents of the file. But the OS can only detect whether you access a memory page - not a single location. What it does is, it creates a simple relation between offsets in the file and memory pages - and whenever you access a memory page, that part of the file is loaded. To make these calculations fast, it restricts you to start at certain offsets.