Man page - madvise(2)

Packages contains this manual

Available languages:

en fr ja

Manual

madvise

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Valeurs de conseil conventionnelles
Valeurs de conseil spécifiques à Linux
VALEUR RENVOYÉE
ERREURS
VERSIONS
Linux
STANDARDS
HISTORIQUE
VOIR AUSSI
TRADUCTION

NOM

madvise - Configurer l’utilisation de la mĂ©moire

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/mman.h>

int madvise(void addr [. length ], size_t length , int advice );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

madvise () :
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
Jusqu’à la glibc 2.19 incluse :
_BSD_SOURCE

DESCRIPTION

L’appel systĂšme madvise () est utilisĂ© pour conseiller ou orienter le noyau quant Ă  la plage d’adresses commençant Ă  addr et de taille length . madvise () n’agit que sur des pages entiĂšres, addr doit donc ĂȘtre alignĂ©e sur une page. La valeur de length est arrondie au multiple supĂ©rieur de la taille de page. Dans la plupart des cas, le but de tels conseils est d’amĂ©liorer les performances du systĂšme ou d’une application.

Initialement, l’appel systĂšme gĂ©rait un ensemble de valeurs de advice « conventionnelles », disponibles aussi sur d’autres implĂ©mentations (notez toutefois que madvise () n’est pas spĂ©cifiĂ© dans POSIX). Par consĂ©quent, un certain nombre de valeurs de advice spĂ©cifiques Ă  Linux ont Ă©tĂ© ajoutĂ©es.

Valeurs de conseil conventionnelles

Les valeurs de advice (conseil) listĂ©es ci-dessous permettent Ă  une application d’indiquer au noyau l’utilisation qu’elle compte faire de certaines zones de mĂ©moire partagĂ©e ou projetĂ©e de façon Ă  ce que le noyau puisse choisir les techniques de lecture anticipĂ©e et de mise en cache appropriĂ©es. Ces valeurs advice ne modifient pas la sĂ©mantique de l’application (sauf dans le cas de MADV_DONTNEED ), mais peuvent avoir un impact sur ses performances. Toutes les valeurs de advice listĂ©es ici ont un pendant dans la fonction posix_madvise (3) spĂ©cifiĂ©e par POSIX et elles ont la mĂȘme signification, sauf MADV_DONTNEED .

Le conseil est spĂ©cifiĂ© par le paramĂštre advice qui peut ĂȘtre un des suivants :
MADV_NORMAL

Pas de traitement particulier. Il s’agit du comportement par dĂ©faut.

MADV_RANDOM

PrĂ©voir des rĂ©fĂ©rences de page dans un ordre alĂ©atoire. (Ainsi, la lecture anticipĂ©e sera moins utile qu’elle ne l’est en gĂ©nĂ©ral.)

MADV_SEQUENTIAL

PrĂ©voir des rĂ©fĂ©rences de page dans un ordre sĂ©quentiel. (Ainsi, les pages d’une plage donnĂ©e peuvent ĂȘtre systĂ©matiquement lues par anticipation, et peuvent ĂȘtre libĂ©rĂ©es rapidement aprĂšs avoir Ă©tĂ© accĂ©dĂ©es.)

MADV_WILLNEED

PrĂ©voir un accĂšs dans un futur proche. (Ainsi, lire quelques pages de façon anticipĂ©e peut ĂȘtre une bonne idĂ©e.)

MADV_DONTNEED

Ne pas s’attendre Ă  un accĂšs dans un futur proche (quant au temps, l’application est finie avec la plage donnĂ©e, pour que le noyau puisse libĂ©rer des ressources qui lui sont associĂ©es).

AprĂšs une opĂ©ration MADV_DONTNEED rĂ©ussie, la sĂ©mantique de l’accĂšs en mĂ©moire dans la rĂ©gion indiquĂ©e est modifiĂ©e : les accĂšs suivants des pages rĂ©ussiront, mais provoqueront un nouveau remplissage de la mĂ©moire soit avec le contenu Ă  jour du fichier transposĂ© sous-jacent (pour les mappages de fichiers partagĂ©s, ceux anonymes partagĂ©s et les techniques basĂ©es sur shmem telles que les segments de mĂ©moire partagĂ©e de System V), soit avec les pages remplies de zĂ©ros Ă  la demande pour les tableaux privĂ©s anonymes.

