.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2016, IBM Corporation. .\" Written by Mike Rapoport .\" and Copyright (C) 2016 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 .\" .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH IOCTL_USERFAULTFD 2 "9 juin 2020" Linux "Manuel du programmeur Linux" .SH NOM ioctl_userfaultfd \- Créer un descripteur de fichier pour gérer les erreurs de pagination dans l'espace utilisateur .SH SYNOPSIS .nf \fB#include \fP .PP \fBint ioctl(int \fP\fIfd\fP\fB, int \fP\fIcmd\fP\fB, ...);\fP .fi .SH DESCRIPTION Diverses opérations \fBioctl\fP(2) peuvent être effectuées sur un objet userfaultfd (créé par un appel à \fBuserfaultfd\fP(2)) en utilisant des appels sous la forme\ : .PP .in +4n .EX ioctl(fd, cmd, argp); .EE .in Dans ce qui précède, \fIfd\fP est un descripteur de fichier se rapportant à un objet userfaultfd, \fIcmd\fP étant une des commandes ci\-dessous et \fIargp\fP étant un pointeur vers une structure de données spécifique à \fIcmd\fP. .PP .\" Les opérations \fBioctl\fP(2) sont décrites ci\-dessous. Celles \fBUFFDIO_API\fP, \fBUFFDIO_REGISTER\fP et \fBUFFDIO_UNREGISTER\fP sont utilisées pour \fIconfigurer\fP le comportement de userfaultfd. Ces opérations permettent à l'appelant de choisir les fonctionnalités qui seront activées et le type d'événement transmis à l'application. Ces opérations permettent à l'application appelante de résoudre des événements de problèmes de pages. .SS UFFDIO_API (Depuis Linux 4.3). Activer l'opération de userfaultfd et effectuer la poignée de main de l'API. .PP Le paramètre \fIargp\fP est un pointeur vers une structure \fIuffdio_api\fP, définie en tant que\ : .PP .in +4n .EX struct uffdio_api { __u64 api; /* Version de l'API demandée (entrée) */ __u64 features; /* Fonctionnalités demandées (entrée/sortie) */ __u64 ioctls; /* Opérations ioctl() disponibles (sortie) */ }; .EE .in .PP Le champ \fIapi\fP reflète la version de l'API demandée par l'application. .PP Le noyau vérifie qu'il peut gérer la version de l'API demandée et il positionne les champs \fIfeatures\fP et \fIioctls\fP à des masques de bit représentant toutes les fonctions disponibles et les opérations \fBioctl\fP(2) génériques disponibles. .PP Pour les versions du noyau Linux antérieures à la 4.11, le champ \fIfeatures\fP doit être initialisé à zéro avant l'appel \fIUFFDIO_API\fP, et zéro (c'est\-à\-dire pas de bit de fonctionnalité) est mis dans le champ \fIfeatures\fP par le noyau à partir du retour de \fBioctl\fP(2). .PP À partir de Linux 4.11, le champ \fIfeatures\fP peut être utilisé pour demander si des fonctions particulières sont prises en charge et pour activer explicitement des fonctionnalités userfaultfd désactivées par défaut. Le noyau signale toujours toutes les fonctions disponibles dans le champ \fIfeatures\fP. .PP .\" FIXME add more details about feature negotiation and enablement Pour activer les fonctionnalités userfaultfd, l'application doit positionner un bit correspondant à chaque fonction qu'il veut activer dans le champ \fIfeatures\fP. Si le noyau gère toutes les fonctionnalités demandées, il les activera. Sinon, il mettra zéro dans la structure \fIuffdio_api\fP renvoyée et il renverra \fBEINVAL\fP. .PP Les bits fonctionnels suivants peuvent être positionnés\ : .TP \fBUFFD_FEATURE_EVENT_FORK\fP (depuis Linux\ 4.11) Quand cette fonctionnalité est activée, les objets userfaultfd associés à un processus parent sont dupliqués dans un processus enfant lors d'un \fBfork\fP(2) et un événement \fBUFFD_EVENT_FORK\fP est généré sur le moniteur du userfaultfd .TP \fBUFFD_FEATURE_EVENT_REMAP\fP (depuis Linux\ 4.11) Si cette fonctionnalité est activée, quand le processus fautif appelle \fBmremap\fP(2), le moniteur userfaultfd recevra un événement de type \fBUFFD_EVENT_REMAP\fP. .TP \fBUFFD_FEATURE_EVENT_REMOVE\fP (depuis Linux\ 4.11) Si cette fonctionnalité est ativée, quand le processus fautif appelle \fBmadvise\fP(2) avec les valeurs \fBMADV_DONTNEED\fP ou \fBMADV_REMOVE\fP pour libérer une zone de mémoire virtuelle, le moniteur userfaultfd recevra un événement de type \fBUFFD_EVENT_REMOVE\fP. .TP \fBUFFD_FEATURE_EVENT_UNMAP\fP (depuis Linux\ 4.11) Si cette fonctionnalité est activée, quand le processus fautif désassocie la mémoire virtuelle explicitement avec \fBmunmap\fP(2), ou implicitement lors d'un \fBmmap\fP(2) ou d'un \fBmremap\fP(2), le moniteur userfaultfd recevra un événement de type \fBUFFD_EVENT_UNMAP\fP. .TP \fBUFFD_FEATURE_MISSING_HUGETLBFS\fP (depuis Linux\ 4.11) Si ce bit fonctionnel est positionné, le noyau gère l'enregistrement des plages userfaultfd par défaut dans les zones hugetlbfs de mémoire virtuelle .TP \fBUFFD_FEATURE_MISSING_SHMEM\fP (depuis Linux\ 4.11) Si ce bit fonctionnel est positionné, le noyau prend en charge l'enregistrement de plages userfaultfd dans les zones de mémoire partagées. Cela comprend toutes les APIs de mémoire partagée du noyau\ : la mémoire partagée System V, \fBtmpfs\fP(5), les tableaux partagés de \fI/dev/zero\fP, \fBmmap\fP(2) avec l'attribut \fBMAP_SHARED\fP positionné, \fBmemfd_create\fP(2) et ainsi de suite. .TP \fBUFFD_FEATURE_SIGBUS\fP (depuis Linux\ 4.14) .\" commit 2d6d6f5a09a96cc1fec7ed992b825e05f64cb50e Si ce bit fonctionnel est positionné, aucun événement d'erreur de page (\fBUFFD_EVENT_PAGEFAULT\fP) ne sera généré. Un signal \fBSIGBUS\fP sera plutôt envoyé au processus fautif. Les applications qui utilisent cette fonctionnalité n'exigeront pas qu'on utilise un moniteur userfaultfd pour gérer les accès mémoire aux régions enregistrées avec userfaultfd. .PP .\" FIXME This user-space API seems not fully polished. Why are there .\" not constants defined for each of the bit-mask values listed below? Le champ \fIioctls\fP renvoyé peut contenir les bits suivants\ : .TP \fB1 << _UFFDIO_API\fP L'opération \fBUFFDIO_API\fP est prise en charge. .TP \fB1 << _UFFDIO_REGISTER\fP L'opération \fBUFFDIO_REGISTER\fP est prise en charge. .TP \fB1 << _UFFDIO_UNREGISTER\fP L'opération \fBUFFDIO_UNREGISTER\fP est prise en charge. .PP Cette opération \fBioctl\fP(2) renvoie \fB0\fP en cas de succès. En cas d'erreur, \fB\-1\fP est renvoyé et \fIerrno\fP est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles\ : .TP \fBEFAULT\fP \fIargp\fP renvoie à une adresse en dehors de l'espace d'adressage accessible du processus appelant. .TP \fBEINVAL\fP Le userfaultfd a déjà été activé par une précédente opération \fBUFFDIO_API\fP. .TP \fBEINVAL\fP .\" FIXME In the above error case, the returned 'uffdio_api' structure is .\" zeroed out. Why is this done? This should be explained in the manual page. .\" .\" Mike Rapoport: .\" In my understanding the uffdio_api .\" structure is zeroed to allow the caller .\" to distinguish the reasons for -EINVAL. .\" La version de l'API demandée dans le champ \fIapi\fP n'est pas prise en charge par ce noyau ou le champ \fIfeatures\fP passé au noyau comprend des bits non gérés par la version actuelle du noyau. .SS UFFDIO_REGISTER (Depuis Linux 4.3). Enregistrer une plage d'adresse mémoire avec l'objet userfaultfd. Les pages de cette plage doivent être «\ compatibles\ » .PP Jusqu'au noyau 4.11 de Linux, seules les plages anonymes privées sont compatibles pour un enregistrement avec \fBUFFDIO_REGISTER\fP. .PP Depuis Linux 4.11, hugetlbfs et les plages de mémoire partagée sont aussi compatibles avec \fBUFFDIO_REGISTER\fP. .PP Le paramètre \fIargp\fP est un pointeur vers une structure \fIuffdio_register\fP, définie en tant que\ : .PP .in +4n .EX struct uffdio_range { __u64 start; /* Début de la plage */ __u64 len; /* Longueur de la plage (octets) */ }; struct uffdio_register { struct uffdio_range range; __u64 mode; /* Mode désiré de l'opération (entrée) */ __u64 ioctls; /* Opérations ioctl() disponibles (sortie) */ }; .EE .in .PP Le champ \fIrange\fP définit une plage de mémoire commençant à \fIstart\fP et s'étendant sur \fIlen\fP octets qui doit être gérée par userfaultfd. .PP Le champ \fImode\fP définit le mode d'opération désiré pour cette région de mémoire. Les valeurs suivantes peuvent être mises en bits et liées pour positionner le mode userfaultfd pour la plage indiquée\ : .TP \fBUFFDIO_REGISTER_MODE_MISSING\fP Retrouver les erreurs de pages du fait de pages absentes. .TP \fBUFFDIO_REGISTER_MODE_WP\fP Retrouver des erreurs de page du fait de pages protégées en écriture. .PP Actuellement, le seul mode pris en charge est \fBUFFDIO_REGISTER_MODE_MISSING\fP. .PP Si l'opération réussit, le noyau modifie le champ du masque de bit \fIioctls\fP pour indiquer les opérations \fBioctl\fP(2) disponibles sur la plage indiquée. Ce masque de bit renvoyé est le même que pour \fBUFFDIO_API\fP. .PP .\" FIXME Is the following error list correct? .\" Cette opération \fBioctl\fP(2) renvoie \fB0\fP en cas de succès. En cas d'erreur, \fB\-1\fP est renvoyé et \fIerrno\fP est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles\ : .TP \fBEBUSY\fP Un tableau de la plage indiquée est enregistré avec un autre objet userfaultfd. .TP \fBEFAULT\fP \fIargp\fP renvoie à une adresse en dehors de l'espace d'adressage accessible du processus appelant. .TP \fBEINVAL\fP Un bit non valable ou non pris en charge a été indiqué dans le champ \fImode\fP\ ; ou le champ \fImode\fP valait zéro. .TP \fBEINVAL\fP Il n'y a pas de tableau dans la plage d'adresse indiquée. .TP \fBEINVAL\fP \fIrange.start\fP ou \fIrange.len\fP n'est pas un multiple de la taille de la page du système\ ; ou \fIrange.len\fP vaut zéro\ ; ou ces champs ne sont pas valables pour d'autres raisons. .TP \fBEINVAL\fP .\" Mike Rapoport: .\" ENOMEM if the process is exiting and the .\" mm_struct has gone by the time userfault grabs it. Un tableau incompatible est présent dans la plage d'adresse indiquée. .SS UFFDIO_UNREGISTER (Depuis Linux 4.3). Désenregistre une plage d'adresse mémoire de userfaultfd. Les pages de cette plage doivent être «\ compatibles\ » (voir la description de \fBUFFDIO_REGISTER\fP). .PP La plage d'adresse à désenregistrer est indiquée dans la structure \fIuffdio_range\fP vers laquelle pointe \fIargp\fP. .PP Cette opération \fBioctl\fP(2) renvoie \fB0\fP en cas de succès. En cas d'erreur, \fB\-1\fP est renvoyé et \fIerrno\fP est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles\ : .TP \fBEINVAL\fP Le champ \fIstart\fP ou \fIlen\fP de la structure \fIufdio_range\fP n'était pas un multiple de la taille de la page système\ ; ou bien le champ \fIlen\fP valait zéro\ ; ou ces champs n'étaient pas valables pour d'autres raisons. .TP \fBEINVAL\fP Un tableau incompatible est présent dans la plage d'adresse indiquée. .TP \fBEINVAL\fP .\" Il n'y avait pas de tableau dans la plage d'adresse spécifiée. .SS UFFDIO_COPY (Depuis Linux 4.3). Copier de manière atomique un bloc de mémoire continu dans la plage enregistrée pour le userfault et réveiller éventuellement les threads bloqués. Les adresses source et cible et le nombre d'octets à copier sont indiqués dans les champs \fIsrc\fP, \fIdst\fP et \fIlen\fP de la structure \fIuffdio_copy\fP vers laquelle pointe \fIargp\fP\ : .PP .in +4n .EX struct uffdio_copy { __u64 dst; /* Cible de la copie */ __u64 src; /* Origine de la copie */ __u64 len; /* Nombre d'octets à copier */ __u64 mode; /* Drapeaux contrôlant le comportement de la copie */ __s64 copy; /* Nombre d'octets copiés ou erreurs de refus */ }; .EE .in .PP La valeur suivante peut être liée en bits à \fImode\fP pour modifier le comportement de l'opération \fBUFFDIO_COPY\fP\ : .TP \fBUFFDIO_COPY_MODE_DONTWAKE\fP Ne pas réveiller le thread qui attend la résolution d'une erreur de page .PP .\" FIXME Above: Why is the 'copy' field used to return error values? .\" This should be explained in the manual page. Le champ \fIcopy\fP est utilisé par le noyau pour renvoyer le nombre d'octets copiés ou une erreur (une valeur négative à la façon \fIerrno\fP). Si la valeur renvoyée dans \fIcopy\fP ne correspond pas à celle indiquée dans \fIlen\fP, l'opération échoue avec l'erreur \fBEAGAIN\fP. Le champ \fIcopy\fP n'est fait que pour la sortie\ ; il n'est pas lu par l'opération \fBUFFDIO_COPY\fP. .PP Cette opération \fBioctl\fP(2) renvoie \fB0\fP en cas de succès. Dans ce cas, toute la zone a été copiée. En cas d'erreur, \fB\-1\fP est renvoyé et \fIerrno\fP est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles\ : .TP \fBEAGAIN\fP Le nombre d'octets copiés (à savoir la valeur renvoyée dans le champ \fIcopy\fP) n'est pas la même que celle indiquée dans le champ \fIlen\fP. .TP \fBEINVAL\fP \fIdst\fP ou \fIlen\fP n'était pas un multiple de la taille de la page du système ou la plage indiquée dans \fIsrc\fP et \fIlen\fP ou \fIdst\fP et \fIlen\fP n'était pas valable. .TP \fBEINVAL\fP Un bit non valable a été indiqué dans le champ \fImode\fP. .TP \fBENOENT\fP (depuis Linux\ 4.11) Le processus fautif a modifié sa structure de mémoire virtuelle en même temps qu'une opération \fIUFFDIO_COPY\fP remarquable. .TP \fBENOSPC\fP (de Linux 4.11 à Linux 4.13) Le processus fautif a quitté au moment de l'opération \fIUFFDIO_COPY\fP. .TP \fBESRCH\fP (depuis Linux\ 4.13) .\" Le processus fautif a quitté au moment de l'opération \fIUFFDIO_COPY\fP. .SS UFFDIO_ZEROPAGE (Depuis Linux 4.3). Remplit de zéros une plage mémoire enregistrée avec userfaultfd. .PP La plage demandée est indiquée par le champ \fIrange\fP de la structure \fIuffdio_zeropage\fP vers laquelle pointe \fIargp\fP\ : .PP .in +4n .EX struct uffdio_zeropage { struct uffdio_range range; __u64 mode; /* Drapeaux contrôlant le comportement de la copie */ __s64 zeropage; /* Nombre d'octets remplis de zéros ou d'erreurs de refus */ }; .EE .in .PP La valeur suivante peut être mise en bit et liée dans \fImode\fP pour modifier le comportement de l'opération \fBUFFDIO_ZEROPAGE\fP\ : .TP \fBUFFDIO_ZEROPAGE_MODE_DONTWAKE\fP Ne pas réveiller le thread qui attend la résolution d'une erreur de page. .PP .\" FIXME Why is the 'zeropage' field used to return error values? .\" This should be explained in the manual page. Le champ \fIzeropage\fP est utilisé par le noyau pour renvoyer le nombre d'octets remplis de zéros, ou une erreur de la même manière que \fBUFFDIO_COPY\fP. Si la valeur renvoyée dans le champ \fIzeropage\fP ne correspond pas à celle indiquée dans \fIrange.len\fP, l'opération échoue avec l'erreur \fBEAGAIN\fP. Le champ \fIzeropage\fP ne sert qu'à la sortie\ ; il n'est pas lu par l'opération \fBUFFDIO_ZEROPAGE\fP. .PP L'opération \fBioctl\fP(2) renvoie \fB0\fP en cas de succès. Dans ce cas, toute la zone a été remplie de zéros. En cas d'erreur, \fB\-1\fP est renvoyé et \fIerrno\fP est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles\ : .TP \fBEAGAIN\fP Le nombre d'octets remplis de zéros (c'est\-à\-dire la valeur renvoyée dans le champ \fIzeropage\fP) ne correspond pas à la valeur indiquée dans le champ \fIrange.len\fP. .TP \fBEINVAL\fP \fIrange.start\fP ou \fIrange.len\fP n'était pas un multiple de la taille de la page du système\ ; ou \fIrange.len\fP était de zéro\ ; ou la plage indiquée n'était pas valable. .TP \fBEINVAL\fP Un bit non valable a été indiqué dans le champ \fImode\fP. .TP \fBESRCH\fP (depuis Linux\ 4.13) .\" Le processus fautif a quitté au moment de l'opération \fIUFFDIO_ZEROPAGE\fP. .SS UFFDIO_WAKE (Depuis Linux 4.3). Réveiller le thread qui attend la résolution de l'erreur de page sur une plage d'adresse mémoire indiquée. .PP L'opération \fBUFFDIO_WAKE\fP est utilisée avec les opérations \fBUFFDIO_COPY\fP et \fBUFFDIO_ZEROPAGE\fP, dont le bit \fBUFFDIO_COPY_MODE_DONTWAKE\fP ou \fBUFFDIO_ZEROPAGE_MODE_DONTWAKE\fP est défini dan le champ \fImode\fP. Le moniteur userfault peut effectuer plusieurs opérations \fBUFFDIO_COPY\fP et \fBUFFDIO_ZEROPAGE\fP automatiquement, puis réveiller explicitement le thread fautif en utilisant \fBUFFDIO_WAKE\fP. .PP Le paramètre \fIargp\fP est un pointeur vers une structure \fIuffdio_range\fP (présentée ci\-dessus) qui indique la plage d'adresse. .PP Cette opération \fBioctl\fP(2) renvoie \fB0\fP en cas de succès. En cas d'erreur, \fB\-1\fP est renvoyé et \fIerrno\fP est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles\ : .TP \fBEINVAL\fP Le champ \fIstart\fP ou \fIlen\fP de la structure \fIufdio_range\fP n'était pas un multiple de la taille de la page système\ ; ou \fIlen\fP était zéro\ ; ou la plage indiquée n'était pas valable pour une autre raison. .SH "VALEUR RENVOYÉE" Voir les descriptions des opérations individuelles ci\-dessus. .SH ERREURS Voir les descriptions des opérations individuelles ci\-dessus. En outre, les erreurs générales suivantes peuvent se produire pour toutes les opérations décrites ci\-dessus\ : .TP \fBEFAULT\fP \fIargp\fP pointe vers une adresse illégale. .TP \fBEINVAL\fP (Pour toutes les opérations, sauf \fBUFFDIO_API\fP). L'objet userfaultfd n'a pas encore été activé (avec l'opération \fBUFFDIO_API\fP). .SH CONFORMITÉ Ces opérations \fBioctl\fP(2) sont spécifiques à Linux. .SH BOGUES Afin de détecter les fonctionnalités userfault disponibles et d'activer des sous\-parties de celles\-ci, le descripteur de fichier userfaultfd doit être fermé après la première opération \fBUFFDIO_API\fP qui recherche la disponibilité des fonctionnalités, puis réouvert avant la deuxième opération \fBUFFDIO_API\fP qui active les fonctionnalités désirées. .SH EXEMPLES Voir \fBuserfaultfd\fP(2). .SH "VOIR AUSSI" \fBioctl\fP(2), \fBmmap\fP(2), \fBuserfaultfd\fP(2) .PP \fIDocumentation/admin\-guide/mm/userfaultfd.rst\fP dans l'arborescence des sources du noyau Linux .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 .