Skip to content
/linux-syscalls

Mémoire · Section 2

munmap(2)

Démappe une région mémoire précédemment créée par mmap.

Signature

#include <sys/mman.h>

int munmap(void * addr, size_t length);
addr
Adresse de départ alignée page de la plage à démapper.
length
Taille de la plage en octets. Arrondie au multiple supérieur de la taille de page.

Description

munmap() retire les projections pour la plage [addr, addr+length). Toute référence ultérieure dans cette plage génère SIGSEGV. Le noyau arrondit length au multiple supérieur de la taille de page ; addr doit déjà être aligné page. Démapper une partie d'une projection plus large est légal et fréquent : le noyau découpe le VMA en conséquence. Démapper une plage sans projection est aussi légal (l'appel réussit sans rien faire). À la sortie du processus toutes les projections sont retirées automatiquement ; munmap() explicite sert aux processus longs souhaitant libérer la mémoire vite, aux JIT qui jettent leur code généré, ou aux bacs à sable imposant W^X en démappant les copies inscriptibles après recopie vers des pages exécutables.

Numéros par architecture

ArchitectureNuméroABIPoint d'entrée
x86 (i386)91i386sys_munmap
x64 (x86_64)11commonsys_munmap
ARM64 (aarch64)215—sys_munmap

Historique noyau

Introduit dans Linux 1.0.

  1. 1.0

    munmap() est présent dans Linux depuis 1.0 avec la sémantique POSIX classique.

seccomp & conteneurs

Docker default profile

Autorisé

Podman default profile

Autorisé

munmap() est autorisé par défaut et en pratique impossible à bloquer : tout programme qui appelle mmap() appelle aussi munmap(). Pas de filtre d'arguments utile — la disposition de l'espace d'adressage étant imprévisible avec ASLR, on ne peut pas restreindre par plage d'addr.

libseccomp

seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(munmap), 0);

Exemple strace

$ strace -e mmap,munmap cat /etc/hostname > /dev/null
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3a8c4f3000
munmap(0x7f3a8c4f3000, 4096) = 0

munmap() dans strace est peu informatif isolément ; c'est la queue de chaque paire mmap()/free-grand-bloc. Utile pour traquer les fuites mémoire : un processus qui mmap() sans munmap() montre une croissance régulière du RSS — strace -c révèle le déséquilibre immédiatement.

Sécurité & observabilité

munmap() apparaît rarement directement dans les attaques, mais les motifs JIT-spray et loaders de shellcode incluent mmap(PROT_RWX) → write → mprotect(PROT_RX) → exécution, avec munmap() de nettoyage final. La détection cible l'étape mmap+mprotect, pas le munmap. Le tracepoint eBPF sys_enter_munmap existe mais est rarement utilisé en supervision — trop bruyant et trop tardif.

Erreurs

EINVAL
addr non aligné page, length nul, ou la plage déborde de l'espace d'adressage.

Syscalls liés