Provided by: manpages-fr-dev_4.26.0-1_all bug

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.

Pages du manuel de Linux 6.9.1                     2 mai 2024                                         madvise(2)