remap_file_pages - Créer une projection non linéaire d'un fichier
Bibliothèque C standard (
libc,
-lc)
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sys/mman.h>
[[obsolète]] int remap_file_pages(void addr[.size], size_t size,
int prot, size_t pgoff, int flags);
Note : cet appel système a été indiqué
comme obsolète à partir de Linux 3.16. Dans Linux 4.0,
l'implémentation a été remplacée par une
émulation plus lente dans le noyau. Le peu d'applications qui utilisent
cet appel système devraient envisager de passer à des
alternatives. Ce changement a eu lieu, car le code du noyau de cet appel
système était complexe et, semble-t-il, peu utilisé voire
inusité. S'il avait quelques cas d'utilisation dans des applications de
base de données sur des systèmes 32 bits, ces cas
n'existent plus sur des systèmes 64 bits.
L'appel système
remap_file_pages() est utilisé pour
créer une projection non linéaire, c'est-à-dire une
projection dans laquelle les pages du fichier sont projetées en
mémoire dans un ordre non séquentiel. L'avantage d'utiliser
remap_file_pages() au lieu de faire des appels
répétés à
mmap(2) est que la
première approche n'impose pas au noyau de créer des structures
de données VMA (Virtual Memory Area : zone mémoire
virtuelle) supplémentaires.
Pour créer une projection non linéaire, nous allons effectuer les
étapes suivantes :
- 1.
- Utiliser mmap(2) pour créer une projection
(qui est initialement linéaire). Cette projection doit être
créée avec l'attribut MAP_SHARED.
- 2.
- Utiliser un ou plusieurs appels à
remap_file_pages() pour réorganiser la correspondance entre
les pages de la projection et les pages du fichier. Il est possible
d'accéder à la même page d'un fichier dans plusieurs
endroits de la région projetée.
Les paramètres
pgoff et
size spécifient la
région du fichier à reloger dans la projection :
pgoff est un décalage de fichier (Ndt : file offset) dans
l'unité de taille de page du système ;
size est la
longueur de la région en octets.
Le paramètre
addr sert à deux choses. Tout d'abord, il
identifie la projection des pages que l'on souhaite réorganiser. Ainsi,
addr doit être une adresse tombant dans une région
précédemment projetée par un appel à
mmap(2). Ensuite,
addr spécifie l'adresse à
laquelle les pages du fichier identifiées par
pgoff et
size seront placées.
Les valeurs spécifiées dans
addr et
size doivent
être des multiples de la taille de page système. Si elles ne le
sont pas, le noyau arrondit
par défaut les
deux valeurs
au multiple de taille de page le plus proche.
Le paramètre
prot doit être spécifié à
0.
Le paramètre
flags a la même signification que pour
mmap(2), mais tous les attributs autres que
MAP_NONBLOCK sont
ignorés.
S'il réussit,
remap_file_pages() renvoie
0. S'il
échoue,
-1 est renvoyé et
errno est
positionné pour indiquer l'erreur.
- EINVAL
-
addr ne fait pas référence à
une projection valide créée avec l'attribut
MAP_SHARED.
- EINVAL
-
addr, size, prot ou pgoff n'est
pas valable.
L'appel système
remap_file_pages() est apparu dans Linux
2.5.46 ; la prise en charge de la glibc a été
ajouté dans la glibc 2.3.3.
L'appel système
remap_file_pages() est spécifique à
Linux.
Depuis Linux 2.6.23,
remap_file_pages() ne crée des
projections non linéaires que sur les systèmes de fichiers en
mémoire comme
tmpfs(5), hugetlbfs ou ramfs. Sur les
systèmes de fichiers avec cache,
remap_file_pages() n’est
pas beaucoup plus efficace que
mmap(2) pour ajuster les parties du
fichier associées à leur adresse.
getpagesize(2),
mmap(2),
mmap2(2),
mprotect(2),
mremap(2),
msync(2)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Philippe MENGUAL <
[email protected]>
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 à
[email protected]