GNU/Linux >> Belajar Linux >  >> Linux

Linux – Mengapa Linux Menampilkan Memori Lebih Banyak Dan Lebih Sedikit Daripada Yang Saya Instal Secara Fisik?

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.

Terkait:Daftar sinyal yang dihasilkan terminal (misalnya Ctrl-C -> SIGINT)?

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


Linux
  1. Mengapa rand() mengulang angka jauh lebih sering di Linux daripada Mac?

  2. Mengapa malloc() memanggil mmap() dan brk() secara bergantian?

  3. Mengapa Linux menggunakan partisi swap daripada file?

  1. Linux – Apakah Pengguna Harus Masuk Untuk Menjalankan Proses Dan Menjadi Pemiliknya?

  2. Mengapa sistem saya hanya menampilkan RAM 3,2 GiB padahal saya pasti memiliki 4,0 GiB

  3. Mengapa Linux harus memiliki `/dev/cdrom` dan `/media/cdrom`?

  1. Apa itu server Linux dan mengapa bisnis Anda membutuhkannya?

  2. Df Mengatakan Saya Memiliki 20g Lebih Banyak Ruang Disk yang Digunakan Daripada Du. Mengapa??

  3. Mesin Virtual dengan CentOS 5 32-Bit OS Tidak Mengatasi Memori Fisik Lebih dari 3 GB