Mengapa Linux menunjukkan lebih banyak dan lebih sedikit memori daripada yang saya instal secara fisik?

11

Saya tahu tentang swap - pertanyaan ini bukan tentang itu. Di dmesg, kernel Linux (x86-64) memberi tahu saya tentang berapa banyak memori yang saya miliki:

[    0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)

cat /proc/meminfo memberitahu saya bahwa saya punya

MemTotal:        3910472 kB

Dan dengan perhitungan saya, saya pikir saya harus memiliki tepat 4 * 1024 * 1024 = 4194304k RAM. Yang jauh lebih kecil dari angka kedua di baris dmesg di atas!

Ada apa dengan semua tokoh yang berbeda ini?

Omong-omong, uname -aoutput:

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
Robin Green
sumber

Jawaban:

20

Anda harus membaca dmesgnilai "Memory Akb / Bkb available" sebagai:

Ada A yang tersedia untuk digunakan sekarang, dan nomor bingkai halaman sistem tertinggi dikalikan dengan ukuran halaman adalah B.

Ini dari 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()mengembalikan jumlah memori fisik, yang dikelola oleh kernel, yang saat ini tidak digunakan. max_pfnadalah nomor bingkai halaman tertinggi ( PAGE_SHIFTpergeseran mengubahnya menjadi kb). Nomor bingkai halaman tertinggi dapat (jauh) lebih tinggi dari yang Anda harapkan - pemetaan memori yang dilakukan oleh BIOS dapat berisi lubang.
Berapa banyak lubang ini diambil dilacak oleh absent_pagesvariabel, ditampilkan sebagai kB absent. Ini seharusnya menjelaskan sebagian besar perbedaan antara angka kedua dalam output "tersedia" dan RAM Anda yang sebenarnya terpasang.

Anda dapat BIOS-e820masuk dmesguntuk "melihat" lubang ini. Peta memori ditampilkan di sana (tepat di atas dmesgoutput setelah boot). Anda harus dapat melihat pada alamat fisik apa Anda memiliki RAM yang nyata dan dapat digunakan.
(Keanehan x86 lainnya dan area memori yang dicadangkan mungkin merupakan penyebab sisanya - saya tidak tahu detailnya di sana.)

MemTotaldalam /proc/meminfomenunjukkan RAM tersedia untuk digunakan. Tepat di akhir urutan boot, kernel membebaskan initdata yang tidak diperlukan lagi, sehingga nilai yang dilaporkan /proc/meminfobisa sedikit lebih tinggi daripada apa yang dicetak oleh kernel selama bagian awal dari urutan boot.

( meminfoMenggunakan secara tidak langsung totalram_pagesuntuk tampilan itu. Untuk x86_64, ini dihitung arch/x86/mm/init_64.cjuga melalui free_all_bootmem()yang digunakan mm/bootmem.cuntuk kernel non-NUMA.)

Tikar
sumber