लिनक्स मैं शारीरिक रूप से स्थापित की तुलना में अधिक और कम मेमोरी दोनों क्यों दिखाता है?


11

मैं स्वैप के बारे में जानता हूं - यह सवाल उस बारे में नहीं है। Dmesg में, लिनक्स (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

और मेरी गणना से, मुझे लगता है कि मेरे पास 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"मेमोरी अकब / बीएक्सबी उपलब्ध" मूल्यों को पढ़ना चाहिए :

अभी उपयोग के लिए ए उपलब्ध है, और सिस्टम का उच्चतम पृष्ठ फ़्रेम संख्या पृष्ठ आकार से गुणा किया जाता है।

यह इस प्रकार है 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। यह "उपलब्ध" आउटपुट में दूसरे नंबर और आपके वास्तविक, स्थापित रैम के बीच के अंतर को स्पष्ट करना चाहिए।

आप के लिए grep सकते BIOS-e820में dmesgकरने के लिए "देख" इन छिद्रों। मेमोरी मैप वहां प्रदर्शित होता है ( dmesgबूट के बाद आउटपुट के शीर्ष पर )। आपको यह देखने में सक्षम होना चाहिए कि आपके पास वास्तविक, उपयोग करने योग्य रैम में कौन से पते हैं।
(अन्य x86 quirks और आरक्षित मेमोरी क्षेत्र संभवतः बाकी के लिए जिम्मेदार हैं - मुझे वहां विवरण नहीं पता है।)

MemTotal/proc/meminfoइंगित करता है कि RAM उपयोग के लिए उपलब्ध है। बूट अनुक्रम के अंत में, कर्नेल initडेटा को मुक्त करता है, उसे किसी भी अधिक की आवश्यकता नहीं होती है, इसलिए /proc/meminfoबूट अनुक्रम के प्रारंभिक भागों के दौरान कर्नेल प्रिंट करता है, की तुलना में रिपोर्ट किया गया मान थोड़ा अधिक हो सकता है।

( उस प्रदर्शन के लिए meminfoअप्रत्यक्ष रूप से उपयोग करता है totalram_pages। x86_64 के लिए, यह उस गणना के arch/x86/mm/init_64.cमाध्यम free_all_bootmem()से होता है, जिसके माध्यम से स्वयं mm/bootmem.cगैर-एनयूएमए कर्नेल के लिए है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.