Linux neden fiziksel olarak yüklediğimden daha fazla ve daha az bellek gösteriyor?


11

Takas hakkında biliyorum - bu soru bununla ilgili değil. Dmesg'de, Linux (x86-64) çekirdeği bana ne kadar belleğe sahip olduğumu söyler:

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

cat /proc/meminfo bana sahip olduğumu söylüyor

MemTotal:        3910472 kB

Ve hesaplamalarıma göre, tam olarak 4 * 1024 * 1024 = 4194304k RAM'e sahip olmalıyım. Hangi yolu üzerinde dmesg hattında ikinci rakamdan daha küçük!

Tüm bu farklı figürlerin nesi var?

Bu arada, uname -açıktılar:

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

Yanıtlar:


20

Sen okumalısınız dmesgolarak "Hafıza Akb / BKB müsait" değerleri:

Şu anda kullanım için A var ve sistemin en yüksek sayfa çerçeve sayısı ile sayfa boyutunun çarpımı B'dir.

Bu 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()şu anda kullanılmayan çekirdek tarafından yönetilen fiziksel bellek miktarını döndürür. max_pfnen yüksek sayfa kare sayısıdır ( PAGE_SHIFTshift bunu kb'ye dönüştürür). En yüksek sayfa çerçeve sayısı beklediğinizden (çok) daha yüksek olabilir - BIOS tarafından yapılan bellek eşlemesinde delikler olabilir.
Bu deliklerin ne kadar yer aldığı absent_pagesdeğişken olarak izlenir kB absent. Bu, "mevcut" çıkıştaki ikinci sayı ile gerçek, kurulu RAM'iniz arasındaki farkın çoğunu açıklamalıdır.

Sen yakalamak için yazılması edebilirsiniz BIOS-e820içinde dmesg"görmek" bu deliklere. Bellek haritası burada görüntülenir ( dmesgönyüklemeden sonra çıktının hemen üstünde ). Hangi fiziksel adreslerin gerçek, kullanılabilir RAM'iniz olduğunu görebilmelisiniz.
(Diğer x86 tuhaflıkları ve ayrılmış bellek alanları muhtemelen geri kalanını açıklıyor - orada detayları bilmiyorum.)

MemTotalin /proc/meminfo, kullanılabilir RAM'i gösterir. Önyükleme sırasının hemen sonunda, çekirdek initartık gerek duymadığı verileri serbest bırakır , bu nedenle bildirilen değer /proc/meminfo, önyükleme sırasının ilk bölümleri sırasında çekirdeğin yazdırdığı değerden biraz daha yüksek olabilir.

( meminfoDolaylı kullanımları totalram_pagesbu görüntü için. X86_64, bu hesaplanan arch/x86/mm/init_64.cile çok free_all_bootmem()kendisi olan mm/bootmem.colmayan numa çekirdekler için.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.