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