madvise - Configurer l'utilisation de la mémoire
Bibliothèque C standard (libc, -lc)
#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
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.
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.
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.
En cas de succès madvise() renvoie zéro. En
cas d'erreur, il renvoie -1 et errno est positionné
pour indiquer l'erreur.
- 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.
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.
madvise() n'est spécifié dans aucun standard.
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.
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.
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)
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.