Vous devez lire les dmesg
valeurs "Mémoire Akb / Bkb disponible" comme:
Il y a A disponible pour utilisation en ce moment, et le nombre de cadres de page le plus élevé du système multiplié par la taille de la page est B.
Cela vient 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 actuellement utilisée. max_pfn
est le numéro de cadre de page le plus élevé (le PAGE_SHIFT
décalage le convertit en Ko). 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 mémoire effectué par le BIOS peut contenir des trous.
La quantité absorbée par ces trous est suivie par la absent_pages
variable, affichée sous la forme kB absent
. Cela devrait expliquer la majeure partie de la différence entre le deuxième nombre dans la sortie "disponible" et votre RAM réelle installée.
Vous pouvez grep BIOS-e820
dans dmesg
ces trous « voir ». La carte mémoire y est affichée (juste en haut de la dmesg
sortie après le démarrage). Vous devriez pouvoir voir à quelles adresses physiques vous disposez d'une RAM réelle et utilisable.
(Les autres bizarreries x86 et les zones de mémoire réservées expliquent probablement le reste - je ne connais pas les détails là-bas.)
MemTotal
in /proc/meminfo
indique que la RAM est disponible. À la fin de la séquence de démarrage, le noyau libère les init
données dont il n'a plus besoin, de sorte que la valeur indiquée dans /proc/meminfo
pourrait être un peu plus élevée que ce que le noyau imprime pendant les premières parties de la séquence de démarrage.
( meminfo
utilise indirectement totalram_pages
pour cet affichage. Pour x86_64, cela est également calculé arch/x86/mm/init_64.c
via free_all_bootmem()
ce qui est lui-même mm/bootmem.c
pour les noyaux non NUMA.)