คุณควรอ่าน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)