GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Qu'implique la disposition de la mémoire du noyau virtuel dans Dmesg ?

En parcourant la "Sortie de dmesg" Je pouvais voir une liste de valeurs que je ne parvenais pas à 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 nombres magiques pour moi.

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

Quelqu'un pourrait-il m'expliquer ?

Réponse acceptée :

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

L'espace utilisateur (mémoire haute) 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 noyau (mémoire faible) n'est accessible que par le noyau.
La plage d'adresses en notation hexadécimale et décimale :

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

Comme ceci :

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

Ainsi, la disposition de la mémoire que vous avez vue dans dmesg correspond au mappage des adresses linéaires dans l'espace du noyau.

Tout d'abord, les séquences .text, .data et .init qui fournissent l'initialisation des propres tables de pages du noyau (traduction linéaire en adresses physiques).

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

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

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

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

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

La plage où 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 de base.

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 ko).

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.
Il ne s'agit pas du 1 Go complet, car le noyau nécessite toujours au moins 128 Mo d'adresses linéaires pour implémenter une allocation de mémoire non contiguë et des adresses linéaires à mappage fixe .

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, ceci est utilisé pour les zones de swap, 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 à mémoire élevée 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, 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.
Il existe des descripteurs de table de page dédiés affectés au mappage fixe, et les mappages de pages HIGHMEM utilisant kmap_atomic sont alloués à partir d'ici.

Connexe :Comment supprimer tous les fichiers avec une extension particulière dans un dossier particulier ?

Si vous voulez plonger plus profondément dans le terrier du lapin :
Comprendre le noyau Linux


Linux
  1. Qu'est-ce que le noyau Linux et devez-vous mettre à niveau vers le dernier noyau ?

  2. Linux - Qu'est-ce que la mémoire élevée et la mémoire faible sous Linux ?

  3. Que fait exactement make oldconfig dans le makefile du noyau Linux ?

  4. Qu'est-ce que cela signifie de dire que le noyau Linux est préemptif ?

  5. Quelle est la source actuelle du noyau Linux ?

Commande Dmesg sous Linux

Quelle est la différence entre les noyaux macOS et Linux

Qu'est-ce que le Shell sous Linux ?

Qu'est-ce que la table des processus Linux ? En quoi cela consiste?

Que signifie __init dans le code du noyau Linux ?

Que signifie le suffixe .d sous Linux ?