Memory-Mapped Files
mmap() is one of the most powerful and widely-used system calls in Linux. It maps a file (or anonymous memory) directly into your process's address space, so you can read and write files using simple pointer operations instead of read()/write() system calls.
What mmap Does
How is mmap different from reading a file normally?
With read(), data is copied: disk → kernel page cache → your buffer. With mmap(), the file's pages in the page cache are mapped directly into your virtual address space. No extra copy. You access file data like regular memory — dereference a pointer, get file content.
Normal read:
pread(fd, buf, size, offset) → copies data to buf
mmap:
ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset)
data = ptr[42] → page fault on first access
→ kernel reads page from disk into page cache
→ maps that page into your address space
→ subsequent accesses: direct memory access, no syscall
Key Use Cases
- Shared libraries: .so files loaded via mmap — one physical copy, shared by all processes
- Executable loading: The kernel mmaps your program's binary into memory
- Large file processing: Databases, search engines — process huge files without reading them all into RAM
- IPC: Two processes mmap the same file with MAP_SHARED to communicate
- Anonymous mmap: malloc() uses anonymous mmap (no backing file) for large allocations
Inspecting mmaps
# Every mmap in your shell:
cat /proc/self/maps
# 7f1234000000-7f1238000000 r-xp 00000000 08:01 789 /lib/x86_64-linux-gnu/libc.so.6
# 7fff12300000-7fff12321000 rw-p 00000000 00:00 0 [stack]
# 7fff123ff000-7fff12400000 r-xp 00000000 00:00 0 [vdso]
# Columns: address range, permissions, offset, device, inode, name
# r=read, w=write, x=execute, p=private, s=shared