Qu'implique la disposition de la mémoire du noyau virtuel dans dmesg?

19

En parcourant la "Sortie de dmesg", j'ai pu voir une liste de valeurs que je ne suis pas en mesure de comprendre correctement.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
    pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
    vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
    lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
      .init : 0xc0906000 - 0xc0973000   ( 436 kB)
      .data : 0xc071ae6a - 0xc08feb78   (1935 kB)
      .text : 0xc0400000 - 0xc071ae6a   (3179 kB)

D'après les valeurs, je comprends que j'ai 2 Go de RAM (mémoire physique). Mais le reste des choses semble être des numéros magiques pour moi.

Je voudrais en savoir plus sur chacun (fixmap, pkmap, .. etc.) en bref (en cas de doute, je posterai chacun comme question séparée)?

Quelqu'un pourrait-il m'expliquer cela?

Sen
la source

Réponses:

22

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 dmesgcorrespond 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

remuer
la source
Merci pour cette excellente réponse. Je voudrais savoir pourquoi la faible mémoire n'est pas pleine 1 Go et plus sur la partie suivante de la phrase "parce que 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."
Sen
Le noyau doit accéder de temps en temps à du code à haute mémoire (par exemple, les informations du BIOS et de l'ACPI résident sur le premier Mo de la RAM), il ne peut pas le faire directement (comme la zone lowmem), il doit donc mapper une mémoire faible à adresses linéaires à haute mémoire, le 128 Mo est réservé uniquement à cet effet. La zone vmalloc est principalement mappée temporairement sur certaines zones à haute mémoire et est remappée assez rapidement.
wag
Les pages mises en place par le noyau pour l'appel système virtuel font donc également partie de fixmap ??? Je suis tombé sur cette question car je veux savoir ce qui se trouve exactement dans la page avec l'adresse fffb5000, fffa1000 etc ... Je reçois des frais généraux dans la relecture de mon enregistrement de machine virtuelle parce que de nombreux processeurs virtuels accèdent BEAUCOUP à cette page .... comment faire Je sais ce qu'il y a exactement dans cette adresse ... GRANDE RÉPONSE au fait :)
Deepthought