Tout d'abord, un système 32 bits a 0xffffffff
( 4'294'967'295
) des adresses linéaires pour accéder à un emplacement physique sur la RAM.
Le noyau divise ces adresses en espace utilisateur et espace noyau.
L'espace utilisateur (mémoire élevée) est accessible par l'utilisateur et, si nécessaire, également par le noyau.
La plage d'adresses en notation hexadécimale et décimale:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
L'espace du noyau (mémoire faible) n'est accessible qu'au noyau.
La plage d'adresses en notation hexadécimale et décimale:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Comme ça:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Ainsi, la disposition de la mémoire que vous avez vue dmesg
correspond au mappage des adresses linéaires dans l'espace du noyau.
Premièrement, les séquences .text, .data et .init qui fournissent l'initialisation des propres tables de pages du noyau (traduisent linéairement en adresses physiques).
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
La plage où réside le code du noyau.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
Plage où résident les segments de données du noyau.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
Plage dans laquelle résident les tables de pages initiales du noyau.
(et 128 Ko supplémentaires pour certaines structures de données dynamiques.)
Cet espace d'adressage minimal est juste assez grand pour installer le noyau dans la RAM et initialiser ses structures de données principales.
Leur taille utilisée est indiquée entre parenthèses, prenez par exemple le code du noyau:
0xc071ae6a - 0xc0400000 = 31AE6A
En notation décimale, c'est 3'255'914
(3179 kB).
Deuxièmement, l'utilisation de l'espace du noyau après l'initialisation
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
La plage lowmem peut être utilisée par le noyau pour accéder directement aux adresses physiques.
Ce n'est pas le 1 Go complet, car le noyau nécessite toujours au moins 128 Mo d'adresses linéaires pour implémenter l'allocation de mémoire non contiguë et les adresses linéaires mappées.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
L'allocation de mémoire virtuelle peut allouer des cadres de page sur la base d'un schéma non contigu. Le principal avantage de ce schéma est d'éviter la fragmentation externe, il est utilisé pour les zones d'échange, les modules du noyau ou l'allocation de tampons à certains périphériques d'E / S.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Le mappage permanent du noyau permet au noyau d'établir des mappages durables de cadres de page à haute mémoire dans l'espace d'adressage du noyau. Lorsqu'une page HIGHMEM est mappée à l'aide de kmap (), des adresses virtuelles sont attribuées à partir d'ici.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Ce sont des adresses linéaires à mappage fixe qui peuvent faire référence à n'importe quelle adresse physique dans la RAM, et pas seulement au dernier 1 Go comme les adresses lowmem. Les adresses linéaires à mappage fixe sont un peu plus efficaces que leurs collègues lowmem et pkmap. Des descripteurs de table de pages dédiés sont affectés au mappage fixe, et les mappages de pages HIGHMEM utilisant kmap_atomic sont alloués à partir d'ici.
Si vous voulez plonger plus profondément dans le terrier du lapin:
Comprendre le noyau Linux