GNU/Linux >> Tutoriels Linux >  >> Linux

Qu'est-ce qu'une page mappée en mémoire et une page anonyme ?

Les termes corrects sont fichiers mappés en mémoire et des cartographies anonymes. Lorsqu'on se réfère au mappage de la mémoire, on se réfère généralement à mmap(2). Il existe 2 catégories d'utilisation de mmap. Une catégorie est les mappages PARTAGÉS vs PRIVÉS. L'autre catégorie est les mappages FILE vs ANONYMOUS. Mélangés ensemble vous obtenez les 4 combinaisons suivantes :

  1. MAPPAGE DE FICHIERS PRIVÉS
  2. MAPPAGE DES FICHIERS PARTAGÉS
  3. CARTOGRAPHIE PRIVÉE ANONYME
  4. MAPPAGE ANONYME PARTAGÉ

Un mappage de fichier spécifie un fichier, sur disque, qui aura N de nombreux octets mappés en mémoire. La fonction mmap(2) prend comme 4ème argument un descripteur de fichier vers le fichier à mapper en mémoire. Le 5ème argument est le nombre d'octets à lire, sous forme de décalage. Le processus typique d'utilisation de mmap pour créer un fichier mappé en mémoire va

  1. open(2) file pour obtenir un descripteur de fichier.
  2. fstat(2) le fichier pour obtenir la taille à partir de la structure de données du descripteur de fichier.
  3. mmap(2) le fichier en utilisant le descripteur de fichier renvoyé par open(2).
  4. fermer(2) le descripteur de fichier.
  5. faire n'importe quoi avec le fichier mappé en mémoire.

Lorsqu'un fichier est mappé en tant que PRIVATE, les modifications apportées ne sont pas validées dans le fichier sous-jacent. Il s'agit d'une copie PRIVÉE en mémoire du fichier. Lorsqu'un fichier est mappé SHARED, les modifications apportées sont automatiquement validées dans le fichier sous-jacent par le noyau. Les fichiers mappés comme partagés peuvent être utilisés pour ce qu'on appelle les E/S mappées en mémoire et IPC. Vous utiliseriez un fichier mappé en mémoire pour IPC au lieu d'un segment de mémoire partagée si vous avez besoin de la persistance du fichier

Si vous utilisez strace(1) pour observer l'initialisation d'un processus, vous remarquerez que les différentes sections du fichier sont mappées en utilisant mmap(2) comme mappages de fichiers privés. Il en va de même pour les bibliothèques système.

Exemples de sortie de strace(1) où mmap(2) est utilisé pour mapper les bibliothèques au processus.

open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42238, ...}) = 0
mmap(NULL, 42238, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff7ca71e000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY)      = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\356\341n8\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1926760, ...}) = 0
mmap(0x386ee00000, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x386ee00000

Les mappages anonymes ne sont pas soutenus par un fichier. Pour être précis, le 4e (descripteur de fichier) et le 5e (décalage) arguments de mmap(2) ne sont même pas utilisés lorsque le drapeau MAP_ANONYMOUS est utilisé comme 3e argument de mmap(2). Une alternative à l'utilisation de l'indicateur MAP_ANONYMOUS consiste à utiliser /dev/zero comme fichier.

Le mot "Anonyme" est, pour moi, un mauvais choix dans la mesure où il sonne comme si le fichier était mappé de manière anonyme. Au lieu de cela, c'est le fichier qui est anonyme, c'est-à-dire. il n'y a pas de fichier spécifié.

Les utilisations des cartographies anonymes privées sont peu nombreuses dans la programmation des terres d'utilisateurs. Vous pouvez utiliser un mappage anonyme partagé afin que les applications puissent partager une région de mémoire, mais je ne sais pas pourquoi vous n'utiliseriez pas la mémoire partagée SYSV ou POSIX à la place.

Étant donné que la mémoire mappée à l'aide de mappages anonymes est garantie d'être remplie de zéros, il pourrait être utile pour certaines applications qui attendent/nécessitent des régions de mémoire remplies de zéros d'utiliser mmap(2) de cette manière au lieu de malloc(2) + memset(2 ) combo.


Si je comprends bien, les pages anonymes sont ainsi nommées, car elles n'ont pas de source de système de fichiers nommée, tandis que les pages mappées sont un mappage de fichier concret. Par exemple, vous pouvez obtenir des pages anonymes en utilisant une simple opération malloc dans n'importe quel processus de l'espace utilisateur...

À propos des structures du noyau :Évidemment, il s'agit de la page de structure , mais dans le cas des pages anonymes, vous aurez struct anon_vma assis dans page->mapping, et dans le cas de pages mappées - struct address_space , qui est connecté avec un inode concret.


Linux
  1. Qu'est-ce que NFS et comment l'installer sous Linux

  2. Linux - Qu'est-ce que la mémoire élevée et la mémoire faible sous Linux ?

  3. A quoi servent les inodes ?

  4. Que sont les liens symboliques (Soft Links) et comment les créer sous Linux

  5. Que sont les fichiers fragmentés sous Linux

Qu'est-ce qu'Intel SGX et quels en sont les avantages ?

Commande de fichier Linux :que fait-elle et comment l'utiliser

Qu'est-ce que ZFS ? Pourquoi les gens en sont-ils fous ?

Qu'est-ce qu'un hyperviseur et quels sont ses types

Que sont les inodes sous Linux ?

Qu'est-ce que la mémoire haute et la mémoire basse sous Linux ?