I've been looking at the different flags for the mmap function, namely MAP_FIXED, MAP_SHARED, MAP_PRIVATE. Can someone explain to me the purpose of MAP_FIXED? There's no guarantee that the address space will be used in the first place.
MAP_FIXED
is dup2
for memory mappings, and it's useful in exactly the same situations where dup2
is useful for file descriptors: when you want to perform a replace operation that atomically reassigns a resource identifier (memory range in the case of MAP_FIXED
, or fd in the case of dup2
) to refer to a new resource without the possibility of races where it might get reassigned to something else if you first released the old resource then attempted to regain it for the new resource.
As an example, take loading a shared library (by the dynamic loader). It consists of at least three types of mappings: read+exec-only mapping of the program code and read-only data from the executable file, read-write mapping of the initialized data (also from the executable file, but typically with a different relative offset), and read-write zero-initialized anonymous memory (for .bss
). Creating these as separate mappings would not work because they must be at fixed relative addresses relative to one another. So instead you first make a dummy mapping of the total length needed (the type of this mapping doesn't matter) without MAP_FIXED
just to reserve a sufficient range of contiguous addresses at a kernel-assigned location, then you use MAP_FIXED
to map over top of parts of this range as needed with the three or more mappings you need to create.
Further, note that use of MAP_FIXED
with a hard-coded address or a random address is always a bug. The only correct way to use MAP_FIXED
is to replace an existing mapping whose address was assigned by a previous successful call to mmap
without MAP_FIXED
, or in some other way where you feel it's safe to replace whole pages. This aspect too is completely analogous to dup2
; it's always a bug to use dup2
when the caller doesn't already have an open file on the target fd with the intent to replace it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With