mmap(2) System Calls Manual mmap(2) mmap munmap - (libc -lc) #include void *mmap(size_t length; void addr[length], size_t length, int prot, int flags, int fd, off_t offset); int munmap(size_t length; void addr[length], size_t length); VERSIONS . mmap() . addr. length ( 0). addr NULL ( ) . addr NULL ( /proc/sys/vm/mmap_min_addr) . . . ( MAP_ANONYMOUS ) length offset ( ) fd. offset sysconf(_SC_PAGE_SIZE). mmap() fd . prot ( ). PROT_NONE OR : PROT_EXEC . PROT_READ . PROT_WRITE . PROT_NONE . (flags) flags . flags: MAP_SHARED . ( ) . ( msync(2)). MAP_SHARED_VALIDATE ( 4.15) MAP_SHARED MAP_SHARED flags. MAP_SHARED_VALIDATE EOPNOTSUPP . ( MAP_SYNC). MAP_PRIVATE (copy-on-write). . mmap() . MAP_SHARED MAP_PRIVATE POSIX.1-2001 POSIX.1-2008. MAP_SHARED_VALIDATE . OR flags: MAP_32BIT ( 2.4.20 2.6) 2 . x86-64 64 . 2 64 . x86-64 . MAP_32BIT MAP_FIXED. MAP_ANON MAP_ANONYMOUS . MAP_ANONYMOUS . fd fd -1 MAP_ANONYMOUS ( MAP_ANON) . offset . MAP_ANONYMOUS MAP_SHARED 2.4. MAP_DENYWRITE . ( - 2.0 - ETXTBSY. ). MAP_EXECUTABLE . MAP_FILE . . MAP_FIXED addr : . addr : . addr length ( ) () . mmap(). MAP_FIXED . (NOTES)! MAP_FIXED_NOREPLACE ( 4.17) MAP_FIXED addr MAP_FIXED_NOREPLACE . EEXIST. ( ): . MAP_FIXED_NOREPLACE ( ) " MAP_FIXED": . . MAP_GROWSDOWN . . "" . "" SIGSEGV. MAP_HUGETLB ( 2.6.32) "". Documentation/admin-guide/mm/hugetlbpage.rst (NOTES) . MAP_HUGE_2MB MAP_HUGE_1GB ( 3.8) MAP_HUGETLB hugetlb ( 2 1 ) hugetlb. 2 MAP_HUGE_SHIFT. ( Hugepagesize /proc/meminfo). : #define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT) #define MAP_HUGE_1GB (30 << MAP_HUGE_SHIFT) /sys/kernel/mm/hugepages. MAP_LOCKED ( 2.5.37) mlock(2). mmap() ENOMEM . (major faults) . mlock(2). mmap() mlock(2) . MAP_LOCKED . MAP_NONBLOCK ( 2.5.46) MAP_POPULATE. : RAM. 2.6.23 MAP_POPULATE . MAP_POPULATE MAP_NONBLOCK . MAP_NORESERVE (swap) . . SIGSEGV . /proc/sys/vm/overcommit_memory proc_sys_vm(5). 2.6 . MAP_POPULATE ( 2.5.46) ( ) . . . mmap() ( MAP_HUGETLB). MAP_POPULATE 2.6.23. MAP_STACK ( 2.6.27) . . . glibc () . : MAP_STACK ( ) ( BSD). MAP_SYNC ( 4.15) MAP_SHARED_VALIDATE MAP_SHARED . DAX ( ). EOPNOTSUPP. . CPU . MAP_UNINITIALIZED ( 2.6.33) . . CONFIG_MMAP_ALLOW_UNINITIALIZED. ( ). MAP_FIXED POSIX.1-2001 POSIX.1-2008. MAP_ANONYMOUS ( MAP_ANON). munmap() munmap() . . . addr ( length ). SIGSEGV. . mmap() . MAP_FAILED ( (void *) -1) errno . munmap() 0. -1 errno ( EINVAL). EACCES . fd . MAP_SHARED PROT_WRITE fd / (O_RDWR). PROT_WRITE . EAGAIN ( setrlimit(2)). EBADF fd ( MAP_ANONYMOUS). EEXIST MAP_FIXED_NOREPLACE flags addr length . EINVAL addr length offset ( ). EINVAL ( 2.6.12) length 0. EINVAL flags MAP_PRIVATE MAP_SHARED MAP_SHARED_VALIDATE. ENFILE . ENODEV . ENOMEM . ENOMEM . munmap() . ENOMEM ( 4.7) RLIMIT_DATA getrlimit(2). ENOMEM addr . EOVERFLOW 32 ( off_t 64 ): length offset unsigned long (32 ). EPERM prot PROT_EXEC no-exec. EPERM fcntl(2). EPERM MAP_HUGETLB caller ( CAP_IPC_LOCK) hugetlb_shm_group /proc/sys/vm/hugetlb_shm_group proc_sys_vm(5). ETXTBSY MAP_DENYWRITE fd . : SIGSEGV . SIGBUS . NOTES. attributes(7). +------------+------------------------------------+--------------------+ || | | +------------+------------------------------------+--------------------+ |mmap(), | | MT-Safe | |munmap() | | | +------------+------------------------------------+--------------------+ ( i386) PROT_WRITE PROT_READ. PROT_READ PROT_EXEC . PROT_EXEC . addr 0 (NULL) MAP_FIXED flags. 0. MAP_FIXED addr 0 (NULL) 0 (NULL). flags ( ): _DEFAULT_SOURCE glibc 2.19 _BSD_SOURCE _SVID_SOURCE glibc 2.19 . ( _GNU_SOURCE ). : MAP_32BIT MAP_ANONYMOUS ( MAP_ANON) MAP_DENYWRITE MAP_EXECUTABLE MAP_FILE MAP_GROWSDOWN MAP_HUGETLB MAP_LOCKED MAP_NONBLOCK MAP_NORESERVE MAP_POPULATE MAP_STACK. C mmap() glibc. . 2.4 mmap2(2) mmap() glibc mmap2(2) offset. POSIX.1-2024. SVr4, 4.4BSD, SUSv1, POSIX.1-1996. POSIX mmap() msync(2) munmap() _POSIX_MAPPED_FILES 0. ( sysconf(3)). mmap() fork(2) . . . . Cache / mincore(2). MAP_FIXED MAP_FIXED addr length MAP_FIXED . A /proc/pid/maps MAP_FIXED B . A mmap(MAP_FIXED) B. B dlopen(3) . dlopen(3) . . brk(2) malloc(3) pthread_create(3) PAM . 4.17 MAP_FIXED_NOREPLACE . st_atime mmap() . st_ctime st_mtime PROT_WRITE MAP_SHARED msync(2) MS_SYNC MS_ASYNC . (Huge TLB) mmap() munmap() . mmap() offset . length . munmap() addr length . malloc(3) mmap() PTRDIFF_MAX. PTRDIFF_MAX C ( PTRDIFF_MAX). GCC PTRDIFF_MAX. PTRDIFF_MAX 32 0x7fffffff ( 2 ). MAP_NORESERVE. . 2.6.7 MAP_POPULATE prot PROT_NONE. SUSv3 mmap() length 0. 2.6.12 mmap() : addr. 2.6.12 mmap() EINVAL . POSIX . Cache . msync(2) tmpfs(5) ( POSIX shm_overview(7)). . . write(2) . #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; char *addr; off_t offset, pa_offset; size_t length; ssize_t s; struct stat sb; if (argc < 3 || argc > 4) { fprintf(stderr, "%s file offset [length]\n", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDONLY); if (fd == -1) err(EXIT_FAILURE, "open"); if (fstat(fd, &sb) == -1) /* To obtain file size */ err(EXIT_FAILURE, "fstat"); offset = atoi(argv[2]); pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1); /* offset for mmap() must be page aligned */ if (offset >= sb.st_size) { fprintf(stderr, "offset is past end of file\n"); exit(EXIT_FAILURE); } if (argc == 4) { length = atoi(argv[3]); if (offset + length > sb.st_size) length = sb.st_size - offset; /* Can't display bytes past end of file */ } else { /* No length arg ==> display to end of file */ length = sb.st_size - offset; } addr = mmap(NULL, length + offset - pa_offset, PROT_READ, MAP_PRIVATE, fd, pa_offset); if (addr == MAP_FAILED) err(EXIT_FAILURE, "mmap"); s = write(STDOUT_FILENO, addr + offset - pa_offset, length); if (s != length) { if (s == -1) err(EXIT_FAILURE, "write"); fprintf(stderr, "partial write"); exit(EXIT_FAILURE); } munmap(addr, length + offset - pa_offset); close(fd); exit(EXIT_SUCCESS); } ftruncate(2), getpagesize(2), memfd_create(2), mincore(2), mlock(2), mmap2(2), mprotect(2), mremap(2), msync(2), remap_file_pages(2), setrlimit(2), shmat(2), userfaultfd(2), shm_open(3), shm_overview(7) proc(5): /proc/pid/maps /proc/pid/map_files /proc/pid/smaps. . . POSIX.4 . 128-129 389-391. 3 . . : . 6.18 19 2026 mmap(2)