Plage d’adresses de l’espace d’adressage virtuel de processus Linux

Je suis sur une machine 32bit. D’après ce que j’ai compris, l’adresse de l’espace utilisateur va de 0x00000000 à 0xbfffffff et celle du kernel de 0xc0000000 à 0xffffffff .

Mais lorsque j’ai utilisé pmap pour voir l’allocation de mémoire d’un processus, je constate que les bibliothèques sont chargées dans environ 0xf7777777 . Veuillez vous référer à la capture d’écran ci-jointe. Est-ce que cela signifie que ces bibliothèques sont chargées dans l’espace kernel? Et quand j’ai utilisé mmap() , j’ai reçu l’adresse de 0xe0000000 . Alors, mmap() a de la mémoire de l’espace kernel?

entrez la description de l'image ici

Je suis sur une machine 32bit. D’après ce que j’ai compris, l’adresse de l’espace utilisateur va de 0x00000000 à 0xbfffffff et celle du kernel de 0xc0000000 à 0xffffffff.

Pas exactement. L’espace mémoire du kernel commence à 0xC0000000 , mais il n’est pas obligé de remplir tout le Go. En fait, il se remplit jusqu’à l’adresse virtuelle 0xF7FFFFFF . Cela couvre 896MB de mémoire physique. Les adresses virtuelles 0xF8000000 et suivantes sont utilisées comme fenêtre de 128MB pour que le kernel mappe toute région de la mémoire physique au-delà de la limite de 896MB

Tous les processus utilisateur partagent le même mappage de mémoire pour les adresses virtuelles 0xC0000000 et au-delà. Par conséquent, si le kernel n’utilise pas l’intégralité de son Go d’espace virtuel, il peut en réutiliser une partie pour mapper des bibliothèques partagées couramment utilisées afin que chaque processus puisse les voir.