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 (appelbrk
/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? Sibrk
/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)
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. –
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
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