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 memiliki
MemTotal: 3910472 kB
Dan dengan perhitungan saya, saya pikir saya harus memiliki 4*1024*1024=4194304k RAM. Yang mana jalan lebih kecil dari angka kedua pada baris dmesg di atas!
Ada apa dengan semua angka yang berbeda ini?
Omong-omong, uname -a keluaran:
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
Jawaban yang Diterima:
Anda harus membaca dmesg nilai "Memori Akb/Bkb tersedia" sebagai:
Ada A yang tersedia untuk digunakan sekarang, dan nomor bingkai halaman tertinggi sistem 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_pfn adalah nomor bingkai halaman tertinggi (PAGE_SHIFT shift mengubahnya menjadi kb). Nomor bingkai halaman tertinggi bisa (jauh) lebih tinggi dari yang Anda harapkan – pemetaan memori yang dilakukan oleh BIOS dapat berisi lubang.
Seberapa banyak lubang ini digunakan dilacak oleh absent_pages variabel, ditampilkan sebagai kB absent . Ini akan menjelaskan sebagian besar perbedaan antara angka kedua dalam keluaran "tersedia" dan RAM yang sebenarnya terpasang.
Anda dapat mengambil BIOS-e820 di dmesg untuk "melihat" lubang-lubang ini. Peta memori ditampilkan di sana (tepat di bagian atas dmesg keluaran setelah boot). Anda seharusnya dapat melihat di alamat fisik mana Anda memiliki RAM yang sebenarnya dan dapat digunakan.
(Keanehan x86 lainnya dan area memori yang dicadangkan mungkin menjelaskan sisanya – saya tidak tahu detailnya di sana.)
MemTotal di /proc/meminfo menunjukkan RAM tersedia untuk digunakan. Tepat di akhir urutan boot, kernel membebaskan init data tidak diperlukan lagi, jadi nilai dilaporkan di /proc/meminfo bisa sedikit lebih tinggi daripada yang dicetak kernel selama bagian awal dari urutan boot.
(meminfo menggunakan totalram_pages secara tidak langsung untuk tampilan itu. Untuk x86_64, ini dihitung dalam arch/x86/mm/init_64.c juga melalui free_all_bootmem() yang berada di mm/bootmem.c untuk kernel non-NUMA.)