Taille de la mémoire pour le fonctionnement mmap du noyau

9

Je suis intéressé par la façon dont les fichiers mmaps Linux dans la mémoire principale (dans mon contexte, c'est pour l'exécution, mais je suppose que le processus mmap est le même pour l'écriture et la lecture) et la taille qu'il utilise.

Donc, je sais que Linux utilise la pagination avec généralement une taille de page de 4 Ko (où dans le noyau puis-je trouver cette taille?). Mais qu'est-ce que cela signifie exactement pour la mémoire allouée: Supposons que vous ayez un binaire de quelques milliers d'octets, disons simplement 5812B et exécutez-le. Que se passe-t-il dans le noyau: alloue-t-il 2 * 4 Ko, puis copie-t-il le 5812B dans cet espace, gaspillant> 3 Ko de mémoire principale sur la 2ème page?

Ce serait formidable si quelqu'un connaissait le fichier dans la source du noyau où la taille de page est définie.

Ma deuxième question est également très simple, je suppose: j'ai supposé 5812B comme taille de fichier. Est-il vrai que cette taille est simplement prise à partir de l'inode?

Rui F Ribeiro
la source

Réponses:

6

Il n'y a pas de relation directe entre la taille de l'exécutable et la taille en mémoire. Voici un aperçu très rapide de ce qui se passe lorsqu'un binaire est exécuté:

  1. Le noyau analyse le fichier et le divise en section. Certaines sections sont directement chargées en mémoire, dans des pages distinctes. Certaines sections ne sont pas du tout chargées (par exemple les symboles de débogage).
  2. Si l'exécutable est lié dynamiquement, le noyau appelle le chargeur dynamique, et il charge les bibliothèques partagées requises et effectue l'édition des liens selon les besoins.
  3. Le programme commence à exécuter son code, et généralement il demandera plus de mémoire pour stocker les données.

Pour plus d'informations sur les formats exécutables, la liaison et le chargement d'exécutables, vous pouvez lire Linkers and Loaders par John R. Levine .

Dans un exécutable de 5 Ko, il est probable que tout soit du code ou des données qui doivent être chargés en mémoire, à l'exception de l'en-tête. Le code exécutable sera d'au moins une page, peut-être deux, puis il y aura au moins une page pour la pile, probablement une page ou pour le tas (autres données), plus la mémoire utilisée par les bibliothèques partagées.

Sous Linux, vous pouvez inspecter les mappages de mémoire pour un exécutable avec cat /proc/$pid/maps. Le format est documenté dans la proc(5)page de manuel; voir aussi Comprendre Linux / proc / id / maps .

Gilles 'SO- arrête d'être méchant'
la source
0

Oui: vous obtenez finalement deux pages 4k. Les données sont chargées à la demande, donc si rien ne fait référence à la deuxième page, elles ne seront jamais chargées en mémoire.

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

Ne modifiez pas ces valeurs et attendez-vous à ce que tout fonctionne.

Oui, la taille du fichier est stockée dans l'inode dans ext2 / 3.

pjc50
la source
0

Pour la partie définition, sur un noyau 2.6.38 ~ ish pour l'architecture Intel:

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

/ * PAGE_SHIFT détermine la taille de la page * /

#define PAGE_SHIFT 12

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

Frederik Deweerdt
la source