वर्चुअल पता स्थान में पृष्ठ का आकार कैसे निर्धारित किया जाता है?


43

लिनक्स एक वर्चुअल मेमोरी सिस्टम का उपयोग करता है जहां सभी पते वर्चुअल पते हैं न कि भौतिक पते। इन वर्चुअल एड्रेस को प्रोसेसर द्वारा फिजिकल एड्रेस में बदल दिया जाता है।

इस अनुवाद को आसान बनाने के लिए, आभासी और भौतिक मेमोरी को पृष्ठों में विभाजित किया गया है। इनमें से प्रत्येक पृष्ठ को एक अद्वितीय संख्या दी गई है; पेज फ्रेम नंबर।

कुछ पृष्ठ आकार 2 केबी, 4 केबी आदि हो सकते हैं, लेकिन यह पृष्ठ आकार संख्या कैसे निर्धारित की जाती है? क्या यह वास्तुकला के आकार से प्रभावित है? उदाहरण के लिए, 32-बिट बस में 4 जीबी एड्रेस स्पेस होगा।

जवाबों:


56

आप getconfकमांड के माध्यम से इसके कॉन्फ़िगरेशन को क्वेरी करके सिस्टम के डिफ़ॉल्ट पृष्ठ आकार का पता लगा सकते हैं :

$ getconf PAGE_SIZE
4096

या

$ getconf PAGESIZE
4096

नोट: उपरोक्त इकाइयाँ आम तौर पर बाइट्स में होती हैं, इसलिए 4096 4096 बाइट्स या 4kB के बराबर होती है।

यह लिनक्स कर्नेल के स्रोत में हार्डवेयर्ड है:

उदाहरण

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

शिफ्टिंग आपको 4096 कैसे देता है?

जब आप बिट्स को शिफ्ट करते हैं, तो आप द्विआधारी गुणन को 2 से कर रहे हैं। इसलिए वास्तव में बिट्स को बाईं ओर शिफ्ट करना ( 1 << PAGE_SHIFT) 2 ^ 12 = 4096 का गुणन कर रहा है।

$ echo "2^12" | bc
4096

2
आधुनिक हार्डवेयर 2MB और कुछ 1GB का समर्थन करता है, पृष्ठबद्ध करता है। कर्नेल बिल्ड के लिए डिफ़ॉल्ट के रूप में "PAGE_SHIFT" को 2MB पृष्ठों के लिए 21 पर सेट किया जा सकता है?
ReverseFlow

2
@ReverseFlow ऐसी किसी बात का जवाब पाने के लिए, मैं एक अलग सवाल पूछूंगा।
Kirill Bulygin

@sim, सोच रहा है कि बिट जोड़तोड़ यहाँ क्यों उपयोग किए जाते हैं? मैंने पढ़ा कि संकलक आमतौर पर गुणा को बिट जोड़तोड़ में परिवर्तित करता है, इसलिए समान प्रदर्शन देता है।
सफलाश

17

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

लगभग सभी आर्किटेक्चर 4kB पेज के आकार का समर्थन करते हैं। कुछ आर्किटेक्चर बड़े पृष्ठों का समर्थन करते हैं (और कुछ छोटे पृष्ठों का भी समर्थन करते हैं), लेकिन 4kB एक बहुत ही व्यापक डिफ़ॉल्ट है।

