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