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.)