Recommandé : "Tutoriel vidéo Linux"
Lorsque le code ou le thread du module du noyau accède à la mémoire, les adresses mémoire dans le code sont toutes des adresses logiques, et pour correspondre à la adresse mémoire physique réelle, l'adresse doit être un à un Mappage, par exemple, l'adresse physique correspondant à l'adresse logique 0xc0000003 est 0×3, l'adresse physique correspondant à 0xc0000004 est 0×4,... , la relation entre l'adresse logique et l'adresse physique est
Adresse physique = Adresse logique – 0xC0000000 : Il s'agit de la relation de traduction d'adresse de l'espace d'adressage du noyau. Notez que l'adresse virtuelle du noyau est au "haut de gamme". ", mais l'adresse mémoire physique mappée par ta se trouve à l'extrémité inférieure.Adresse logique
|
Adresse mémoire physique | ||||||||||||||||||
0xc0000000 | 0×0 | ||||||||||||||||||
0xc0000001 | 0×1 | ||||||||||||||||||
0xc0000002 | 0×2 | ||||||||||||||||||
0xc0000003 | 0×3 | ||||||||||||||||||
… | … | ||||||||||||||||||
0xe0000000 | 0×20000000 | ||||||||||||||||||
… | … | ||||||||||||||||||
0xffffffff | 0×40000000 ?? |
|
Adresse mémoire physique | ||||||||||||
0xF8700000 td> | 0×80000000 | ||||||||||||
0xF8700001 | 0×80000001 | ||||||||||||
0xF8700002 | 0×80000002 | ||||||||||||
… | … | ||||||||||||
0xF87FFFFF | 0x800FFFFF | tr>
Une fois que le noyau a accédé à la mémoire physique 0×80000000 ~ 0x800FFFFF, il libère l'espace linéaire du noyau 0xF8700000 ~ 0xF87FFFFF. De cette manière, d'autres processus ou codes peuvent également utiliser l'adresse 0xF8700000 ~ 0xF87FFFFF pour accéder à une autre mémoire physique.
D'après la description ci-dessus, nous pouvons connaître l'idée la plus basique de la mémoire haut de gamme : emprunter une section d'espace d'adressage, établir un mappage d'adresses temporaire, la libérer après utilisation, et cet espace d'adressage peut être recyclé, accéder à toute la mémoire physique.
En voyant cela, certaines personnes ne peuvent s'empêcher de se demander : que se passe-t-il si un processus ou un module du noyau continue d'occuper un certain espace d'adressage logique et ne le libère pas ? Si cette situation se produit réellement, l'espace d'adressage mémoire haut de gamme du noyau deviendra de plus en plus restreint s'il est occupé et non libéré, il ne sera pas accessible même s'il n'est pas mappé sur la mémoire physique.
Le noyau divise la mémoire haut de gamme en 3 parties : VMALLOC_START~VMALLOC_END, KMAP_BASE~FIXADDR_START et FIXADDR_START~4G.
Pour une mémoire haut de gamme, vous pouvez obtenir la page correspondante via alloc_page() ou d'autres fonctions, mais si vous souhaitez accéder à la mémoire physique réelle, vous il faut convertir la page en linéaire L'adresse fera l'affaire (pourquoi ? Pensez à la façon dont la MMU accède à la mémoire physique). C'est-à-dire que nous devons trouver un espace linéaire pour la page correspondant à la mémoire haut de gamme. appelé mappage de mémoire haut de gamme.
correspond aux trois parties de la mémoire haut de gamme. Il existe trois façons de mapper la mémoire haut de gamme :
est mappé à « l'espace de mappage dynamique du noyau » (allocation de mémoire non contiguë) Cette méthode est très simple, car grâce à vmalloc(), lors de la demande de mémoire dans "l'espace de mappage dynamique du noyau", il est possible d'obtenir des pages à partir de la mémoire haut de gamme (voir l'implémentation de vmalloc), donc il Il est possible que la mémoire haut de gamme soit mappée sur « l'espace de mappage dynamique du noyau ».
Mappage permanent du noyau Si la page correspondant à la mémoire haut de gamme est obtenue via alloc_page(), comment lui trouver un espace linéaire ?
Le noyau réserve spécialement pour cela un espace linéaire, de PKMAP_BASE à FIXADDR_START, pour mapper la mémoire haut de gamme. Sur le noyau 2.6, cette plage d'adresses est comprise entre 4G-8M et 4G-4M. Cet espace est appelé « Espace de mappage permanent du noyau » ou « Espace de mappage permanent du noyau ». Cet espace utilise la même table de répertoire de pages que les autres espaces. Pour le noyau, il s'agit de swapper_pg_dir. Pour les processus ordinaires, il est pointé par le registre CR3. Normalement, cet espace a une taille de 4 Mo, donc une seule table de pages est nécessaire. Le noyau recherche cette table de pages via pkmap_page_table. Grâce à kmap(), une page peut être mappée sur cet espace. Étant donné que cet espace fait 4 Mo, jusqu'à 1 024 pages peuvent être mappées en même temps. Par conséquent, les pages inutilisées doivent être libérées de cet espace en temps opportun (c'est-à-dire que la relation de mappage est libérée via kunmap(), l'adresse linéaire correspondant à une page peut être libérée de cet espace).
Mappage temporaire du noyau Le noyau réserve un espace linéaire entre FIXADDR_START et FIXADDR_TOP pour des besoins particuliers. Cet espace est appelé « espace de mappage fixe ». Dans cet espace, une partie est utilisée pour le mappage temporaire de la mémoire haut de gamme.
(1) Chaque CPU occupe un espace
(2) L'espace occupé par chaque CPU est divisé en plusieurs petits espaces La taille de chaque petit espace est. 1 page, et chaque petit espace est utilisé dans un but précis. Ces objectifs sont définis dans km_type dans kmap_types.h.
1. L'espace utilisateur (processus) a-t-il un concept de mémoire haut de gamme ?
Les processus utilisateur n'ont aucune notion de mémoire haut de gamme. La mémoire élevée n'existe que dans l'espace du noyau. Les processus utilisateur ne peuvent accéder qu'à 3 Go de mémoire physique, tandis que les processus du noyau peuvent accéder à toute la mémoire physique.2. Y a-t-il de la mémoire haut de gamme dans le noyau 64 bits ?
Dans la réalité actuelle, la mémoire haut de gamme n'existe pas dans le noyau Linux 64 bits car le noyau 64 bits peut prendre en charge plus de 512 Go de mémoire. Si la mémoire physique installée sur la machine dépasse l'espace d'adressage du noyau, il y aura une mémoire haut de gamme.3. À quelle quantité de mémoire physique un processus utilisateur peut-il accéder ? À quelle quantité de mémoire physique le code du noyau peut-il accéder ?
Les processus utilisateur du système 32 bits peuvent accéder jusqu'à 3 Go et le code du noyau peut accéder à toute la mémoire physique. Les processus utilisateur du système 64 bits peuvent accéder à un maximum de plus de 512 Go, et le code du noyau peut accéder à toute la mémoire physique.4. Quelle est la relation entre la mémoire haut de gamme et l'adresse physique, l'adresse logique et l'adresse linéaire ?
La mémoire haut de gamme est uniquement liée aux adresses logiques et n'a aucune relation directe avec les adresses logiques et les adresses physiques.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!