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