Remarquez qu’appliquĂ©e Ă  des mappages partagĂ©s, MADV_DONTNEED pourrait ne pas aboutir Ă  une libĂ©ration immĂ©diate des pages dans la plage. Le noyau est libre de retarder la libĂ©ration des pages jusqu’au bon moment. La mĂ©moire rĂ©sidente (resident set size, ou RSS) du processus appelant sera par contre immĂ©diatement rĂ©duite.

MADV_DONTNEED ne peut pas s’appliquer Ă  des pages verrouillĂ©es ou Ă  des pages VM_PFNMAP (les pages marquĂ©es par l’attribut VM_PFNMAP interne au noyau sont des rĂ©gions de mĂ©moire spĂ©ciales non gĂ©rĂ©es par le sous-systĂšme de mĂ©moire virtuelle. De telles pages sont gĂ©nĂ©ralement créées par des pilotes de pĂ©riphĂ©rique transposant les pages dans l’espace utilisateur).

La prise en charge des pages immenses TLB a Ă©tĂ© ajoutĂ©e Ă  Linux 5.18. Les adresses d’un mappage stockĂ©es par des pages immenses TLB doivent ĂȘtre alignĂ©es sur la taille de la page immense TLB sous-jacente et la taille de la plage est arrondie Ă  un multiple supĂ©rieur de la taille de la page immense TLB sous-jacente.

Valeurs de conseil spécifiques à Linux

Les valeurs advice suivantes spĂ©cifiques Ă  Linux n’ont pas d’équivalent dans le posix_madvise (3) spĂ©cifiĂ© par POSIX et peuvent en avoir ou pas dans l’interface madvise () disponible sur d’autres implĂ©mentations. Notez que certaines de ces opĂ©rations modifient la sĂ©mantique des accĂšs en mĂ©moire.
MADV_REMOVE
(depuis Linux 2.6.16)

LibĂ©rer jusqu’à une plage donnĂ©e de pages et son stockage de repli associĂ©. Cela revient Ă  faire un trou dans la plage d’octets correspondante du stockage de secours (voir fallocate (2)). Les accĂšs suivants Ă  la plage d’adresses indiquĂ©e verront des donnĂ©es de valeur zĂ©ro.

La plage d’adresses indiquĂ©e doit ĂȘtre transposĂ©e, partagĂ©e et accessible en Ă©criture. Cet attribut ne peut pas ĂȘtre appliquĂ© Ă  des pages verrouillĂ©es ou Ă  des pages VM_PFNMAP .

Dans l’implĂ©mentation initiale, seul tmpfs (5) prenait en charge MADV_REMOVE ; mais depuis Linux 3.5, tous les systĂšmes de fichiers qui prennent en charge le mode FALLOC_FL_PUNCH_HOLE de fallocate (2) gĂšrent Ă©galement MADV_REMOVE . Les systĂšmes de fichiers qui ne gĂšrent pas MADV_REMOVE Ă©chouent avec l’erreur EOPNOTSUPP .

La prise en charge du systÚme de fichier de page immense TLB a été ajoutée à Linux 4.3.

MADV_DONTFORK (depuis Linux 2.6.16)

Ne pas rendre les pages de cette plage disponibles Ă  l’enfant aprĂšs un fork (2). Cela est utile pour empĂȘcher la sĂ©mantique de copie Ă  l’écriture de changer l’emplacement physique d’une page si le parent y Ă©crit aprĂšs un fork (2) (de tels dĂ©placements posent des problĂšmes si le matĂ©riel accĂšde directement Ă  la page (DMA)).

MADV_DOFORK (depuis Linux 2.6.16)

Annuler l’effet de MADV_DONTFORK et restaurer le comportement par dĂ©faut, oĂč un mappage est rĂ©cupĂ©rĂ© Ă  l’aide de fork (2).

MADV_HWPOISON (depuis Linux 2.6.32)

