私はスワップについて知っています。この質問はそれとは何の関係もありません。 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の問題と予約されたメモリ領域が残りを説明することがあります。詳細についてはわかりません。)
MemTotal
in は/proc/meminfo
RAM が使用可能であることを示します。ブートシーケンスが終了すると、カーネルはinit
不要になったデータを解放するため、報告された値はブートシーケンス/proc/meminfo
の最初の部分でカーネルが印刷した値よりわずかに高くなる可能性があります。
(このディスプレイにmeminfo
間接的にtotalram_pages
使用されます。x86_64の場合、NUMA以外のコアについても独自に計算されarch/x86/mm/init_64.c
ます。)free_all_bootmem()
mm/bootmem.c