cposixfreebsdmmapaddress-space

How to find holes in the address space?


I have a set of files whose lengths are all multiples of the page-size of my operating system (FreeBSD 10). I would like to mmap() these files to consecutive pages of RAM, giving me the ability to treat a collection of files as one large array of data.

Preferably using portable functions, how can I find a sufficiently large region of unmapped address space so I can be sure that a series of mmap() calls to this region is going to be successful?


Solution

  • Follow these steps:

    1. First compute the total size needed by enumerating your files and summing their sizes.
    2. Map a single area of anonymous memory of this size with mmap. If this fails, you lose.
    3. Save the pointer and unmap the area (actually, unmap may not be necessary if your system's mmap with a fixed address implicitly unmaps any previous overlapping region).
    4. Map the first file at this address with the appropriate MAP_FIXED flag.
    5. Increment the address by the file size.
    6. loop to step 4 until all files have been mmapped.

    This should be fully portable to any POSIX system, but some OSes might have quirks that prevent this method. Try it.