2012-03-22 20 views
17

मैं pmap -x कमांड का उपयोग कर लिनक्स x86-64 पर किसी प्रक्रिया के मेमोरी मैप को देखने का प्रयास कर रहा था। मैं pmap के आउटपुट को देखकर भ्रमित हो गया। गतिशील पुस्तकालयों के मानचित्रण के लिए विशेष रूप से प्रविष्टियों के लिए। उनके लिए कई प्रविष्टियां हैं (वास्तव में उनमें से सभी के लिए 4, जिनमें से कुछ 3 प्रविष्टियां हैं)। निम्नलिखित उदाहरणसमझने के लिए pmap आउटपुट

Address   Kbytes RSS Dirty Mode Mapping 

00000036ca200000  88  64  0 r-x-- libpthread-2.5.so 
00000036ca216000 2044  0  0 ----- libpthread-2.5.so 
00000036ca415000  4  4  4 r---- libpthread-2.5.so 
00000036ca416000  4  4  4 rw--- libpthread-2.5.so 

प्रत्येक लाइब्रेरी के लिए दूसरी पंक्ति में हमेशा 2 एमबी का आकार होता है जबकि इसकी कोई पृष्ठ अनुमति नहीं होती है। सभी पुस्तकालयों में ऐसा लगता है कि इसका आरएसएस हमेशा शून्य है। पिछले दो पंक्तियों में भी एक ही आकार (जो मूल पृष्ठ आकार है) और समान अनुमतियां हैं (एक मुट्ठी भर पुस्तकालयों में आरडब्ल्यू मैपिंग नहीं है)।

क्या किसी के पास इसके लिए कुछ स्पष्टीकरण है? मुझे एक भावना है कि संभावित रूप से केवल पढ़ने के लिए सुरक्षा के साथ मैपिंग लोडर द्वारा लाइब्रेरी के मेटाडेटा को पढ़ने के लिए किया जाता है जबकि एक्जिक्यूटिव अनुमति के साथ भाग वास्तव में लाइब्रेरी के लिए कोड होता है। हालांकि हो सकता है कि मैं गलत हूं।

लेकिन मुझे उस मध्य पंक्ति के बारे में कोई जानकारी नहीं है। कोई अनुमति नहीं और कोई उपयोग नहीं? किसी के पास ज्ञान के कुछ शब्द हैं?

मैंने कुछ पेजों को अज्ञात स्मृति पर होने की सूचना दी और कोई मोड बिट सेट नहीं है। ये क्या प्रतिनिधित्व करते हैं?

+0

[/ proc/$ pid/maps का संभावित डुप्लिकेट x86 \ _64 linux पर कोई rwx अनुमतियों वाले पृष्ठों को दिखाता है] (http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with -no-rwx-permissions-on-x86-64-linux) –

+0

ने टाइपो को ठीक करने का प्रयास किया: * निष्पादन योग्य अनुमति के साथ भाग वास्तव में लाइब्रेरी के लिए कोड * ... ऐसा लगता है कि "है" गायब है लेकिन नहीं हो सकता 100% निश्चित; क्या आप सहायता कर सकते हैं? –

उत्तर

4

सबसे पहले, यह मामला हो सकता है कि एक ही प्रक्रिया एक से अधिक स्मृति उपयोग उदाहरण का उपयोग कर सकती है। मुझे नहीं पता कि यह वही है जो आप जानना चाहते हैं। मैंने देखा है कि, लिनक्स में ब्राउज़र का उपयोग करते समय, केवल एक टैब खोलने के साथ, और शीर्ष कमांड का उपयोग करते हुए, यह मेमोरी उपयोग सूची में 4 से अधिक उपयोग की तरह दिखाता है, जिसमें 10 एमबी से अधिक स्मृति शामिल है। मुझे लगता है कि एक ही प्रक्रिया द्वारा चल रहे धागे की अधिक संख्या के कारण यह ठीक है।

यह लिंक उपयोगी हो सकता है, क्योंकि, उदाहरण के उदाहरण में, यदि आप देखते हैं, तो -x कमांड का मैपिंग अधिक उपयोग दिखाता है।

http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html

3

इन संरक्षित "----" पृष्ठों गार्ड पृष्ठों पुस्तकालय का कोड और डेटा क्षेत्रों के बीच अनुक्रमण से संकेत को रोकने के लिए कर रहे हैं। वे केवल प्रक्रिया के वर्चुअल स्पेस में मौजूद हैं और अगर कोई सूचक खंड के अंत में चलता है तो गलती का कारण बनता है।

यदि इन्हें साझा लाइब्रेरी फ़ाइल में संबोधित नहीं किया गया था तो मैं कहूंगा कि वे आवंटन को विस्तारित करने के लिए बफर के रूप में कार्य कर रहे थे। मॉलोक या ढेर विकास। उदाहरण के लिए glibc कर्नेल से थ्रेड-लोकल आवंटन एरिना के लिए पता स्थान के बड़े हिस्से का अनुरोध करता है, फिर उन्हें धीरे-धीरे malloc'd आवंटन के लिए खपत करता है। एक जेवीएम से एक बहुत बड़े pmap में मैं देख रहा हूं कि इनमें से कुछ दर्जन हैं, प्रत्येक एक आरडब्लू पेज का पालन करता है या दो बड़े आरडब्ल्यू आवंटन के बीच की जगह भरता है और आरडब्ल्यू पृष्ठों के विस्तार के रूप में उनके बीच की सीमाएं बदलती हैं। इस तरह X86_64 गार्ड पेजों पर खराब पॉइंटर डेफरेंस को पकड़ने के लिए सीपीयू की मेमोरी सुरक्षा प्रणाली का उपयोग कर सकते हैं।