GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Pourquoi Linux affiche-t-il à la fois plus et moins de mémoire que ce que j'ai physiquement installé?

Je connais l'échange - cette question n'est pas à ce sujet. Dans dmesg, le noyau Linux (x86-64) me dit ceci sur la quantité de mémoire dont je dispose :

[    0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)

cat /proc/meminfo me dit que j'ai

MemTotal:        3910472 kB

Et d'après mes calculs, je pense que je devrais avoir exactement 4*1024*1024=4194304k RAM. Ce qui est moyen plus petit que le deuxième chiffre de la ligne dmesg ci-dessus !

Qu'est-ce que c'est que ces chiffres différents ?

Au fait, uname -a sorties :

Linux pavilion 3.2.2-1.fc16.x86_64 #1 SMP Thu Jan 26 03:21:58 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Réponse acceptée :

Vous devriez lire le dmesg valeurs "Mémoire Akb/Bkb disponible" comme :

Il y a A disponible pour l'instant, et le numéro de cadre de page le plus élevé du système multiplié par la taille de la page est B.

Ceci provient de arch/x86/mm/init_64.c :

printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
                 "%ldk absent, %ldk reserved, %ldk data, %ldk init)n",
                 nr_free_pages() << (PAGE_SHIFT-10),
                 max_pfn << (PAGE_SHIFT-10),
                 codesize >> 10,
                 absent_pages << (PAGE_SHIFT-10),
                 reservedpages << (PAGE_SHIFT-10),
                 datasize >> 10,
                 initsize >> 10);

nr_free_pages() renvoie la quantité de mémoire physique, gérée par le noyau, qui n'est pas utilisée actuellement. max_pfn est le numéro de cadre de page le plus élevé (le PAGE_SHIFT shift convertit cela en kb). Le numéro de cadre de page le plus élevé peut être (beaucoup) plus élevé que ce à quoi vous pourriez vous attendre - le mappage de la mémoire effectué par le BIOS peut contenir des trous.
La quantité de ces trous est suivie par le absent_pages variable, affichée comme kB absent . Cela devrait expliquer la majeure partie de la différence entre le deuxième nombre dans la sortie "disponible" et votre RAM installée réelle.

Vous pouvez grep pour BIOS-e820 dans dmesg pour « voir » ces trous. La carte mémoire y est affichée (tout en haut de dmesg sortie après le démarrage). Vous devriez être en mesure de voir à quelles adresses physiques vous avez une RAM réelle et utilisable.
(D'autres bizarreries x86 et des zones de mémoire réservées expliquent probablement le reste - je ne connais pas les détails ici.)

MemTotal dans /proc/meminfo indique la RAM disponible pour utilisation. Juste à la fin de la séquence de démarrage, le noyau libère init données dont il n'a plus besoin, donc la valeur rapportée dans /proc/meminfo pourrait être un peu plus élevé que ce que le noyau affiche pendant les premières parties de la séquence de démarrage.

En relation :Liste des signaux générés par le terminal (par exemple, Ctrl-C -> SIGINT) ?

(meminfo utilise indirectement totalram_pages pour cet affichage. Pour x86_64, ceci est calculé dans arch/x86/mm/init_64.c aussi via free_all_bootmem() qui lui-même est dans mm/bootmem.c pour les noyaux non NUMA.)


Linux
  1. Df dit que j'ai utilisé 20g d'espace disque de plus que Du. Pourquoi??

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

  3. Le noyau Linux a-t-il une fonction principale ?

  4. Pourquoi rand() répète-t-il beaucoup plus souvent les nombres sous Linux que sur Mac ?

  5. Pourquoi malloc() appelle mmap() et brk() de manière interchangeable ?

Qu'est-ce que la commande Grep sous Linux ? Pourquoi est-il utilisé et comment fonctionne-t-il ?

La machine virtuelle avec le système d'exploitation CentOS 5 32 bits n'adresse pas plus de 3 Go de mémoire physique

6 raisons pour lesquelles Linux n'a pas plus d'applications

Pourquoi mon système n'affiche-t-il que 3,2 Go de RAM alors que j'ai définitivement 4,0 Go

Pourquoi les numéros d'appel du système Linux dans x86 et x86_64 sont-ils différents ?

Pourquoi top affiche-t-il un nombre de cœurs différent de cpuinfo ?