Empoisonner les pages dans la plage indiquĂ©e par addr et length et traiter les rĂ©fĂ©rences ultĂ©rieures Ă  ces pages comme une corruption de la mĂ©moire matĂ©rielle. Cette opĂ©ration n’est disponible que pour les processus privilĂ©giĂ©s ( CAP_SYS_ADMIN ). À la suite de cette opĂ©ration, le processus appelant peut recevoir un SIGBUS et la page devenir non affectĂ©e.

Cette fonctionnalitĂ© est conçue pour tester du code de gestion des erreurs de mĂ©moire ; elle n’est disponible que si le noyau a Ă©tĂ© configurĂ© avec CONFIG_MEMORY_FAILURE .

MADV_MERGEABLE (depuis Linux 2.6.32)

Activer la fusion des pages identiques par le noyau ( Kernel Samepage Merging , ou KSM) pour les pages dans la plage spĂ©cifiĂ©e par addr et length . Le noyau analyse rĂ©guliĂšrement les rĂ©gions de la mĂ©moire utilisateur qui ont Ă©tĂ© marquĂ©es comme pouvant ĂȘtre fusionnĂ©es, Ă  la recherche de pages avec un contenu identique. Elles sont remplacĂ©es par une page unique protĂ©gĂ©e en Ă©criture (qui sera automatiquement recopiĂ©e si un processus veut plus tard modifier le contenu de la page). KSM ne fusionne que les pages anonymes privĂ©es (consultez mmap (2)).

La fonctionnalitĂ© KSM est prĂ©vue pour des applications qui gĂ©nĂšrent de nombreuses instances avec les mĂȘmes donnĂ©es (comme les systĂšmes de virtualisation tels que KVM). Cela consomme beaucoup de puissance de calcul ; utilisez-la prudemment. Voir le fichier Documentation/admin-guide/mm/ksm.rst des sources du noyau Linux pour plus de dĂ©tails.

Les opérations MADV_MERGEABLE et MADV_UNMERGEABLE ne sont disponibles que si le noyau a été configuré avec CONFIG_KSM .

MADV_UNMERGEABLE (depuis Linux 2.6.32)

Annuler l’effet d’une opĂ©ration MADV_MERGEABLE prĂ©cĂ©dente sur la plage d’adresses spĂ©cifiĂ©e ; KSM annule la fusion sur les pages qui avaient Ă©tĂ© fusionnĂ©es dans la plage spĂ©cifiĂ©e par addr et length .

MADV_SOFT_OFFLINE (depuis Linux 2.6.33)

DĂ©connecter en douceur les pages dans la plage spĂ©cifiĂ©e par addr et length . La mĂ©moire de chaque page dans la plage spĂ©cifiĂ©e est prĂ©servĂ©e (lors du prochain accĂšs, le mĂȘme contenu sera visible, mais dans une nouvelle page physique), et la page originale est dĂ©connectĂ©e (ce qui signifie qu’elle n’est plus utilisĂ©e, et plus prise en compte par les mĂ©canismes habituels de gestion de la mĂ©moire). L’effet de l’opĂ©ration MADV_SOFT_OFFLINE est invisible au processus appelant (c’est-Ă -dire qu’elle n’en change pas la sĂ©mantique).

Cette fonctionnalitĂ© est conçue pour tester du code de gestion des erreurs de mĂ©moire ; elle n’est disponible que si le noyau a Ă©tĂ© configurĂ© avec CONFIG_MEMORY_FAILURE .

MADV_HUGEPAGE (depuis Linux 2.6.38)

Activer la gestion transparente des pages immenses ( Transparent Huge Pages , ou THP) pour les pages dans la plage spécifiée par addr et length . Le noyau analysera réguliÚrement les régions qui ont été marquées comme candidates aux pages immenses pour les remplacer par des pages immenses. Le noyau allouera aussi des pages immenses directement quand la région est naturellement alignée sur la taille de page immense (consultez posix_memalign (2)).

Cette fonctionnalitĂ© est d’abord destinĂ©e aux applications qui utilisent tout Ă  la fois de grands mappages, beaucoup de donnĂ©es et de grandes rĂ©gions d’accĂšs Ă  la mĂ©moire (comme les systĂšmes de virtualisation tels que QEMU). Elle peut facilement consommer beaucoup de mĂ©moire (par exemple un tableau de 2 Mo qui n’accĂšde qu’à un octet dĂ©pensera 2 Mo de mĂ©moire et non une page de 4 Ko). Voir le fichier Documentation/admin-guide/mm/transhuge.rst des sources du noyau Linux pour plus de dĂ©tails.