लिनक्स दो पृष्ठ आकारों का समर्थन करता है:

  • सामान्य आकार के पृष्ठ, जो मुझे लगता है कि सभी आर्किटेक्चर पर डिफ़ॉल्ट रूप से 4kB हैं, हालांकि कुछ आर्किटेक्चर अन्य मूल्यों की अनुमति देते हैं, जैसे ARM64 पर 16kB या IA64 पर 8kB, 16kB या 64kB । ये एमएमयू (जिसे लिनक्स पीटीई कहते हैं ) पर वर्णनकर्ताओं के सबसे गहरे स्तर के अनुरूप हैं ।
  • विशाल पृष्ठ , यदि संकलित किया गया है ( CONFIG_HUGETLB_PAGEआवश्यक है, और CONFIG_HUGETLBFSअधिकांश उपयोगों के लिए भी)। यह एमएमयू वर्णनकर्ताओं के दूसरे सबसे गहरे स्तर (जिसे लिनक्स पीएमडी कहता है) से मेल खाता है (या कम से कम यह आमतौर पर होता है, मुझे नहीं पता कि यह सभी आर्किटेक्चर पर है)।

पृष्ठ का आकार मेमोरी उपयोग, मेमोरी उपयोग और गति के बीच एक समझौता है।

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

अधिकांश अनुप्रयोगों के लिए बड़े पृष्ठ के आकार छोटे हैं, जबकि लागत पर्याप्त है। यही कारण है कि अधिकांश सिस्टम केवल सामान्य आकार के पृष्ठों का उपयोग करते हैं।

आप getconfउपयोगिता या C फ़ंक्शन के साथ अपने सिस्टम पर (सामान्य) पृष्ठ आकार को क्वेरी कर सकते हैं sysconf

$ getconf PAGE_SIZE
4096

विशाल पृष्ठों का उपयोग करने के लिए वहां hugetlbfsफाइलसिस्टम और mmapपिंग फ़ाइलों को माउंट करने की आवश्यकता होती है ।


FYI करें: विशाल पृष्ठों का उपयोग करने के लिए बढ़ते hugetlbfs की आवश्यकता नहीं होती है, क्योंकि नीचे कर्नेल डॉक्टर नोट साझा किए गए मेमोरी कॉल या एक एमएमएपी ध्वज का भी उपयोग कर सकते हैं। इसके अलावा, अधिक दिलचस्प बात यह है कि आप पारदर्शी विशाल पृष्ठों को सक्षम कर सकते हैं, फिर कर्नेल स्वचालित रूप से सामान्य पृष्ठों को सभी एप्लिकेशन में संभव होने पर विशाल पृष्ठों में बदल देगा।
derobert

यह वास्तव में मौलिक उत्तर है। लिनक्स को केवल पेजिंग हार्डवेयर का अच्छी तरह से उपयोग करने के लिए डिज़ाइन किया गया है। पेजिंग के बारे में अधिक जानकारी: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli 新疆:::

0

पृष्ठ का आकार ज्यादातर प्रोसेसर वास्तुकला पर निर्भर करता है। X86 पर, 386 प्रोसेसर के समय से जिसने संरक्षित मोड पेश किया है, पृष्ठ का आकार 4 kB है।

X64 मोड में, विशाल पृष्ठ भी हो सकते हैं, जो आकार में 2 एमबी हैं। हालांकि, उन का उपयोग करना थोड़ा जटिल है।

आप विकिपीडिया लेख में पृष्ठ आकार के बारे में अधिक जानकारी पा सकते हैं


0

प्रोसेसर उपलब्ध पृष्ठ आकार को निर्धारित करता है। अधिकांश उद्देश्यों के लिए, x86 और x86_64 प्रोसेसर पर हार्डवेयर लागू पृष्ठ आकार 4kb है। हालाँकि, ऑपरेटिंग सिस्टम एक बार में एक से अधिक पेज आवंटित कर सकता है यदि वह चाहता है, और इस तरह से सॉफ्टवेयर में 8kb, 16kb या 32kb पेज को प्रभावी ढंग से लागू कर सकता है।

X86 और x86_64 प्रोसेसर क्रमशः 4kb और मानक 4kb पेजों के साथ 2mb पेजों को भी जोड़ सकते हैं। यदि उस क्षमता का उपयोग किया जाता है, तो इसका उपयोग ज्यादातर कर्नेल स्थान को आवंटित करने के लिए किया जाएगा।

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