2009-06-15 15 views
17

मैं इस बारे में सोच रहा था कि लिनक्स कर्नेल सिस्टम कॉल कैसे लागू करता है और मैं सोच रहा था कि कोई मुझे उच्च स्तर का दृश्य दे सकता है कि कैसे sbrk/brk काम करता है?लिनक्स में sbrk/brk को कैसे लागू किया जाता है?

मैंने कर्नेल कोड की समीक्षा की है, लेकिन इसमें बहुत कुछ है और मैं इसे समझ नहीं पा रहा हूं। मैं किसी से सारांश की उम्मीद कर रहा था?

उत्तर

22

बहुत उच्च स्तर के दृश्य में, लिनक्स कर्नेल कई "मेमोरी एरिया" (struct vm_area_struct) के रूप में एक प्रक्रिया के लिए दृश्यमान स्मृति को ट्रैक करता है। एक संरचना भी है जो (एक उच्च स्तर के दृश्य में) एक प्रक्रिया 'संपूर्ण पता स्थान (struct mm_struct) का प्रतिनिधित्व करती है। प्रत्येक प्रक्रिया (कुछ कर्नेल धागे को छोड़कर) में वास्तव में एक struct mm_struct है, जो बदले में सभी struct vm_area_struct को स्मृति के लिए इंगित करता है।

sys_brk सिस्टम कॉल (mm/mmap.c में पाया गया) बस इन स्मृति क्षेत्रों में से कुछ को समायोजित करता है।(sbrkbrk के आसपास एक glibc wrapper है)। यह brk पता (struct mm_struct के अंदर पाया गया) और अनुरोधित मान के पुराने मान की तुलना करके ऐसा करता है।

brk के बाद से mmap कार्यों के परिवार को देखने के लिए यह आसान होगा, क्योंकि इसका एक विशेष मामला है।

+0

होता है तो सीआर 3 रजिस्टर में सेट किया जाता है "(एसआरबीके ब्रिक के चारों ओर एक ग्लिबैक रैपर है)" - मुझे ढूंढने का प्रयास करने में कठिन समय हो रहा था sbrk के लिए सिस्टम कॉल। कोई नहीं है, अब समझ में आता है। – automaton

4

ठीक है, एक सुपर-उच्च स्तरीय परिप्रेक्ष्य से, कर्नेल स्मृति के एक पेजेबल ब्लॉक को आवंटित करता है, उस ब्लॉक के अनुरोध की प्रक्रिया के पृष्ठ सारणी को संशोधित करता है ताकि स्मृति को प्रक्रिया के वीए स्पेस में मैप किया जा सके, फिर पता वापस कर दिया जाए।

+0

तो कर्नेल बहुत अधिक डेटा संरचना को कहीं भी रखता है जो कहता है "प्रक्रिया x मेमोरी स्पेस वाई का मालिक है"? – samoz

+1

प्रत्येक प्रक्रिया में अपना स्वयं का एमएमयू मैपिंग होता है, जो (अन्य चीजों के साथ) कहता है कि इसके कौन से पेज हैं। – Javier

+0

न केवल कर्नेल - यह हार्डवेयर द्वारा आवश्यक है, और जब भी एक संदर्भ स्विच –

2

लिनक्स कर्नेल उपयोगकर्ता प्रक्रिया में स्मृति को कैसे पास करता है इस बारे में एक महत्वपूर्ण अवधारणा यह है कि प्रक्रिया उपलब्ध ढेर (डेटा सेगमेंट) नीचे से बढ़ती है। कर्नेल स्मृति के अलग-अलग हिस्सों का ट्रैक नहीं रखता है, केवल स्मृति का एक सतत ब्लॉक है। ब्रैक/एसआरबीके सिस्टम कॉल प्रक्रिया की स्मृति की मात्रा का विस्तार करता है, लेकिन यह उपयोग करने योग्य टुकड़ों में इसे प्रबंधित करने की प्रक्रिया पर निर्भर करता है।

इसका एक मुख्य परिणाम यह है कि प्रक्रियाओं में बिखरी हुई स्मृति पता स्थान जो उपयोग में नहीं है, अन्य उपयोगों के लिए ऑपरेटिंग सिस्टम में वापस नहीं किया जा सकता है। डेटा सेगमेंट के बहुत ही अंत में केवल स्मृति को ऑपरेटिंग सिस्टम में वापस किया जा सकता है, इसलिए अंत में उपयोग में आने वाली मेमोरी को ऊपर की तरफ नीचे स्थानांतरित करना होगा। अभ्यास में लगभग कोई आवंटक ऐसा नहीं करता है। इस कारण से, आमतौर पर प्रक्रिया का उपयोग करने वाली अधिकतम मात्रा में स्मृति का प्रबंधन करने का अच्छा काम करना महत्वपूर्ण होता है, क्योंकि यह निर्धारित करता है कि अन्य प्रक्रियाओं के लिए कितनी मेमोरी छोड़ी जाएगी।

17

आपको समझना होगा कि वर्चुअल मेमोरी कैसे काम करती है, और कैसे एक एमएमयू मैपिंग असली रैम से संबंधित है।

असली रैम पृष्ठों में विभाजित है, पारंपरिक रूप से 4kB प्रत्येक। प्रत्येक प्रक्रिया में अपना स्वयं का एमएमयू मैपिंग होता है, जो उस प्रक्रिया को एक रैखिक मेमोरी स्पेस (32-बिट लिनक्स में 4 जीबी) प्रस्तुत करता है। बेशक, उन सभी को वास्तव में आवंटित नहीं किया जाता है। सबसे पहले, यह लगभग खाली है, कि कोई वास्तविक पृष्ठ अधिकांश पते से जुड़ा हुआ नहीं है।

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

इस तरह, कर्नेल इस बात की परवाह नहीं करता कि प्रक्रिया मेमोरी का उपयोग कैसे करती है, और प्रक्रिया वास्तव में परवाह नहीं करती है कि रैम कितनी रैम है, इसमें हमेशा एक ही रैखिक 4 जीबी पता स्थान होगा।

अब, brk/sbrk थोड़ा उच्च स्तर पर काम करता है: सिद्धांत रूप में किसी भी स्मृति पते 'उससे परे' चिह्न अमान्य है और यदि पहुंचने पर रैम पेज नहीं मिलेगा, तो प्रक्रिया को इसके बजाय मार दिया जाएगा। उपयोगकर्ता स्पेस लाइब्रेरी इस सीमा के भीतर स्मृति आवंटन प्रबंधित करता है, और केवल तभी जब कर्नेल इसे बढ़ाने के लिए कहता है।

लेकिन अगर किसी प्रक्रिया को अधिकतम अनुमति के लिए brk सेट करके शुरू किया गया है, तो यह वास्तविक RAM पृष्ठों को तब तक आवंटित नहीं किया जाएगा जब तक कि यह सभी स्मृति पते तक पहुंचने शुरू न हो जाए।

संबंधित मुद्दे