เหตุใด Linux จึงแสดงทั้งหน่วยความจำมากขึ้นและน้อยลงกว่าที่ฉันได้ติดตั้งไว้


11

ฉันรู้เกี่ยวกับการแลกเปลี่ยน - คำถามนี้ไม่ได้เกี่ยวกับเรื่องนั้น ใน dmesg เคอร์เนล Linux (x86-64) บอกฉันเกี่ยวกับจำนวนหน่วยความจำที่ฉันมี:

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

cat /proc/meminfo บอกฉันว่าฉันมี

MemTotal:        3910472 kB

และจากการคำนวณของฉันฉันคิดว่าฉันควรมี RAM 4 * 1024 * 1024 = 4194304k ซึ่งเป็นวิธีที่เล็กกว่ารูปที่สองในบรรทัด dmesg ด้านบน!

ตัวเลขเหล่านี้ต่างกันอย่างไร

โดยวิธีการที่uname -aส่งออก:

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

คำตอบ:


20

คุณควรอ่านdmesgค่า "Memory Akb / Bkb available" เป็น:

มี A พร้อมใช้งานในขณะนี้และหมายเลขหน้าสูงสุดของระบบคูณด้วยขนาดหน้าคือ B

นี่คือจาก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()ส่งคืนจำนวนหน่วยความจำกายภาพที่จัดการโดยเคอร์เนลที่ไม่ได้ใช้งานในปัจจุบัน max_pfnเป็นจำนวนหน้าเฟรมสูงสุด (การPAGE_SHIFTเปลี่ยนแปลงจะแปลงเป็น kb) หมายเลขหน้าเฟรมสูงสุดสามารถสูงกว่าที่คุณคาดไว้มากการแมปหน่วยความจำที่ทำโดย BIOS อาจมีช่องว่าง
เท่าไหร่หลุมเหล่านี้เกิดขึ้นจะถูกติดตามโดยตัวแปรแสดงเป็นabsent_pages kB absentสิ่งนี้ควรอธิบายความแตกต่างส่วนใหญ่ระหว่างหมายเลขที่สองในเอาต์พุต "พร้อมใช้" และ RAM ที่ติดตั้งจริงของคุณ

คุณสามารถ grep สำหรับBIOS-e820ในdmesg"เห็น" หลุมเหล่านี้ แผนผังหน่วยความจำแสดงขึ้นที่นั่น (ด้านขวาของdmesgเอาต์พุตหลังบูต) คุณควรจะสามารถดูว่าที่อยู่ทางกายภาพใดที่คุณมี RAM จริงและใช้งานได้
(นิสัยใจคอ x86 อื่น ๆ และพื้นที่หน่วยความจำที่สำรองไว้น่าจะเป็นสาเหตุที่เหลือ - ฉันไม่รู้รายละเอียดที่นั่น)

MemTotalใน/proc/meminfoบ่งชี้ว่า RAM พร้อมใช้งาน ในตอนท้ายของลำดับการบูตเคอร์เนลจะปล่อยinitข้อมูลที่ไม่ต้องการอีกต่อไปดังนั้นค่าที่รายงาน/proc/meminfoอาจสูงกว่าที่เคอร์เนลพิมพ์ออกมาเล็กน้อยในระหว่างส่วนเริ่มต้นของลำดับการบู๊ต

( meminfoใช้ทางอ้อมtotalram_pagesสำหรับจอแสดงผลนั้นสำหรับ x86_64 สิ่งนี้จะถูกคำนวณarch/x86/mm/init_64.cด้วยเช่นกันfree_all_bootmem()ซึ่งตัวมันเองนั้นใช้mm/bootmem.cสำหรับเมล็ดที่ไม่ใช่ NUMA)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.