web-dev-qa-db-fra.com

Que signifie la mise en page de la mémoire de la mémoire du noyau virtuel?

En traversant la "sortie de dmesg", je pouvais voir une liste de valeurs que je ne suis pas capable 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)

Des valeurs que je comprends que j'ai 2 Go de RAM (mémoire physique). Mais le reste des choses semble être des nombres magiques pour moi.

J'aimerais savoir sur chacun de chacun (FixMap, Pkmap, .. etc.) en bref (si plus de doutes, je publierai chacun une question distincte)?

Est-ce que quelqu'un pourrait m'expliquer ça?

19
Sen

Tout d'abord, un système 32 bits a 0xffffffff (4'294'967'295) Des adresses linéaires pour accéder à un emplacement physique au-dessus de la RAM.
[.____] Le noyau divise ces adresses dans l'espace utilisateur et du noyau.

L'espace utilisateur (mémoire haute) est accessible par l'utilisateur et, si nécessaire, également par le noyau.
[.____] la gamme d'adresses dans la notation HEX et DEC:

0x00000000 - 0xbfffffff
0 - 3'221'225'471

L'espace du noyau (mémoire faible) ne peut être consulté que par le noyau.
[.____] la gamme d'adresses dans la notation HEX et DEC:

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

Comme ça:

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

Ainsi, la mise en page que vous avez vue dans dmesg correspond à la cartographie 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 page du noyau (traduire linéaire en adresses physiques).

.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

La gamme où réside le code du noyau.

.data : 0xc071ae6a - 0xc08feb78   (1935 kB)

La gamme où résident les segments de données du noyau.

.init : 0xc0906000 - 0xc0973000   ( 436 kB)

La gamme où résident les tables de page initiales du noyau.

(et une autre 128 Ko pour certaines structures de données dynamiques.)

Cet espace d'adressage minimal est simplement suffisamment grand pour installer le noyau dans le RAM et pour initialiser ses structures de données de base.

Leur taille utilisée est montrée à l'intérieur de la parenthèse, 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 gamme LowMem peut être utilisée par le noyau pour accéder directement aux adresses physiques.
[.

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

L'allocation de mémoire virtuelle peut allouer des cadres de page en fonction d'un schéma non contigu. Le principal avantage de ce schéma est d'éviter la fragmentation externe, ceci est utilisé pour les zones d'échange, les modules de 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 des cadres de page de haute mémoire dans l'espace d'adresses de noyau. Lorsqu'une page HighMem est mappée en utilisant KMAP (), les adresses virtuelles sont attribuées d'ici.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Celles-ci sont des adresses linéaires mappées correctives pouvant faire référence à toute adresse physique de la RAM, pas seulement les 1 derniers gb comme les adresses LowMem. Les adresses linéaires mappées correctives sont un peu plus efficaces que leurs collègues LowMem et Pkmap. Il existe des descripteurs de table de page dédiés assignés pour la cartographie fixe et les mappages des pages HighMem à l'aide de KMAP_atomic sont attribués à partir d'ici.


Si vous voulez plonger plus profondément dans le trou de lapin:
[.____] Comprendre le noyau Linux

22
wag