Tamaño de memoria para la operación mmap del kernel

9

Estoy interesado en la forma en que los archivos mmaps de Linux se almacenan en la memoria principal (en mi contexto es para ejecutar, pero supongo que el proceso de mmap es el mismo para escribir y leer también) y qué tamaño usa.

Así que sé que Linux usa paginación con un tamaño de página generalmente de 4kB (¿en qué parte del núcleo puedo encontrar este tamaño?). Pero, ¿qué significa esto exactamente para la memoria asignada: suponga que tiene un binario de unos pocos miles de bytes, digamos 5812B y lo ejecuta. ¿Qué sucede en el núcleo: asigna 2 * 4kB y luego copia el 5812B en este espacio, desperdiciando> 3KB de memoria principal en la segunda página?

Sería genial si alguien supiera el archivo en la fuente del núcleo donde se define el tamaño de página.

Mi segunda pregunta también es muy simple, supongo: asumí 5812B como tamaño de archivo. ¿Es correcto que este tamaño simplemente se tome del inodo?

Rui F Ribeiro
fuente

Respuestas:

6

No existe una relación directa entre el tamaño del ejecutable y el tamaño en la memoria. Aquí hay una descripción muy rápida de lo que sucede cuando se ejecuta un binario:

  1. El núcleo analiza el archivo y lo divide en sección. Algunas secciones se cargan directamente en la memoria, en páginas separadas. Algunas secciones no están cargadas (por ejemplo, símbolos de depuración).
  2. Si el ejecutable está vinculado dinámicamente, el núcleo llama al cargador dinámico, carga las bibliotecas compartidas requeridas y realiza la edición de enlaces según sea necesario.
  3. El programa comienza a ejecutar su código y, por lo general, solicitará más memoria para almacenar datos.

Para obtener más información sobre formatos ejecutables, enlaces y carga de archivos ejecutables, puede leer Linkers and Loaders de John R. Levine .

En un ejecutable de 5kB, es probable que todo sea código o datos que deben cargarse en la memoria, excepto el encabezado. El código ejecutable será al menos una página, quizás dos, y luego habrá al menos una página para la pila, probablemente una página o para el montón (otros datos), más la memoria utilizada por las bibliotecas compartidas.

En Linux, puede inspeccionar las asignaciones de memoria para un ejecutable con cat /proc/$pid/maps. El formato está documentado en la proc(5)página del manual; vea también Comprensión de Linux / proc / id / maps .

Gilles 'SO- deja de ser malvado'
fuente
0

Sí: eventualmente obtienes dos páginas de 4k. Los datos se cargan a pedido, por lo que si nada se refiere a la segunda página, nunca se cargará en la memoria.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

No cambie estos valores y espere que algo funcione.

Sí, el tamaño del archivo se almacena en el inodo en ext2 / 3.

pjc50
fuente
0

Para la parte de definición, en un kernel 2.6.38 ~ ish para la arquitectura Intel:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFT determina el tamaño de página * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

Frederik Deweerdt
fuente