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 ne nécessite pas que le noyau crée
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 arguments
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.
L'argument
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.
L'argument
prot
doit être spécifié à 0.
Le paramètre
flags
a la même signification que pour
mmap(2),
mais tous les attributs autre que
MAP_NONBLOCK
sont ignorés.