Dmesg में वर्चुअल कर्नेल मेमोरी लेआउट क्या है?


19

"आउटपुट ऑफ डम्सग" से गुजरते हुए मैं उन मूल्यों की एक सूची देख सकता था जिन्हें मैं ठीक से समझ नहीं पा रहा हूं।

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
    pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
    vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
    lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
      .init : 0xc0906000 - 0xc0973000   ( 436 kB)
      .data : 0xc071ae6a - 0xc08feb78   (1935 kB)
      .text : 0xc0400000 - 0xc071ae6a   (3179 kB)

मूल्यों से मैं समझता हूं कि मेरे पास 2 जीबी रैम (भौतिक मेमोरी) है। लेकिन बाकी चीजें मेरे लिए मैजिक नंबर लगती हैं।

मैं संक्षेप में प्रत्येक (फिक्समैप, पीकैप, .. आदि) के बारे में जानना चाहता हूं (यदि अधिक संदेह है, तो मैं प्रत्येक को एक अलग प्रश्न के रूप में पोस्ट करूंगा)?

क्या कोई मुझे समझा सकता है?

जवाबों:


22

सबसे पहले, एक 32 बिट सिस्टम में 0xffffffff( 4'294'967'295) रैम के एक भौतिक स्थान को एक्सेस करने के लिए रैखिक पते हैं।
कर्नेल इन पतों को उपयोगकर्ता और कर्नेल स्थान में विभाजित करता है।

उपयोगकर्ता स्थान (उच्च मेमोरी) उपयोगकर्ता द्वारा पहुँचा जा सकता है और, यदि आवश्यक हो, तो कर्नेल द्वारा भी।
हेक्स और डिक नोटेशन में पता सीमा:

0x00000000 - 0xbfffffff
0 - 3'221'225'471

कर्नेल स्पेस (कम मेमोरी) को केवल कर्नेल द्वारा एक्सेस किया जा सकता है।
हेक्स और डिक नोटेशन में पता सीमा:

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

ऐशे ही:

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

इस प्रकार, आपके द्वारा देखे गए मेमोरी लेआउट dmesgकर्नेल स्पेस में रैखिक पतों की मैपिंग से मेल खाते हैं।

सबसे पहले, .text, .data और .init सीक्वेंस जो कर्नेल के अपने पेज टेबल की आरंभीकरण प्रदान करते हैं (रैखिक को भौतिक पतों में अनुवाद करते हैं)।

.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

वह श्रेणी जहाँ कर्नेल कोड रहता है।

.data : 0xc071ae6a - 0xc08feb78   (1935 kB)

वह श्रेणी जहाँ कर्नेल डेटा खंड रहते हैं।

.init : 0xc0906000 - 0xc0973000   ( 436 kB)

वह श्रेणी जहाँ कर्नेल के प्रारंभिक पृष्ठ टेबल रहते हैं।

(और कुछ गतिशील डेटा संरचनाओं के लिए एक और 128 kB।)

यह न्यूनतम पता स्थान केवल रैम में कर्नेल को स्थापित करने और इसकी मुख्य डेटा संरचनाओं को प्रारंभ करने के लिए पर्याप्त बड़ा है।

उनका उपयोग किया गया आकार कोष्ठक के अंदर दिखाया गया है, उदाहरण के लिए कर्नेल कोड:

0xc071ae6a - 0xc0400000 = 31AE6A

दशमलव संकेतन में, वह 3'255'914(3179 kB) है।


दूसरा, प्रारंभ के बाद कर्नेल स्थान का उपयोग

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

कमेम श्रेणी का उपयोग कर्नेल द्वारा सीधे भौतिक पतों तक पहुंचने के लिए किया जा सकता है।
यह पूर्ण 1 जीबी नहीं है, क्योंकि कर्नेल को हमेशा गैर-स्थिर मेमोरी आवंटन और फिक्स-मैपेड रैखिक पते को लागू करने के लिए कम से कम 128 एमबी रैखिक पते की आवश्यकता होती है।

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

वर्चुअल मेमोरी आबंटन एक अनियंत्रित योजना के आधार पर पृष्ठ फ़्रेम आवंटित कर सकता है। इस स्कीमा का मुख्य लाभ बाहरी विखंडन से बचने के लिए है, इसका उपयोग स्वैप क्षेत्रों, कर्नेल मॉड्यूल या बफ़र्स के कुछ I / O उपकरणों के आवंटन के लिए किया जाता है।

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

स्थायी कर्नेल मैपिंग कर्नेल को कर्नेल पता स्थान में उच्च-स्मृति पृष्ठ फ़्रेम के लंबे समय तक चलने वाले मैपिंग को स्थापित करने की अनुमति देता है। जब एक HighMEM पृष्ठ को kmap () का उपयोग करके मैप किया जाता है, तो वर्चुअल पते यहां से असाइन किए जाते हैं।

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

ये फिक्स-मैपेड रैखिक पते हैं जो रैम में किसी भी भौतिक पते को संदर्भित कर सकते हैं, न कि पिछले 1 जीबी जैसे कि कम-से-कम पते। फिक्स-मैप किए गए रैखिक पते उनके लोयम और pkmap सहयोगियों की तुलना में थोड़ा अधिक कुशल हैं। नियत मानचित्रण के लिए असाइन किए गए समर्पित पेज टेबल डिस्क्रिप्टर हैं, और kmap_atomic का उपयोग करके HIGHMEM पृष्ठों की मैपिंग यहां से आवंटित की गई है।


यदि आप खरगोश के छेद में गहरा गोता लगाना चाहते हैं:
लिनक्स कर्नेल को समझना


इस बेहतरीन जवाब के लिए धन्यवाद। मैं जानना चाहता हूं कि क्यों कम मेम पूर्ण 1GB नहीं है और वाक्य के अगले भाग के बारे में अधिक है "क्योंकि कर्नेल को हमेशा गैर-स्थिर मेमोरी आवंटन और फिक्स-मैप किए गए रैखिक पतों को लागू करने के लिए कम से कम 128 एमबी रैखिक पते की आवश्यकता होती है।"
सेन

कर्नेल को समय-समय पर उच्च-मेमोरी कोड का उपयोग करना पड़ता है (रैम के पहले एमबी पर फ़े BIOS और एसीपीआई की जानकारी), वह सीधे ऐसा नहीं कर सकता है (जैसे नीम क्षेत्र), इसलिए उसे कम-मेमोरी को मैप करने की आवश्यकता है उच्च-स्मृति रैखिक पते, 128MB केवल इस उद्देश्य के लिए आरक्षित है। Vmalloc क्षेत्र को कुछ उच्च-स्मृति क्षेत्रों पर अस्थायी रूप से मैप किया गया है और बहुत तेजी से रीमैप किया गया है।
वाग

तो वर्चुअल सिस्टम कॉल के लिए कर्नेल द्वारा सेट किए गए पेज भी फिक्समैप का एक हिस्सा हैं ??? मैं इस सवाल में भाग गया क्योंकि मैं जानना चाहता हूं कि पता पृष्ठ में वास्तव में क्या है fffb5000, fffa1000 आदि ... मैं अपने वर्चुअल मशीन रिकॉर्ड रिप्ले में ओवरहेड हो रहा हूं क्योंकि कई आभासी सीपीयू इस पृष्ठ पर एक बहुत कुछ प्राप्त करते हैं .... कैसे करते हैं मुझे पता है कि वास्तव में इस पते पर क्या है ... इस तरह से महान :) :)
गहन विचार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.