私はスワップについて知っています–この質問はそれについてではありません。 dmesgでは、Linux(x86-64)カーネルは、私が持っているメモリの量について次のように教えてくれます。
[ 0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)
cat /proc/meminfo
私が持っていると教えてくれます
MemTotal: 3910472 kB
そして私の計算では、正確に4 * 1024 * 1024=4194304kのRAMが必要だと思います。これは方法です 上記のdmesg行の2番目の図よりも小さいです!
これらすべての異なる数字とは何ですか?
ちなみに、uname -a
出力:
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
承認された回答:
dmesg
を読む必要があります 「MemoryAkb/Bkbavailable」の値は次のとおりです。
現在使用可能な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
shiftはそれをkbに変換します)。最大のページフレーム数は、予想よりも(はるかに)大きくなる可能性があります。BIOSによって実行されるメモリマッピングには穴が含まれる可能性があります。
これらの穴が占める量は、absent_pages
によって追跡されます。 変数、kB absent
として表示 。これは、「使用可能な」出力の2番目の数値と実際にインストールされているRAMの違いのほとんどを説明しているはずです。
BIOS-e820
をgrepできます dmesg
で これらの穴を「見る」ために。そこにメモリマップが表示されます(dmesg
の右上) 起動後の出力)。実際に使用可能なRAMがどの物理アドレスにあるかを確認できるはずです。
(他のx86の癖と予約済みのメモリ領域が残りの部分を占めている可能性があります。詳細はわかりません。)
MemTotal
/proc/meminfo
にあります 使用可能なRAMを示します。ブートシーケンスの最後に、カーネルはinit
を解放します データはもう必要ないので、値は/proc/meminfo
で報告されます ブートシーケンスの最初の部分でカーネルが出力するものよりも少し高くなる可能性があります。
(meminfo
間接的にtotalram_pages
を使用します その表示のために。 x86_64の場合、これはarch/x86/mm/init_64.c
で計算されます。 free_all_bootmem()
経由でも それ自体はmm/bootmem.c
にあります 非NUMAカーネルの場合。)