Linuxに実際にインストールされているよりも多いか少ないメモリが表示されるのはなぜですか?

Linuxに実際にインストールされているよりも多いか少ないメモリが表示されるのはなぜですか?

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

答え1

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/meminfoRAM が使用可能であることを示します。ブートシーケンスが終了すると、カーネルはinit不要になったデータを解放するため、報告された値はブートシーケンス/proc/meminfoの最初の部分でカーネルが印刷した値よりわずかに高くなる可能性があります。

(このディスプレイにmeminfo間接的にtotalram_pages使用されます。x86_64の場合、NUMA以外のコアについても独自に計算されarch/x86/mm/init_64.cます。)free_all_bootmem()mm/bootmem.c

関連情報