La plupart des configurations de noyaux classiques fournissent un comportement Ă  la maniĂšre de MADV_HUGEPAGE par dĂ©faut, et ainsi MADV_HUGEPAGE n’est normalement pas nĂ©cessaire. Il est le plus souvent utile pour les systĂšmes embarquĂ©s oĂč un comportement de type MADV_HUGEPAGE peut ne pas ĂȘtre activĂ© par dĂ©faut dans le noyau. Sur de tels systĂšmes, cet attribut peut ĂȘtre utilisĂ© pour activer THP de maniĂšre sĂ©lective. À chaque fois que MADV_HUGEPAGE est utilisĂ©, il devrait toujours l’ĂȘtre dans des rĂ©gions de la mĂ©moire oĂč le dĂ©veloppeur sait Ă  l’avance que le motif d’accĂšs ne risquera pas d’augmenter l’empreinte de l’application quand les pages immenses transparentes sont actives.

Depuis Linux 5.4, une analyse automatique des zones Ă©ligibles et des remplacements par des pages immenses s’effectue sur les pages anonymes et privĂ©es (voir mmap (2)), des pages shmem et des pages mises en cache. Pour tous les types de mĂ©moire, la mĂ©moire ne peut ĂȘtre remplacĂ©e que par des pages immenses sur des limites alignĂ©es sur les pages immenses. Pour la mĂ©moire projetĂ©e sur un fichier (y compris tmpfs (voir tmpfs (2)), le mappage doit naturellement ĂȘtre aussi alignĂ© sur une page immense dans le fichier. De plus, pour les fichiers sauvegardĂ©s, la mĂ©moire non tmpfs, le fichier ne doit pas ĂȘtre accessible en Ă©criture et le tableau doit ĂȘtre exĂ©cutable.

La VMA ne doit pas avoir de mrquage VM_NOHUGEPAGE , VM_HUGETLB , VM_IO , VM_DONTEXPAND , VM_MIXEDMAP ou VM_PFNMAP , et elle ne peut pas non plus ĂȘtre une mĂ©moire de pile ou une mĂ©moire de secours pour un pĂ©riphĂ©rique oĂč DAX est activĂ© (sauf si ce pĂ©riphĂ©rique est branchĂ© Ă  chaud en tant que RAM du systĂšme). Le processus ne doit pas avoir de PR_SET_THP_DISABLE positionnĂ© (voir prctl (2)).

Les opérations MADV_HUGEPAGE , MADV_NOHUGEPAGE et MADV_COLLAPSE ne sont disponibles que si le noyau a été configuré avec CONFIG_TRANSPARENT_HUGEPAGE et la mémoire pour les fichiers/shmem est seulement prise en charge que si le noyau a été configuré avec CONFIG_READ_ONLY_THP_FOR_FS .

MADV_NOHUGEPAGE (depuis Linux 2.6.38)

S’assurer que la mĂ©moire dans la plage spĂ©cifiĂ©e par addr et length ne sera pas gĂ©rĂ©e dans des pages immenses transparentes.

MADV_COLLAPSE (depuis Linux 6.1)

Effectuer une suppression synchronisĂ©e autant que possible avec les pages natives projetĂ©es par la plage de mĂ©moire en Transparent Huge Pages (THP). MADV_COLLAPSE agit sur l’état actuel de la mĂ©moire du processus appelant et ne fait aucun changement permanent ou ne garantit rien sur la maniĂšre dont les pages seront projetĂ©es, construites ou dĂ©faillantes dans le futur.

/ MADV_COLLAPSE gĂšre les pages anonymes privĂ©es (voir mmap (2)), les pages shmem et les pages mises en cache. Voir MADV_HUGEPAGE pour des informations gĂ©nĂ©rales sur les exigences de mĂ©moire de THP. Si la plage fournie couvre plusieurs VMA, la sĂ©mantique de la suppression dans chaque VMA est indĂ©pendante des autres. Si la suppression d’une rĂ©gion dimensionnĂ©e ou alignĂ©e sur une page immense donnĂ©e Ă©choue, l’opĂ©ration peut continuer Ă  essayer de supprimer le reste de la mĂ©moire indiquĂ©e. MADV_COLLAPSE alignera automatiquement la plage fournie sur la page immense.

Toutes les pages non rĂ©sidentes faisant partie de la plage seront d’abord Ă©changĂ©es ou mises en erreur, avant d’ĂȘtre copiĂ©es sur une page immense fraĂźchement allouĂ©e. Si les pages natives reprĂ©sentent la mĂȘme page immense projetĂ©e en PTE et si elles sont alignĂ©es correctement, l’allocation d’une nouvelle page immense peut ĂȘtre Ă©vitĂ©e et la suppression peut se faire directement. Les pages non projetĂ©es verront leurs donnĂ©es initialisĂ©es directement Ă  0 dans la nouvelle page immense. Toutefois, pour chaque rĂ©gion Ă©ligible dimensionnĂ©e/alignĂ©e sur une page immense Ă  supprimer, au moins une page doit ĂȘtre rĂ©cupĂ©rĂ©e par la mĂ©moire physique.

MADV_COLLAPSE est indĂ©pendant du paramĂ©trage du sysfs (voir sysfs (5)) dans /sys/kernel/mm/transparent_hugepage , tant pour dĂ©terminer l’éligibilitĂ© THP que la sĂ©mantique d’allocation. Voir le fichier Documentation/admin-guide/mm/transhuge.rst des sources du noyau Linux pour plus d’informations. MADV_COLLAPSE ignore Ă©galement le montage tmpfs huge= lorsqu’il agit sur des fichiers tmpfs. L’allocation de nouvelles pages immenses peut entamer une libĂ©ration/compactage directs indĂ©pendamment des attributs de la VMA (encore que VM_NOHUGEPAGE est toujours respectĂ©).

Lorsque le systĂšme a plusieurs nƓuds NUMA, la page immense sera allouĂ©e Ă  partir du nƓud contenant les pages les plus natives.

Si toutes les rĂ©gions dimensionnĂ©es ou alignĂ©es sur la page immense et incluses dans la plage fournie ont Ă©tĂ© supprimĂ©es avec succĂšs ou si les THP ont dĂ©jĂ  Ă©tĂ© projetĂ©es PMD, cette opĂ©ration se terminera avec succĂšs. Remarquez que cela ne garantit rien quant aux autres projections possibles de la mĂ©moire. Si plusieurs zones dimensionnĂ©es ou alignĂ©es sur une page immense Ă©chouent Ă  ĂȘtre supprimĂ©es, seul le code d’erreur le plus rĂ©cent sera positionnĂ© dans errno .

MADV_DONTDUMP (depuis Linux 3.4)

Exclure de l’image mĂ©moire (« core dump ») les pages dans la plage indiquĂ©e par addr et length . C’est utile pour les applications dont de larges zones de mĂ©moire sont notoirement inutiles dans une image mĂ©moire. L’effet de MADV_DONTDUMP est prioritaire sur le masque de bits configurĂ© Ă  l’aide de /proc/ pid /coredump_filter , consultez core (5).

MADV_DODUMP (depuis Linux 3.4)

Annuler l’effet d’un MADV_DONTDUMP antĂ©rieur.

MADV_FREE (depuis Linux 4.5)

L’application n’a plus besoin des pages dans la plage indiquĂ©e par addr et length . Le noyau peut ainsi libĂ©rer ces pages mais cela pourrait ĂȘtre diffĂ©rĂ© jusqu’à une pression de la mĂ©moire. Pour chacune des pages marquĂ©es comme libĂ©rables mais non encore libĂ©rĂ©es, l’opĂ©ration sera annulĂ©e si l’appelant Ă©crit dans la page. AprĂšs une opĂ©ration MADV_FREE rĂ©ussie, toutes les donnĂ©es pĂ©rimĂ©es (c’est-Ă -dire les pages sales ou non Ă©crites) seront perdues quand le noyau libĂšrera les pages. Cependant, les Ă©critures suivantes dans les pages de la plage auront lieu et le noyau ne pourra pas libĂ©rer ces pages salies, de sorte que l’appelant pourra toujours voir les donnĂ©es qui viennent d’ĂȘtre Ă©crites. S’il n’y a pas d’écriture ultĂ©rieure, le noyau peut libĂ©rer les pages n’importe quand. Une fois que les pages de la plage ont Ă©tĂ© libĂ©rĂ©es, l’appelant verra des pages remplies de zĂ©ros Ă  la demande Ă  chaque rĂ©fĂ©rence ultĂ©rieure aux pages.

L’opĂ©ration MADV_FREE ne peut s’appliquer qu’à des pages anonymes privĂ©es (voir mmap (2)). Avant Linux 4.12, avant de libĂ©rer des pages sur un systĂšme sans espace d’échange, les pages dans la plage donnĂ©e Ă©taient libĂ©rĂ©es instantanĂ©ment indĂ©pendamment de la pression sur la mĂ©moire.

MADV_WIPEONFORK (depuis Linux 4.14

Afficher le processus enfant avec une mĂ©moire pleine de zĂ©ros dans cette plage aprĂšs un fork (2). Cela est utile quand on rĂ©plique (fork) un serveur pour s’assurer que les donnĂ©es sensibles au processus (par exemple les graines PRNG, les codes de chiffrement et ainsi de suite) ne soient pas capturĂ©es par les processus enfants.

L’opĂ©ration MADV_WIPEONFORK ne peut s’appliquer qu’aux pages anonymes privĂ©es (voir mmap (2)).

Dans l’enfant créé par fork (2), le paramĂštre MADV_WIPEONFORK reste en place sur la plage d’adresses indiquĂ©e. Ce paramĂštre est vidĂ© lors d’un execve (2).

MADV_KEEPONFORK (depuis Linux 4.14)

Annuler l’effet d’un MADV_WIPEONFORK antĂ©rieur.

MADV_COLD (depuis Linux 5.4)

DĂ©sactiver une plage de pages donnĂ©e. Cela en fera des cibles de libĂ©ration plus probables en cas de pression sur la mĂ©moire. Il s’agit d’une opĂ©ration non destructive. Ce conseil pourrait ĂȘtre ignorĂ© pour certaines pages de la plage s’il n’est pas applicable.

MADV_PAGEOUT (depuis Linux 5.4)

LibĂ©rer une plage de pages donnĂ©e. Cela est utilisĂ© pour libĂ©rer de la mĂ©moire occupĂ©e par ces pages. Si une page est anonyme, elle peut ĂȘtre Ă©changĂ©e. Si une page est mise en cache et sale, elle sera réécrite dans le stockage de repli. Le conseil pourrait ĂȘtre ignorĂ© pour certaines pages de la plage s’il n’est pas applicable.

MADV_POPULATE_READ (depuis Linux 5.14)

Peupler (prefault) les tables de pages lisibles, mettant en erreur toutes les pages de la plage comme si on la lisait manuellement Ă  partir de chaque page ; par contre Ă©viter l’accĂšs rĂ©el en mĂ©moire qui aurait Ă©tĂ© fait aprĂšs la gestion des erreurs.

Contrairement Ă  MAP_POPULATE , MADV_POPULATE_READ ne cache pas les erreurs, il peut ĂȘtre appliquĂ© Ă  tout ou partie des mappages existants et il peuplera (prefault) toujours les tables de pages lisibles. Un exemple d’utilisation est de peupler un tableau de fichier, en lisant tout le contenu du fichier Ă  partir du disque ; mais les pages ne seront pas salies, donc il ne faudra pas les réécrire sur le disque lorsqu’on les sortira de la mĂ©moire.

Selon le mappage sous-jacent, projeter la page de zĂ©ros partagĂ©e, prĂ©-allouer la mĂ©moire ou lire le fichier sous-jacent ; les fichiers contenant des trous pourraient ou pas prĂ©-allouer des blocs. Si le peuplement Ă©choue, aucun signal SIGBUS n’est gĂ©nĂ©rĂ© mais une erreur est renvoyĂ©e.

Si MADV_POPULATE_READ réussit, tous les tables de pages ont été peuplées (prefaulted) et lisibles une fois. Si MADV_POPULATE_READ échoue, certaines tables de page pourraient avoir été peuplées.

MADV_POPULATE_READ ne peut pas ĂȘtre appliquĂ© aux mappages sans droit de lecture ni projections spĂ©ciales, par exemple celles marquĂ©es par des drapeaux tels que VM_PFNMAP ou VM_IO , ou Ă  des rĂ©gions de mĂ©moire secrĂštes créées par en utilisant memfd_secret(2) .

Remarquez qu’avec MADV_POPULATE_READ , le processus peut ĂȘtre tuĂ© n’importe quand si le systĂšme n’a plus assez de mĂ©moire.

MADV_POPULATE_WRITE (depuis Linux 5.14)

Peupler (prefault) les tables de pages lisibles, mettant en erreur toutes les pages de la plage comme si on Ă©crivait manuellement dans chaque page ; par contre Ă©viter l’accĂšs rĂ©el en mĂ©moire qui aurait Ă©tĂ© fait aprĂšs la gestion des erreurs.

Contrairement Ă  MAP_POPULATE , MADV_POPULATE_WRITE ne cache pas les erreurs, il peut ĂȘtre appliquĂ© Ă  tout ou partie des mappages existants et il peuplera (prefault) toujours les tables de pages accessibles en Ă©criture. Un exemple d’utilisation est de prĂ©-allouer de la mĂ©moire et d’interrompre toute copie sur Ă©criture.

Selon le mappage sous-jacent, projeter la page de zĂ©ros partagĂ©e, prĂ©-allouer la mĂ©moire ou lire le fichier sous-jacent ; les fichiers contenant des trous prĂ©-alloueront des blocs. Si le peuplement Ă©choue, aucun signal SIGBUS n’est gĂ©nĂ©rĂ© mais une erreur est renvoyĂ©e.

Si MADV_POPULATE_WRITE réussit, tous les tables de pages ont été peuplés (prefaulted) et écrits une fois. Si MADV_POPULATE_WRITE échoue, certaines tables de page pourraient avoir été peuplées.

MADV_POPULATE_WRITE ne peut pas ĂȘtre appliquĂ© aux mappages sans droit d’écriture ni projections spĂ©ciales, par exemple celles marquĂ©es par des drapeaux tels que VM_PFNMAP ou VM_IO , ou Ă  des rĂ©gions de mĂ©moire secrĂštes créées par en utilisant memfd_secret(2) .

Remarquez qu’avec MADV_POPULATE_WRITE , le processus peut ĂȘtre tuĂ© n’importe quand si le systĂšme n’a plus assez de mĂ©moire.

VALEUR RENVOYÉE

En cas de succĂšs madvise () renvoie zĂ©ro. En cas d’erreur, il renvoie -1 et errno est positionnĂ© pour indiquer l’erreur.

ERREURS

EACCES

advice est MADV_REMOVE , mais la plage d’adresses indiquĂ©e n’est pas un mappage partagĂ© oĂč on peut Ă©crire.

EAGAIN

Une ressource du noyau est temporairement indisponible.

EBADF

La projection existe, mais la zone n’est pas associĂ©e Ă  un fichier.

EBUSY

(pour MADV_COLLAPSE ) N’a pas pu charger la page immense dans cgroup : la limite du cgroup a Ă©tĂ© dĂ©passĂ©e.

EFAULT

advice vaut MADV_POPULATE_READ ou MADV_POPULATE_WRITE et le peuplement (prefault) des tables de pages a Ă©chouĂ© car un SIGBUS aurait gĂ©nĂ©rĂ© un accĂšs rĂ©el Ă  la mĂ©moire et la raison n’est pas une page empoisonnĂ©e d’un HW (lesquelles peuvent ĂȘtre créées, par exemple, en utilisant le drapeau MADV_HWPOISON dĂ©crit ailleurs dans cette page).

EINVAL

addr n’est pas alignĂ© sur une page ou length est nĂ©gatif.

EINVAL

advice n’est pas valable.

EINVAL

advice vaut MADV_COLD ou MADV_PAGEOUT et la plage d’adresses indiquĂ©e inclut des pages verrouillĂ©es, immenses TLB ou VM_PFNMAP .

EINVAL

advice vaut MADV_DONTNEED ou MADV_REMOVE et la plage d’adresses indiquĂ©e inclut des pages verrouillĂ©es, immenses TLB ou VM_PFNMAP .

EINVAL

advice vaut MADV_MERGEABLE ou MADV_UNMERGEABLE , mais le noyau n’a pas Ă©tĂ© configurĂ© avec l’option CONFIG_KSM .

EINVAL

advice vaut MADV_FREE ou MADV_WIPEONFORK mais la plage d’adresses indiquĂ©e inclut un fichier, des TLB immenses, MAP_SHARED ou des plages VM_PFNMAP .

EINVAL

advice vaut MADV_POPULATE_READ ou MADV_POPULATE_WRITE , mais la plage d’adresses indiquĂ©e inclut des plages aux droits insuffisants ou ayant des mappages spĂ©ciaux, par exemple marquĂ©s par des drapeaux internes au noyau tels que VM_IO ou VM_PFNMAP , ou bien des rĂ©gions de mĂ©moire secrĂštes créées en utilisant memfd_secret (2).

EIO

(pour MADV_WILLNEED ) Suivre la consigne de pagination sur cette zone dépasserait la limite maximale de mémoire physique utilisable par le processus.

ENOMEM

(pour MADV_WILLNEED ) Mémoire insuffisante ; échec de pagination.

ENOMEM

(pour MADV_COLLAPSE ) MĂ©moire insuffisante, impossible d’allouer des pages immenses.

ENOMEM

Les adresses de la plage spĂ©cifiĂ©e ne sont pas projetĂ©es actuellement, ou n’appartiennent pas Ă  l’espace d’adressage du processus.

ENOMEM

advice vaut MADV_POPULATE_READ ou MADV_POPULATE_WRITE et le peuplement (prefaulting) des tables de pages a Ă©chouĂ© du fait d’une mĂ©moire insuffisante.

EPERM

advice vaut MADV_HWPOISON , mais l’appelant n’a pas la capacitĂ© CAP_SYS_ADMIN .

EHWPOISON

advice vaut MADV_POPULATE_READ ou MADV_POPULATE_WRITE et le peuplement (prefault) des tables de page a Ă©chouĂ© car une page empoisonnĂ©e d’un HW (des pages empoisonnĂ©es de HW peuvent ĂȘtre créées, par exemple, en utilisant le drapeau MADV_HWPOISON dĂ©crit ailleurs dans cette page) a Ă©tĂ© rencontrĂ©e.

VERSIONS

Des versions de cet appel systĂšme, qui implĂ©mentent une grande variĂ©tĂ© de valeurs advice , existent sur de nombreuses autres implĂ©mentations. D’autres implĂ©mentent au moins les attributs ci-dessus sous Conventional advice flags (attributs de conseil conventionnels), avec d’autres variantes de sĂ©mantique.

POSIX.1-2001 spĂ©cifie posix_madvise (3) avec des constantes POSIX_MADV_NORMAL , POSIX_MADV_RANDOM , POSIX_MADV_SEQUENTIAL , POSIX_MADV_WILLNEED , POSIX_MADV_DONTNEED et ainsi de suite, avec un comportement proche des attributs nommĂ©s de la mĂȘme maniĂšre que ceux listĂ©s ci-dessus.

Linux

L’implĂ©mentation Linux nĂ©cessite que l’adresse addr soit alignĂ©e sur une page, et permet que length vaille zĂ©ro. S’il y a des parties de la plage d’adresses spĂ©cifiĂ©e qui ne sont pas projetĂ©es, la version Linux de madvise () les ignore et applique l’appel au reste de la plage (mais renvoie ENOMEM comme il se doit).

madvise(0, 0, advice) renverra 0 si advice est pris en charge par le noyau et s’il peut s’appuyer dessus pour sonder la prise en charge.

STANDARDS

Aucun.

HISTORIQUE

Apparu dans 4.4BSD.

Depuis Linux 3.18, la gestion de cet appel systĂšme est optionnelle, dĂ©pendant du rĂ©glage de l’option de configuration CONFIG_ADVISE_SYSCALLS .

VOIR AUSSI

getrlimit (2), memfd_secret (2), mincore (2), mmap (2), mprotect (2), msync (2), munmap (2), prctl (2), process_madvise (2), posix_madvise (3), core (5)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .