कर्नेल mmap ऑपरेशन के लिए मेमोरी का आकार


9

मैं जिस तरह से लिनक्स मैमैप फाइल को मुख्य मेमोरी (मेरे संदर्भ में निष्पादन के लिए, लेकिन मुझे लगता है कि लिखने और पढ़ने के लिए एक ही है) और किस आकार का उपयोग करता है, में दिलचस्पी है।

इसलिए मुझे पता है कि लिनक्स आमतौर पर 4kB पेजेज के साथ पेजिंग का उपयोग करता है (जहां कर्नेल में मुझे यह आकार मिल सकता है?)। लेकिन वास्तव में आवंटित मेमोरी के लिए इसका क्या मतलब है: मान लें कि आपके पास कुछ बाइटेड बाइट्स के आकार का एक द्विआधारी है, जो 5812B कहता है और आप इसे निष्पादित करते हैं। कर्नेल में क्या होता है: क्या यह 2 * 4kB आवंटित करता है और फिर 2 पेज में मुख्य मेमोरी की> 3KB को बर्बाद करते हुए 5812B को इस स्पेस में कॉपी करता है?

यह बहुत अच्छा होगा यदि कोई व्यक्ति कर्नेल स्रोत में फ़ाइल को जानता था जहां पेजलाइज़ को परिभाषित किया गया है।

मेरा दूसरा प्रश्न भी बहुत सरल है मुझे लगता है: मैंने एक फाइल के रूप में 5812B मान लिया। क्या यह सही है, कि यह आकार केवल इनोड से लिया गया है?

जवाबों:


6

स्मृति में निष्पादन योग्य के आकार और आकार के बीच कोई सीधा संबंध नहीं है। जब बाइनरी को निष्पादित किया जाता है तो क्या होता है इसका एक बहुत ही त्वरित अवलोकन यहां दिया गया है:

  1. कर्नेल फ़ाइल को पार्स करता है और इसे खंड में तोड़ता है। कुछ खंडों को अलग-अलग पृष्ठों में सीधे मेमोरी में लोड किया जाता है। कुछ खंड बिल्कुल लोड नहीं किए गए हैं (उदाहरण के लिए डिबगिंग प्रतीक)।
  2. यदि निष्पादन योग्य गतिशील रूप से जुड़ा हुआ है, तो कर्नेल गतिशील लोडर को कॉल करता है, और यह आवश्यक साझा पुस्तकालयों को लोड करता है और आवश्यकता के अनुसार लिंक संस्करण निष्पादित करता है।
  3. कार्यक्रम अपने कोड को निष्पादित करना शुरू कर देता है, और आमतौर पर यह डेटा को स्टोर करने के लिए अधिक मेमोरी का अनुरोध करेगा।

निष्पादन योग्य प्रारूपों, लिंकिंग और निष्पादन योग्य लोडिंग के बारे में अधिक जानकारी के लिए, आप जॉन आर। लेविन द्वारा लिंकर्स और लोडर पढ़ सकते हैं ।

5kB निष्पादन योग्य में, यह संभावना है कि सब कुछ कोड या डेटा है जिसे हेडर को छोड़कर मेमोरी में लोड करने की आवश्यकता है। निष्पादन योग्य कोड कम से कम एक पेज होगा, शायद दो, और फिर स्टैक के लिए कम से कम एक पेज होगा, शायद एक पेज या हीप (अन्य डेटा) के लिए, साथ ही साझा पुस्तकालयों द्वारा उपयोग की जाने वाली मेमोरी।

लिनक्स के तहत, आप एक निष्पादन योग्य के लिए मेमोरी मैपिंग का निरीक्षण कर सकते हैं cat /proc/$pid/maps। प्रारूप को proc(5)मैन पेज में प्रलेखित किया गया है ; लिनक्स / proc / id / नक्शे को समझना भी देखें ।


0

हां: आपको अंततः दो 4k पृष्ठ मिलते हैं। डेटा डिमांड पर लोड किया जाता है, इसलिए यदि कभी कुछ भी दूसरे पेज को संदर्भित नहीं करता है तो इसे मेमोरी में कभी लोड नहीं किया जाएगा।

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

इन मूल्यों को न बदलें और कुछ भी काम करने की उम्मीद करें।

हां, फ़ाइल आकार ext2 / 3 में इनोड में संग्रहीत है।


0

परिभाषा भाग के लिए, Intel आर्किटेक्चर के लिए 2.6.38 ~ ish कर्नेल पर:

मेहराब / 86 / शामिल / ASM / page_types.h:

/ * PAGE_SHIFT पृष्ठ का आकार निर्धारित करता है * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, उल) << PAGE_SHIFT)

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