Linuxに、物理的にインストールしたメモリより多いメモリと少ないメモリの両方が表示されるのはなぜですか?


11

私はスワップについて知っています-この質問はそれについてではありません。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

回答:


20

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の癖と予約済みメモリ領域がおそらく残りを占めています-詳細はわかりません。)

MemTotalin /proc/meminfoは、使用可能なRAM を示します。ブートシーケンスの最後に、カーネルはinit不要になったデータを解放するため、報告される値/proc/meminfoは、ブートシーケンスの最初の部分でカーネルが出力する値よりも少し高くなる可能性があります。

meminfo間接的な使用totalram_pages、その表示のためには。x86_64の場合、これは算出されるarch/x86/mm/init_64.c介しすぎるfree_all_bootmem()自身がであるmm/bootmem.c非NUMAカーネルのため。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.