GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué son la página mapeada en memoria y la página anónima?

Los términos correctos son archivos mapeados en memoria y mapeos anónimos. Cuando se hace referencia al mapeo de memoria, generalmente se hace referencia a mmap(2). Hay 2 categorías para usar mmap. Una categoría es mapeos COMPARTIDOS vs PRIVADOS. La otra categoría es el mapeo de ARCHIVO vs ANÓNIMO. Mezclados se obtienen las 4 combinaciones siguientes:

  1. ASIGNACIÓN DE ARCHIVOS PRIVADOS
  2. ASIGNACIÓN DE ARCHIVOS COMPARTIDOS
  3. MAPEO PRIVADO ANÓNIMO
  4. ASIGNACIÓN ANÓNIMA COMPARTIDA

Una asignación de archivos especifica un archivo, en el disco, que tendrá N muchos bytes asignados a la memoria. La función mmap(2) toma, como cuarto argumento, un descriptor de archivo para el archivo que se va a mapear en la memoria. El quinto argumento es el número de bytes que se leerán, como compensación. El proceso típico de usar mmap para crear un archivo mapeado en memoria es

  1. abrir(2) archivo para obtener un descriptor de archivo.
  2. fstat(2) el archivo para obtener el tamaño de la estructura de datos del descriptor del archivo.
  3. mmap(2) el archivo usando el descriptor de archivo devuelto por open(2).
  4. cierre(2) el descriptor de archivo.
  5. hacer lo que sea con el archivo mapeado en memoria.

Cuando un archivo se asigna como PRIVADO, los cambios realizados no se confirman en el archivo subyacente. Es una copia PRIVADA en memoria del archivo. Cuando un archivo se asigna COMPARTIDO, los cambios realizados se confirman automáticamente en el archivo subyacente por el kernel. Los archivos asignados como compartidos se pueden usar para lo que se denomina E/S asignada de memoria e IPC. Usaría un archivo asignado a la memoria para IPC en lugar de un segmento de memoria compartida si necesita la persistencia del archivo

Si usa strace(1) para ver cómo se inicializa un proceso, notará que las diferentes secciones del archivo se asignan al usar mmap(2) como asignaciones de archivos privados. Lo mismo es cierto para las bibliotecas del sistema.

Ejemplos de salida de strace(1) donde mmap(2) se usa para mapear bibliotecas al proceso.

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

Las asignaciones anónimas no están respaldadas por un archivo. Para ser específicos, el cuarto argumento (descriptor de archivo) y el quinto (desplazamiento) de mmap(2) ni siquiera se usan cuando el indicador MAP_ANONYMOUS se usa como el tercer argumento de mmap(2). Una alternativa al uso del indicador MAP_ANONYMOUS es usar /dev/zero como archivo.

La palabra 'Anónimo' es, para mí, una mala elección porque suena como si el archivo estuviera mapeado de forma anónima. En cambio, es el archivo el que es anónimo, es decir. no hay un archivo especificado.

Los usos de mapeos anónimos privados son pocos en la programación de terrenos de usuarios. Podría usar una asignación anónima compartida para que las aplicaciones pudieran compartir una región de memoria, pero no sé la razón por la que no usaría la memoria compartida SYSV o POSIX en su lugar.

Dado que se garantiza que la memoria mapeada al usar asignaciones anónimas se completará con ceros, podría ser útil para algunas aplicaciones que esperan/requieren regiones de memoria llenas con ceros para usar mmap(2) de esta manera en lugar de malloc(2) + memset(2 ) combinación.


Según tengo entendido, las páginas anónimas se llaman así porque no tienen una fuente de sistema de archivos con nombre, mientras que las páginas asignadas son una asignación de un archivo concreto. Por ejemplo, puede obtener páginas anónimas usando una simple operación malloc en cualquier proceso de espacio de usuario...

Acerca de las estructuras del núcleo:obviamente es página de estructura , pero en el caso de las páginas de anonymos tendrás struct anon_vma sentado en página->mapeo, y en el caso de páginas mapeadas - struct address_space , que está conectado con el inodo concreto.


Linux
  1. Qué es NFS y cómo instalarlo en Linux

  2. Qué son los Enlaces Simbólicos (Soft Links) y cómo crearlos bajo Linux

  3. ¿Qué son los archivos dispersos en Linux?

  4. ¿Cuál es la diferencia entre escribir en un archivo y una memoria mapeada?

  5. ¿Qué son vdso y vsyscall?

¿Qué es Intel SGX y cuáles son los beneficios?

Comando de archivo de Linux:qué hace y cómo usarlo

¿Qué es ZFS? ¿Por qué la gente está loca por eso?

¿Qué es el hipervisor y cuáles son sus tipos?

¿Qué son los inodos en Linux?

¿Qué son la memoria alta y la memoria baja en Linux?