The mmap documentation says following about the flag MAP_NORESERVE.
Do not reserve swap space for this mapping. When swap space is reserved, one ha
Mmap() is one of the ways to manage the association between {address, Physical memory, disk-blocks} All three members of this association are resources. The association is kept inside Page Table Entries (PTE's)
What mmap() actually does, is:
Many (3 out of 5) of the above steps are optional and depend on the actual arguments and flags supplied in the mmap() call. (the fd may be -1: creating an anonymous mapping, the start-adress may be NULL: mmap should allocate a (previously) unused range of memory)
After a call to mmap(), the pagefault-handler inside the kernel should be able to find out what to do. (attach physical ram to a page; flush and detach; allocate and COW, ...)
not reserving swapspace means that the caller trusts that there will be enough swap space at any time in the future. Swap space is shared by all the processes, so there can never be a guarantee that there is enough of it. Preallocating it (more or less) gives a guaranty that the calling process will always have enough of it. (when not: the mmap() should have failed)
On linux mmap sets up virtual memory mappings only, whether you use MAP_NORESERVE or not, no physical memory is assigned until you touch the memory.
MAP_FIXED is unrelated to this, it sets up the virtual memory mappings at the virtual(not physical) address you specify, or fails if there's no room for the mapping at that address.
Just use a normal mmap()
. Any modern enough OS (ie, past, what, 1995?) which implements mmap also implements demand paging, and pages will only be reserved if you actually write to them.