.\" -*- coding: UTF-8 -*- .\" Copyright (C) 1996 Andries Brouwer .\" and Copyright (C) 2006, 2007 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified 1997-01-31 by Eric S. Raymond .\" Modified 2000-03-25 by Jim Van Zandt .\" Modified 2001-10-04 by John Levon .\" Modified 2003-02-02 by Andi Kleen .\" Modified 2003-05-21 by Michael Kerrisk .\" MAP_LOCKED works from 2.5.37 .\" Modified 2004-06-17 by Michael Kerrisk .\" Modified 2004-09-11 by aeb .\" Modified 2004-12-08, from Eric Estievenart .\" Modified 2004-12-08, mtk, formatting tidy-ups .\" Modified 2006-12-04, mtk, various parts rewritten .\" 2007-07-10, mtk, Added an example program. .\" 2008-11-18, mtk, document MAP_STACK .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MMAP 2 "21 décembre 2020" Linux "Manuel du programmeur Linux" .SH NOM mmap, munmap \- Établir/supprimer une projection en mémoire (map/unmap) des fichiers ou des périphériques .SH SYNOPSIS .nf \fB#include \fP .PP \fBvoid *mmap(void *\fP\fIaddr\fP\fB, size_t \fP\fIlength\fP\fB, int \fP\fIprot\fP\fB, int \fP\fIflags\fP\fB,\fP \fB int \fP\fIfd\fP\fB, off_t \fP\fIoffset\fP\fB);\fP \fBint munmap(void *\fP\fIaddr\fP\fB, size_t \fP\fIlength\fP\fB);\fP .fi .PP Consultez la section NOTES pour plus d'informations sur les exigences de la macro de test de fonctionnalité. .SH DESCRIPTION \fBmmap\fP() crée une nouvelle projection dans l'espace d'adressage virtuel du processus appelant. L'adresse de démarrage de la nouvelle projection est indiquée dans \fIaddr\fP. Le paramètre \fIlength\fP indique la longueur de la projection (qui doit être supérieure à \fB0\fP). .PP .\" Before Linux 2.6.24, the address was rounded up to the next page .\" boundary; since 2.6.24, it is rounded down! Si \fIaddr\fP est NULL, le noyau choisit l'adresse (alignée sur une page) à laquelle démarrer la projection\ ; c'est la méthode la plus portable pour créer une nouvelle projection. Si \fIaddr\fP n'est pas NULL, le noyau le considère comme une indication sur l'endroit où placer la projection\ ; sous Linux, elle sera placée à une frontière de page proche (mais toujours supérieure ou égale à la valeur indiquée par \fI/proc/sys/vm/mmap_min_addr\fP) et tente d'y créer la projection. Si une projection y existe déjà, le noyau prend une nouvelle adresse qui peut ou pas dépendre de l'indication. L'adresse de la nouvelle projection est renvoyée comme résultat de l'appel. .PP Le contenu d'une projection de fichier (par opposition à une projection anonyme\ ; voir ci\-dessous \fBMAP_ANONYMOUS\fP) est initialisé avec \fIlength\fP octets à partir de la position \fIoffset\fP dans le fichier (ou autre objet) correspondant au descripteur de fichier \fIfd\fP. \fIoffset\fP doit être un multiple de la taille de la page renvoyée par \fIsysconf(_SC_PAGE_SIZE)\fP. .PP Après le retour de l'appel \fBmmap\fP(), le descripteur de fichier \fIfd\fP peut être fermé immédiatement sans invalider la projection. .PP L'argument \fIprot\fP indique la protection que l'on désire pour cette zone de mémoire et ne doit pas entrer en conflit avec le mode d'ouverture du fichier. Il s'agit soit de \fBPROT_NONE\fP (le contenu de la mémoire est inaccessible) soit d'un OU binaire entre les constantes suivantes\ : .TP 1.1i \fBPROT_EXEC\fP Il est possible d'exécuter les pages. .TP \fBPROT_READ\fP Il est possible de lire les pages. .TP \fBPROT_WRITE\fP Il est possible d'écrire les pages. .TP \fBPROT_NONE\fP .\" Il n'est pas possible d'accéder aux pages. .SS "Le paramètre des attributs" Le paramètre \fIflags\fP détermine si les modifications de la projection sont visibles depuis les autres processus projetant la même région et si les modifications sont appliquées au fichier sous\-jacent. Ce comportement est déterminé en incluant exactement une des valeurs suivantes dans \fIflags\fP\ : .TP \fBMAP_SHARED\fP Partager la projection. Les modifications de la projection sont visibles dans les autres processus qui projettent la même région et (en cas de projection file\-backed) elles sont appliquées au fichier sous\-jacent (pour contrôler précisément le moment des mises à jour du fichier sous\-jacent, il faut utiliser \fBmsync\fP(2)). .TP \fBMAP_SHARED_VALIDATE\fP (depuis Linux 4.15) Cet attribut apporte le même comportement que \fBMAP_SHARED\fP sauf que les projections \fBMAP_SHARED\fP ignorent les attributs inconnus dans \fIflags\fP. Au contraire, lors de la création d'une projection en utilisant \fBMAP_SHARED_VALIDATE\fP, le noyau vérifie que tous les attributs passés sont connus et il fait échouer la projection avec l'erreur \fBEOPNOTSUPP\fP pour les attributs inconnus. Ce type de projection est aussi nécessaire pour pouvoir utiliser certains attributs de projection (comme \fBMAP_SYNC\fP). .TP \fBMAP_PRIVATE\fP Créer une projection privée, utilisant la méthode de copie à l'écriture. Les modifications de la projection ne sont pas visibles depuis les autres processus projetant le même fichier, et ne modifient pas le fichier lui\-même. Il n'est pas précisé si les changements effectués dans le fichier après l'appel \fBmmap\fP() seront visibles dans la région projetée. .PP \fBMAP_SHARED\fP et \fBMAP_PRIVATE\fP sont décrits dans POSIX.1\-2001 et POSIX.1\-2008. \fBMAP_SHARED_VALIDATE\fP est une extension Linux. .PP De plus, zéro ou plus des valeurs suivantes peuvent être incluses dans \fIflags\fP (avec un OU binaire)\ : .TP \fBMAP_32BIT\fP (depuis Linux 2.4.20, 2.6) .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08 Placer la projection dans les deux premiers gigaoctets de l'espace d'adressage du processus. Cet attribut n'est pris en charge que sous x86\-64, pour les programmes 64\ bits. Il a été ajouté pour permettre à la pile d'un fil d'exécution d'être allouée dans les deux premiers gigaoctets de mémoire, afin d'améliorer les performances des changements de contexte sur les premiers processeurs 64\ bits. Les processeurs x86\-64 modernes n'ont plus ces problèmes de performance, donc l'utilisation de cet attribut n'est pas nécessaire sur ces systèmes. L'attribut \fBMAP_32BIT\fP est ignoré quand \fBMAP_FIXED\fP est positionné. .TP \fBMAP_ANON\fP Synonyme de \fBMAP_ANONYMOUS\fP\ ; fourni pour une compatibilité avec d'autres implémentations. .TP \fBMAP_ANONYMOUS\fP .\" See the pgoff overflow check in do_mmap(). .\" See the offset check in sys_mmap in arch/x86/kernel/sys_x86_64.c. La projection n'est prise en charge par aucun fichier\ ; son contenu est initialisé à \fB0\fP. L'argument \fIfd\fP est ignoré\ ; cependant, certaines implémentations demandent que \fIfd\fP soit \fB\-1\fP si \fBMAP_ANONYMOUS\fP (ou \fBMAP_ANON\fP) est utilisé, et les applications portables doivent donc s'en assurer. L'argument \fIoffset\fP devrait être \fB0\fP. L'utilisation de \fBMAP_ANONYMOUS\fP avec \fBMAP_SHARED\fP n'est implémentée que depuis Linux 2.4. .TP \fBMAP_DENYWRITE\fP .\" Introduced in 1.1.36, removed in 1.3.24. Cet attribut est ignoré (autrefois —\ Linux\ 2.0 et antérieur\ — il signalait une tentative d'écriture dans le fichier sous\-jacent et qui échouait avec l'erreur \fBETXTBUSY\fP. Mais cela permettait des attaques par déni de service). .TP \fBMAP_EXECUTABLE\fP .\" Introduced in 1.1.38, removed in 1.3.24. Flag tested in proc_follow_link. .\" (Long ago, it signaled that the underlying file is an executable. .\" However, that information was not really used anywhere.) .\" Linus talked about DOS related to MAP_EXECUTABLE, but he was thinking of .\" MAP_DENYWRITE? Cet attribut est ignoré. .TP \fBMAP_FILE\fP .\" On some systems, this was required as the opposite of .\" MAP_ANONYMOUS -- mtk, 1 May 2007 Attribut pour compatibilité. Ignoré. .TP \fBMAP_FIXED\fP Ne pas considérer \fIaddr\fP comme une indication\ : n'utiliser que l'adresse indiquée. \fIaddr\fP doit être correctement alignée\ : pour la plupart des architectures, un multiple de la taille de page suffit, toutefois certaines architectures imposent des limitations supplémentaires. Si la zone mémoire indiquée par \fIaddr\fP et \fIlen\fP recouvre des pages d'une projection existante, la partie recouverte de la projection existante sera ignorée. Si l'adresse indiquée ne peut être utilisée, \fBmmap\fP() échouera. .IP Les logiciels qui aspirent à la portabilité devraient utiliser l'attribut \fBMAP_FIXED\fP prudemment, en gardant à l'esprit que l'aspect exact des projections de mémoire du processus est autorisé à changer significativement entre les versions du noyau, de la glibc et du système d'exploitation. \fILisez attentivement le point sur cet attribut dans les NOTES\ !\fP .TP \fBMAP_FIXED_NOREPLACE\fP (depuis Linux 4.17) .\" commit a4ff8e8620d3f4f50ac4b41e8067b7d395056843 Cet attribut offre un comportement identique à \fBMAP_FIXED\fP par rapport à l'application de \fIaddr\fP, mais il s'en distingue en ce que \fBMAP_FIXED_NOREPLACE\fP n’écrase jamais une plage projetée existante. Si la plage demandée entre en conflit avec une projection existante, cet appel échoue avec l'erreur \fBEEXIST.\fP Cet attribut peut donc être utilisé comme une façon d'essayer de projeter une plage d'adresses de manière atomique (vis\-à\-vis d'autres fils d'exécutions)\ : un thread réussira, tous les autres signaleront un échec. .IP Remarquez que les anciens noyaux qui ne reconnaissent pas l'attribut \fBMAP_FIXED_NOREPLACE\fP se rabattront généralement (en détectant une collision avec une projection existante) sur un \fBtype de comportement «\ sans MAP_FIXED\ »\ :\fP ils renverront une adresse différente de celle demandée. Les logiciels rétro\-compatibles devront donc vérifier l'adresse renvoyée vis\-à\-vis de l'adresse demandée. .TP \fBMAP_GROWSDOWN\fP Cet attribut est utilisé pour les piles. Il indique au noyau le système de mémoire virtuelle vers lequel la projection devrait descendre dans la mémoire. L'adresse renvoyée est une page inférieure à la zone de mémoire créée dans l'espace d'adressage virtuel du processus. La modification d'une adresse dans la page de «\ garde\ » sous la projection fera agrandir la projection d’une page. Cette croissance peut se répéter jusqu'à ce que la taille de la projection dans la page atteigne l’extrémité haute de la projection plus basse suivante, point où la modification de la page de «\ garde\ » donnera un signal \fBSIGSEGV\fP. .TP \fBMAP_HUGETLB\fP (depuis Linux 2.6.32) Allouer la projection à l'aide de «\ pages immenses\ ». Consultez le fichier \fIDocumentation/vm/hugetlbpage.txt\fP des sources du noyau Linux pour plus d'informations ainsi que les NOTES ci\-dessous. .TP \fBMAP_HUGE_2MB\fP, \fBMAP_HUGE_1GB\fP (depuis Linux 3.8) .\" See https://lwn.net/Articles/533499/ Utilisé avec \fBMAP_HUGETLB\fP pour sélectionner d'autres tailles de pages immenses (hugetlb) (respectivement 2\ Mo et 1\ Go) sur les systèmes qui gèrent plusieurs tailles de page hugetlb. .IP Plus généralement, la taille de la page immense souhaitée peut être configurée en encodant le logarithme de base 2 de la taille de la page désirée dans les six bits situés sur \fBMAP_HUGE_SHIFT\fP (une valeur de zéro dans ce champ de bit fournit la taille de page immense par défaut\ ; vous pouvez connaître celle\-ci à l'aide du champ \fIHugepagesize\fP qui apparaît dans \fI/proc/meminfo\fP). Ainsi, les deux constantes ci\-dessus sont définies comme suit\ : .IP .in +4n .EX #define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT) #define MAP_HUGE_1GB (30 << MAP_HUGE_SHIFT) .EE .in .IP Vous pouvez connaître l'intervalle de tailles des pages immenses gérées par le système en listant les sous\-répertoires de \fI/sys/kernel/mm/hugepages\fP. .TP \fBMAP_LOCKED\fP (depuis Linux 2.5.37) .\" If set, the mapped pages will not be swapped out. Marquer la région projetée pour qu'elle soit verrouillée de la même manière que \fBmlock\fP(2). Cette implémentation essaiera de remplir (prefault) toute la plage mais l'appel \fBmmap\fP() n’échouera pas avec \fBENOMEM\fP si cela échoue. Des erreurs énormes pourraient donc se produire ultérieurement. La sémantique n'est donc pas aussi robuste que \fBmlock\fP(2). Vous devriez utiliser \fBmmap\fP() et \fBmlock\fP(2) si d'énormes erreurs ne sont pas acceptables après l'initialisation de la projection. L'attribut \fBMAP_LOCKED\fP est ignoré sur les anciens noyaux. .TP \fBMAP_NONBLOCK\fP (depuis Linux 2.5.46) .\" commit 54cb8821de07f2ffcd28c380ce9b93d5784b40d7 Cet attribut n'a de sens qu'en conjonction avec \fBMAP_POPULATE\fP. Ne pas effectuer de lecture anticipée\ : créer seulement les entrées de tables de page pour les pages déjà présentes en RAM. Depuis Linux\ 2.6.23, cet attribut fait que \fBMAP_POPULATE\fP n'a aucun effet. Un jour la combinaison de \fBMAP_POPULATE\fP et \fBMAP_NONBLOCK\fP pourra être implémentée de nouveau. .TP \fBMAP_NORESERVE\fP Ne pas réserver d'espace de swap pour les pages de cette projection. Une telle réservation garantit que l'on puisse modifier les zones soumises à une copie\-en\-écriture. Sans réservation, on peut recevoir un signal \fBSIGSEGV\fP durant une écriture, s'il n'y a plus de place disponible. Consultez également la description du fichier \fI/proc/sys/vm/overcommit_memory\fP dans la page \fBproc\fP(5). Dans les noyaux antérieurs au\ 2.6, cet attribut n'avait d'effet que pour les projections privées modifiables. .TP \fBMAP_POPULATE\fP (depuis Linux 2.5.46) Remplir (prefault) les tables de pages pour une projection. Pour une projection de fichier, cela provoque une lecture anticipée du fichier. Les accès ultérieurs à la projection ne seront pas bloqués par des erreurs de pages. \fBMAP_POPULATE\fP n'est géré pour les projections privées que depuis Linux\ 2.6.23. .TP \fBMAP_STACK\fP (depuis Linux 2.6.27) Allouer la projection à une adresse qui convient à la pile d'un processus ou d'un thread. .IP .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08 .\" commit cd98a04a59e2f94fa64d5bf1e26498d27427d5e7 .\" http://thread.gmane.org/gmane.linux.kernel/720412 .\" "pthread_create() slow for many threads; also time to revisit 64b .\" context switch optimization?" Cet attribut n'est pas opérationnel pour l'instant sur Linux. Mais son utilisation permet aux applications de s'assurer qu'elles le gèreront de manière transparente s'il est implémenté dans le futur. Ainsi, il est utilisé dans l'implémentation de threading de la glibc pour accepter le fait que certaines architectures pourront (plus tard) nécessiter un traitement spécial pour allouer des piles. Une autre raison d'utiliser cet attribut est la portabilité\ : \fBMAP_STACK\fP existe et a un effet sur d'autres systèmes (comme certains BSD). .TP \fBMAP_SYNC\fP (depuis Linux 4.15) Cet attribut n'est possible qu'avec le type de projection \fBMAP_SHARED_VALIDATE\fP\ ; les projections de type \fBMAP_SHARED\fP ignoreront silencieusement cet attribut. Il n'est pris en charge que pour des fichiers gérant le DAX (projection directe de mémoire persistante). Pour les autres fichiers, créer une projection avec cet attribut provoquera une erreur \fBEOPNOTSUPP\fP. .IP Les projections de fichier partagé ayant cet attribut fournissent une garantie que tant que la mémoire est projetée avec accès en écriture dans l'espace d'adressage du processus, elle sera visible dans le même fichier et au même endroit même après un plantage ou un redémarrage du système. Couplé à l'utilisation des instructions adéquates du processeur, cela offre aux utilisateurs de telles projections une manière plus efficace de rendre des modifications de données persistantes. .TP \fBMAP_UNINITIALIZED\fP (depuis Linux 2.6.33) Ne pas effacer pas les pages anonymes. Cet attribut n'a pour l'instant un effet que si le noyau a été configuré avec l'option \fBCONFIG_MMAP_ALLOW_UNINITIALIZED\fP. À cause des implications sur la sécurité, cette option n'est normalement active que sur des périphériques embarqués (c'est\-à\-dire avec des périphériques avec lesquels il est possible d'avoir un contrôle total de la mémoire utilisateur). .PP .\" FIXME . for later review when Issue 8 is one day released... .\" POSIX may add MAP_ANON in the future .\" http://austingroupbugs.net/tag_view_page.php?tag_id=8 .\" http://austingroupbugs.net/view.php?id=850 Parmi les attributs ci\-dessus, seul \fBMAP_FIXED\fP est spécifié dans POSIX.1\-2001 et POSIX.1\-2008. Cependant, la plupart des systèmes gèrent aussi \fBMAP_ANONYMOUS\fP (ou son synonyme \fBMAP_ANON\fP). .SS munmap() L'appel système \fBmunmap\fP() détruit la projection dans la zone de mémoire spécifiée et s'arrange pour que toute référence ultérieure à cette zone mémoire déclenche une erreur d'adressage. La projection est aussi automatiquement détruite lorsque le processus se termine. À l'inverse, la fermeture du descripteur de fichier ne supprime pas la projection. .PP L'adresse \fIaddr\fP doit être un multiple de la taille de la page (mais ce n'est pas obligatoire pour \fIlength\fP). Toutes les pages contenant une partie de l'intervalle indiqué sont libérées, et tout accès ultérieur déclenchera \fBSIGSEGV\fP. Aucune erreur n'est détectée si l'intervalle indiqué ne contient pas de page projetée. .SH "VALEUR RENVOYÉE" En cas de succès, \fBmmap\fP() renvoie un pointeur sur la zone projetée. En cas d'échec, la valeur \fBMAP_FAILED\fP (c'est\-à\-dire \fI(void\ *)\ \-1\fP) est renvoyée et \fIerrno\fP est positionné pour indiquer la cause de l'erreur. .PP S'il réussit, \fBmunmap\fP() renvoie \fB0\fP. En cas d'échec, \fB\-1\fP est renvoyé et \fIerrno\fP est positionné pour indiquer la cause de l'erreur (probablement \fBEINVAL\fP). .SH ERREURS .TP \fBEACCES\fP Le descripteur ne correspond pas à un fichier normal ou une demande de projection de fichier a été demandée mais \fIfd\fP n'est pas ouvert en lecture, ou une demande de projection partagée \fBMAP_SHARED\fP avec protection \fBPROT_WRITE\fP a été demandée mais \fIfd\fP n'est pas ouvert en lecture et écriture (\fBO_RDWR\fP), ou encore \fBPROT_WRITE\fP est demandé mais le fichier est ouvert en ajout seulement. .TP \fBEAGAIN\fP Le fichier est verrouillé ou trop de pages ont été verrouillées en mémoire (consultez \fBsetrlimit\fP(2)). .TP \fBEBADF\fP \fIfd\fP n'est pas un descripteur de fichier valable (et \fBMAP_ANONYMOUS\fP n'était pas précisé). .TP \fBEEXIST\fP \fBMAP_FIXED_NOREPLACE\fP était indiqué dans \fIflags\fP et la plage couverte par \fIaddr\fP et \fIlength\fP est en conflit avec une projection existante. .TP \fBEINVAL\fP \fIaddr\fP ou \fIlength\fP ou \fIoffset\fP sont non valables (par exemple\ : zone trop grande, ou non alignée sur une frontière de page). .TP \fBEINVAL\fP (depuis Linux 2.6.12) \fIlength\fP est nul. .TP \fBEINVAL\fP \fIflags\fP ne contenait ni \fBMAP_PRIVATE\fP, ni \fBMAP_SHARED\fP, ni \fBMAP_SHARED_VALIDATE\fP. .TP \fBENFILE\fP .\" This is for shared anonymous segments .\" [2.6.7] shmem_zero_setup()-->shmem_file_setup()-->get_empty_filp() .\" .TP .\" .B ENOEXEC .\" A file could not be mapped for reading. La limite du nombre total de fichiers ouverts pour le système entier a été atteinte. .TP \fBENODEV\fP Le système de fichiers sous\(hyjacent ne gère pas la projection en mémoire. .TP \fBENOMEM\fP Aucune mémoire disponible. .TP \fBENOMEM\fP Le nombre maximal de projections du processus serait dépassé. Cette erreur peut aussi se produire pour \fBmunmap\fP() lors de la suppression d'une projection d'une région au milieu d'une projection existante, puisque cela provoque deux régions plus petites de chaque côté de la région à supprimer. .TP \fBENOMEM\fP (Depuis Linux 4.7) La limite \fBRLIMIT_DATA\fP du processus, décrite dans \fBgetrlimit\fP(2), serait dépassée. .TP \fBEOVERFLOW\fP Sur architecture 32\ bits avec l'extension de fichiers très grands (c'est\-à\-dire utilisant un \fIoff_t\fP sur 64\ bits)\ : le nombre de pages utilisées pour \fIlength\fP plus le nombre de pages utilisées pour \fIoffset\fP dépasserait \fIunsigned long\fP (32\ bits). .TP \fBEPERM\fP .\" (Since 2.4.25 / 2.6.0.) L'argument \fIprot\fP a demandé \fBPROT_EXEC\fP mais la zone appartient à un fichier sur un système de fichiers monté sans permission d'exécution. .TP \fBEPERM\fP La lecture a été interrompue par un signal\ ; consultez \fBfnctl\fP(2). .TP \fBETXTBSY\fP \fBMAP_DENYWRITE\fP a été réclamé mais \fIfd\fP est ouvert en écriture. .PP L'accès à une zone de projection peut déclencher les signaux suivants\ : .TP \fBSIGSEGV\fP Tentative d'écriture dans une zone en lecture seule. .TP \fBSIGBUS\fP Tentative d'accès à une page du tampon au\-delà de la fin du fichier projeté. Pour une explication du traitement des octets dans la page correspondant à la fin du fichier projeté n'étant pas un multiple de la taille de la page, voir les NOTES. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbw18 lb lb l l l. Interface Attribut Valeur T{ \fBmmap\fP(), \fBmunmap\fP() T} Sécurité des threads MT\-Safe .TE .SH CONFORMITÉ .\" SVr4 documents additional error codes ENXIO and ENODEV. .\" SUSv2 documents additional error codes EMFILE and EOVERFLOW. POSIX.1\-2001, POSIX.1\-2008, SVr4, 4.4BSD. .PP .\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L. .\" -1: unavailable, 0: ask using sysconf(). .\" glibc defines it to 1. Sur les systèmes POSIX sur lesquels \fBmmap\fP(), \fBmsync\fP(2) et \fBmunmap\fP() sont disponibles, \fB_POSIX_MAPPED_FILES\fP est définie dans \fI\fP comme étant une valeur supérieure à \fB0\fP (consultez aussi \fBsysconf\fP(3)). .SH NOTES La mémoire obtenue par \fBmmap\fP est préservée au travers d'un \fBfork\fP(2), avec les mêmes attributs. .PP Un fichier est projeté en multiples de de la taille de la page. Pour un fichier dont la longueur n'est pas un multiple de la taille de page, la mémoire restante est remplie de zéros lors de la projection, et les écritures dans cette zone n'affectent pas le fichier. Les effets de la modification de la taille du fichier sous\(hyjacent sur les pages correspondant aux zones ajoutées ou supprimées ne sont pas précisés. .PP Sur certaines architectures matérielles (par exemple, i386), \fBPROT_WRITE\fP implique \fBPROT_READ\fP. Cela dépend de l'architecture si \fBPROT_READ\fP implique \fBPROT_EXEC\fP ou non. Les programmes portables doivent toujours indiquer \fBPROT_EXEC\fP s'ils veulent exécuter du code dans la projection. .PP La manière portable de créer une projection est de spécifier \fIaddr\fP à 0 (NULL), et d'omettre \fBMAP_FIXED\fP dans \fIflags\fP. Dans ce cas, le système choisit l'adresse de la projection\ ; l'adresse est choisie de manière à ne pas entrer en conflit avec une projection existante et de ne pas être nulle. Si l'attribut \fBMAP_FIXED\fP est indiqué et si \fIaddr\fP vaut 0 (NULL), l'adresse projetée sera zéro (NULL). .PP Certaines constantes de \fIflags\fP sont définies seulement si des macros de test de fonctionnalités adaptées sont définies (potentiellement par défaut)\ : \fB_DEFAULT_SOURCE\fP avec la glibc 2.19 ou supérieure, ou bien \fB_BSD_SOURCE\fP ou \fB_SVID_SOURCE\fP dans la glibc 2.19 et antérieure (la définition de \fB_GNU_SOURCE\fP suffit également, et son usage aurait été plus logique, puisque ces attributs sont tous spécifiques à Linux). Les attributs adéquats sont\ : \fBMAP_32BIT\fP, \fBMAP_ANONYMOUS\fP (et son synonyme \fBMAP_ANON\fP), \fBMAP_DENYWRITE\fP, \fBMAP_EXECUTABLE\fP, \fBMAP_FILE\fP, \fBMAP_GROWSDOWN\fP, \fBMAP_HUGETLB\fP, \fBMAP_LOCKED\fP, \fBMAP_NONBLOCK\fP, \fBMAP_NORESERVE\fP, \fBMAP_POPULATE\fP, et \fBMAP_STACK\fP. .PP .\" Une application peut déterminer les pages d'une projection se trouvant dans le tampon/le cache de page en utilisant \fBmincore\fP(2). .SS "Utilisation sûre de MAP_FIXED" La seule utilisation sûre de \fBMAP_FIXED\fP est quand la plage d'adresses indiquée par \fIaddr\fP et \fIlength\fP a été préalablement réservée en utilisant une autre projection\ ; sans quoi l'utilisation de \fBMAP_FIXED\fP est hasardeuse car elle supprime brutalement des projections préexistantes, ce qui facilite la corruption par un processus multithread de son propre espace d'adressage. .PP Par exemple, supposons qu'un thread A cherche dans \fI/proc//maps\fP une plage d'adresses inutilisée où il peut se projeter en utilisant \fBMAP_FIXED\fP, tandis qu'un thread B acquiert en même temps tout ou partie de cette même plage d'adresses. Quand le thread A utilisera ensuite \fBmmap(MAP_FIXED)\fP, il va de fait écraser la projection créée par le thread B. Dans ce scénario, le thread B ne doit pas créer de projection directement\ ; un appel de bibliothèque qui, en interne, utilise \fBdlopen\fP(3) pour charger d'autres bibliothèques partagées, est suffisant. L'appel \fBdlopen\fP(3) projettera la bibliothèque dans l'espace d'adressage du processus. De plus, presque tous les appels de bibliothèques peuvent être implémentés d'une manière qui ajoute des projections de mémoire aux espaces d'adressage, à l'aide de cette technique ou en allouant simplement de la mémoire. Parmi les exemples, figurent \fBbrk\fP(2), \fBmalloc\fP(3), \fBpthread_create\fP(3) et les bibliothèques PAM .UR http://www.linux\-pam.org .UE . .PP .\" Depuis Linux 4.17, un programme multithreadé peut utiliser l'attribut \fBMAP_FIXED_NOREPLACE\fP pour éviter le risque décrit ci\-dessus quand on essaie de créer une projection à une adresse fixe non réservée par une projection préexistante. .SS "Modifications d'horodatage pour les projections prises en charge par un fichier" Pour les projections prises en charge par un fichier, le champ \fIst_atime\fP du fichier peut être mis à jour à tout moment entre l'appel \fBmmap\fP() et le \fBmunmap\fP() correspondant. Le premier accès dans la page projetée mettra le champ à jour si cela n'a pas été déjà fait. .PP .\" Les champs \fIst_ctime\fP et \fIst_mtime\fP pour un fichier projeté avec \fBPROT_WRITE\fP et \fBMAP_SHARED\fP seront mis à jour après une écriture dans la région projetée, et avant l'éventuel \fBmsync\fP(2) suivant avec l'attribut \fBMS_SYNC\fP ou \fBMS_ASYNC\fP. .SS "Projections de pages immenses (Huge TLB)" Pour les projections qui utilisent des pages immenses, les exigences des attributs de \fBmmap\fP() et de \fBmunmap\fP() diffèrent quelque peu de celles pour des projections qui utilisent la taille native des pages du système. .PP Pour \fBmmap\fP(), \fIoffset\fP doit être un multiple de la taille de la page immense sous\-jacente. Le système aligne automatiquement \fIlength\fP pour qu'il soit un multiple de la taille de la page immense sous\-jacente. .PP .\" Pour \fBmunmap\fP(), \fIaddr\fP et \fIlength\fP doivent être tous deux un multiple de la taille de la page immense sous\-jacente. .SS "différences entre bibliothèque C et noyau" .\" Since around glibc 2.1/2.2, depending on the platform. Cette page décrit l'interface fournie par la fonction \fBmmap\fP() de la glibc. Initialement, cette fonction appelait un appel système du même nom. Depuis le noyau 2.4, cet appel système a été remplacé par \fBmmap2\fP(2). De nos jours, la fonction \fBmmap\fP() de la glibc appelle \fBmmap2\fP(2) avec la bonne valeur pour \fIoffset\fP. .SH BOGUES Sous Linux, il n'y a aucune garantie comme celles indiquées plus haut à propos de \fBMAP_NORESERVE\fP. Par défaut, n'importe quel processus peut être tué à tout moment lorsque le système n'a plus de mémoire. .PP Dans les noyaux antérieurs à 2.6.7, le drapeau \fBMAP_POPULATE\fP n'avait d'effet que si \fIprot\fP était \fBPROT_NONE\fP. .PP SUSv3 indique que \fBmmap\fP() devrait échouer si \fIlength\fP est 0. Cependant, avec les versions de Linux antérieures à 2.6.12, \fBmmap\fP() réussissait dans ce cas\ : aucune projection n'était créée, et l'appel renvoyait \fIaddr\fP. Depuis le noyau 2.6.12, \fBmmap\fP() échoue avec le code d'erreur \fBEINVAL\fP si \fIlength\fP est nul. .PP POSIX spécifie que le système devrait toujours remplir de zéros toutes les pages incomplètes à la fin de l'objet et que le système n'écrira jamais de modification de l'objet au\-delà de sa fin. Sous Linux, lors de l'écriture de données vers ce genre de pages incomplètes après la fin de l'objet, les données restent dans le cache de page même après que le fichier soit fermé et déprojeté, et même si les données ne sont jamais écrites vers le fichier lui\-même, les projections suivantes pourraient voir le contenu modifié. Dans certains cas, cela pourrait être corrigé en appelant \fBmsync\fP(2) avant la déprojection. Cependant, cela ne fonctionne pas sur \fBtmpfs\fP(5) (par exemple en utilisant l'interface de mémoire partagée POSIX documentée dans \fBshm_overview\fP(7)). .SH EXEMPLES .\" FIXME . Add an example here that uses an anonymous shared region for .\" IPC between parent and child. Le programme suivant affiche la partie du fichier, précisé par le premier argument de la ligne de commande, sur la sortie standard. Les octets qui seront affichés sont précisés à partir d'un offset (déplacement) et d'une longueur en deuxième et troisième paramètre. Le code fait une projection mémoire des pages nécessaires du fichier puis utilise \fBwrite\fP(2) pour afficher les octets voulus. .SS "Source du programme" .EX #include #include #include #include #include #include #define handle_error(msg) \e do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { char *addr; int fd; struct stat sb; off_t offset, pa_offset; size_t length; ssize_t s; if (argc < 3 || argc > 4) { fprintf(stderr, "%s fichier offset [longueur]\en", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDONLY); if (fd == \-1) handle_error("open"); if (fstat(fd, &sb) == \-1) /* Pour obtenir la taille du fichier */ handle_error("fstat"); offset = atoi(argv[2]); pa_offset = offset & \(ti(sysconf(_SC_PAGE_SIZE) \- 1); /* la position de mmap() doit être alignée sur la page */ if (offset >= sb.st_size) { fprintf(stderr, "L'offset dépasse la fin du fichier\en"); exit(EXIT_FAILURE); } if (argc == 4) { length = atoi(argv[3]); if (offset + length > sb.st_size) length = sb.st_size \- offset; /* Impossible d'afficher les octets en dehors du fichier */ } else { /* Pas de paramètre longueur ==> affichage jusqu'à la fin du fichier */ length = sb.st_size \- offset; } addr = mmap(NULL, length + offset \- pa_offset, PROT_READ, MAP_PRIVATE, fd, pa_offset); if (addr == MAP_FAILED) handle_error("mmap"); s = write(STDOUT_FILENO, addr + offset \- pa_offset, length); if (s != length) { if (s == \-1) handle_error("write"); fprintf(stderr, "écriture partielle"); exit(EXIT_FAILURE); } munmap(addr, length + offset \- pa_offset); close(fd); exit(EXIT_SUCCESS); } .EE .SH "VOIR AUSSI" \fBftruncate\fP(2), \fBgetpagesize\fP(2), \fBmemfd_create\fP(2), \fBmincore\fP(2), \fBmlock\fP(2), \fBmmap2\fP(2), \fBmprotect\fP(2), \fBmremap\fP(2), \fBmsync\fP(2), \fBremap_file_pages\fP(2), \fBsetrlimit\fP(2), \fBshmat\fP(2), \fBuserfaultfd\fP(2), \fBshm_open\fP(3), \fBshm_overview\fP(7) .PP Dans \fBproc\fP(5), les descriptions des fichiers \fI/proc/[pid]/maps\fP, \fI/proc/[pid]/map_files\fP et \fI/proc/[pid]/smaps\fP. .PP .\" .\" Repeat after me: private read-only mappings are 100% equivalent to .\" shared read-only mappings. No ifs, buts, or maybes. -- Linus B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128\(en129 et 389\(en391. .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .