2016-03-06 2 views
0

Il s'agit en fait d'une question théorique sur la gestion de la mémoire. Puisque différents systèmes d'exploitation implémentent les choses différemment, je vais devoir soulager ma soif de savoir en demandant comment les choses fonctionnent dans une seule d'entre elles :(De préférence l'open source et largement utilisé: LinuxQue se passe-t-il dans le noyau lorsque le processus accède à une adresse juste allouée avec brk/sbrk?

Voici la liste des choses Je sais que dans le puzzle entier:

  • malloc() est l'espace utilisateur libc est responsable du travail syscall (appel brk/sbrk/mmap ...) Il parvient à obtenir de gros morceaux de mémoire, décrits par des plages de.. adresses virtuelles La bibliothèque découpe ces fragments et parvient à répondre aux demandes de l'application utilisateur
  • Je sais ce que font brk/sbrk syscalls. Je sais ce que signifie "pause programme". Ces appels poussent essentiellement le décalage de la pause du programme. Et c'est ainsi que libc obtient ses morceaux de mémoire virtuelle.
  • Maintenant que cette application utilisateur a une nouvelle adresse virtuelle à manipuler, elle lui écrit simplement une certaine valeur. J'aime: *allocated_integer = 5;. D'accord. Maintenant quoi? Si brk/sbrk ne met à jour les décalages dans l'entrée du processus dans la table de processus, ou que ce soit, comment la mémoire physique est réellement allouée?
  • Je connais la mémoire virtuelle, les tableaux de pages, les fautes de page, etc. Mais je veux savoir exactement comment ces choses sont liées à cette situation que j'ai décrite. Par exemple: la table de page du processus est-elle modifiée? Comment? Quand? Une erreur de page se produit? Quand? Pourquoi? Dans quel but? Quand cet 'algorithme de parrainage' est-il appelé, et cette structure de données free_area est-elle accessible? (http://www.tldp.org/LDP/tlk/mm/memory.html, section 3.4.1 page Allocation)
+0

La table de pages est modifiée dans syskall 'sbrk/brk', ce qui permet à l'utilisateur d'accéder légalement à la mémoire (sans faute de segmentation). Mais le cadre de page physique est alloué lorsque la défaillance de la page se produit pour des considérations de performance. –

+0

Ainsi, lorsque vous créez/fusionnez des VMA, vous créez réellement des PTE? Je cherche le code source pour cette partie, mais je ne peux pas trouver le moment où les PTE sont créés ... – matheuscscp

+0

voir ma réponse, 'brk' ne change pas la table de la page. vérifier [link1] (https://github.com/torvalds/linux/blob/67944024c1cdd897e49a09b0d6af3ea38d1388ca/mm/mmap.c#L2739), [lien2] (https://github.com/torvalds/linux/blob/67944024c1cdd897e49a09b0d6af3ea38d1388ca/ mm/mmap.C# L1058) et [link3] (https://github.com/torvalds/linux/blob/67944024c1cdd897e49a09b0d6af3ea38d1388ca/mm/mmap.c#L686) – matheuscscp

Répondre

1

Eh bien, après avoir enfin trouvé un excellent guide (http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory/) et quelques heures de creuser le noyau Linux, je l'ai trouvé les réponses ...

  • En effet, brk ne fait que pousser la zone de mémoire virtuelle.
  • Lorsque l'application utilisateur atteint *allocated_integer = 5;, une erreur de page se produit.
  • Le page fault routine va search pour la zone de mémoire virtuelle responsable de l'adresse, puis call le gestionnaire de table de page.
  • Le page table handler passe par chaque niveau (2 niveaux en x86 et 4 niveaux en x86_64), l'allocation des entrées si elles ne sont pas présents (2nd, 3rd et 4th), puis enfin calls le vrai gestionnaire.
  • Le real handlereffectivementcalls le function responsable de l'allocation des cadres de page.