dmesg
「Memory Akb / Bkb available」の値を次のように読み取る必要があります。
現在使用可能なAがあり、システムの最大ページフレーム数にページサイズを掛けたものがBです。
これはから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()
現在使用されていない、カーネルによって管理されている物理メモリの量を返します。max_pfn
最高のページフレーム番号です(PAGE_SHIFT
シフトはそれをkbに変換します)。最高のページフレーム番号は、予想よりも(はるかに)大きくなる可能性があります。BIOSによって実行されるメモリマッピングには、ホールが含まれる可能性があります。
これらの穴が占める量は、absent_pages
変数として追跡され、として表示されkB absent
ます。これにより、「利用可能な」出力の2番目の数値と実際にインストールされているRAMの違いのほとんどが説明されます。
これらの穴を「見る」ためBIOS-e820
にgrepすることができdmesg
ます。そこにメモリマップが表示されます(dmesg
起動後の出力の上部)。実際の使用可能なRAMがどの物理アドレスにあるかを確認できるはずです。
(他のx86の癖と予約済みメモリ領域がおそらく残りを占めています-詳細はわかりません。)
MemTotal
in /proc/meminfo
は、使用可能なRAM を示します。ブートシーケンスの最後に、カーネルはinit
不要になったデータを解放するため、報告される値/proc/meminfo
は、ブートシーケンスの最初の部分でカーネルが出力する値よりも少し高くなる可能性があります。
(meminfo
間接的な使用totalram_pages
、その表示のためには。x86_64の場合、これは算出されるarch/x86/mm/init_64.c
介しすぎるfree_all_bootmem()
自身がであるmm/bootmem.c
非NUMAカーネルのため。)