2010-08-08 18 views
13

मैंने ऑपरेटिंग सिस्टम डिज़ाइन और अवधारणा के बारे में एक कोर्स लिया है और अब मैं लिनक्स कर्नेल को पूरी तरह से पढ़ाने की कोशिश कर रहा हूं। मेरे पास एक सवाल है कि मैं छुटकारा नहीं पा सकता हूं। आधुनिक ऑपरेटिंग सिस्टम में प्रत्येक प्रक्रिया में वर्चुअल एड्रेस स्पेस (वीएएस) होता है (उदाहरण के लिए, 32-बिट सिस्टम में 0 से 2^32-1)। यह कई फायदे प्रदान करता है। लेकिन कार्यान्वयन में मैं कुछ बिंदुओं पर उलझन में हूं। उदाहरण के लिए मुझे इसे समझाएं:विभिन्न भौतिक पते पर मैप किए गए विभिन्न प्रक्रियाओं के लिए समान वर्चुअल पता कैसे हैं

मान लें कि हमारे पास दो प्रक्रियाएं पी 1, पी 2 हैं; पी 1 और पी 2 के पास अपने स्वयं के वीएएस हैं। एक पता 0x023f4a54 विभिन्न भौतिक पते (पीए) में मैप किया गया है, यह कैसे हो सकता है? इस अनुवाद को इस तरीके से कैसे किया जाता है। मेरा मतलब है कि मैं अनुवाद तंत्र जानता हूं लेकिन मुझे समझ में नहीं आ रहा है कि अलग-अलग प्रक्रियाओं के पते की जगह आने पर एक ही पते को विभिन्न भौतिक पते पर मैप किया जाता है।

0x023f4a54 in p1's VAS => PA 0x12321321 
0x023f4a54 in p2's VAS => PA 0x23af2341 # (random addresses) 
+0

https://en.wikipedia.org/wiki/Virtual_memory –

उत्तर

3

सभी उत्तरों के लिए धन्यवाद। वास्तविक बिंदु जो मुझे नहीं पता है कि विभिन्न प्रक्रियाओं का वर्चुअल पता एक दूसरे के भौतिक संवाददाता के साथ संघर्ष नहीं करता है। मुझे नीचे दिए गए लिंक में जवाब मिला, प्रत्येक प्रक्रिया की अपनी पृष्ठ तालिका है।

http://tldp.org/LDP/tlk/mm/memory.html

6

आपका प्रश्न पहचान का एक तरीका के रूप में एक पते का उपयोग कर के साथ एक आभासी पता confuses, तो समझने के लिए पहला कदम अवधारणाओं अलग करना है।

एक रनिंग उदाहरण सी रनटाइम लाइब्रेरी फ़ंक्शन sprintf() है। जब उचित रूप से घोषित और बुलाया जाता है, तो इसे एक साझा ऑब्जेक्ट मॉड्यूल के रूप में एक प्रोग्राम में शामिल किया जाता है, साथ ही सभी उपखंडों की आवश्यकता होती है। sprintf का पता प्रोग्राम से प्रोग्राम में भिन्न होता है क्योंकि लाइब्रेरी एक उपलब्ध खाली पते में लोड की जाती है। एक सरल हैलो वर्ल्ड प्रोग्राम के लिए, स्पिंटफ़ को 0x101000 पते पर लोड किया जा सकता है। एक जटिल कार्यक्रम के लिए जो करों की गणना करता है, इसे 0x763f8000 पर लोड किया जा सकता है (सभी भाग्यशाली तर्कों के कारण मुख्य कार्यक्रम पुस्तकालयों के संदर्भ में पहले जाता है)। एक सिस्टम परिप्रेक्ष्य से, साझा लाइब्रेरी केवल एक ही स्थान पर स्मृति में लोड की जाती है, लेकिन पता विंडो (पते की सीमा) कि प्रत्येक प्रक्रिया को देखता है कि स्मृति उस निष्पादन योग्य के लिए अद्वितीय है।

बेशक, यह Security Enhanced Linux (SELinux) की कुछ विशेषताओं से जटिल है जो साझा पुस्तकालय मैपिंग सहित विभिन्न प्रोग्राम अनुभागों को स्मृति में लोड किए गए पते को यादृच्छिक करता है।

--- स्पष्टीकरण --- जैसा कि कोई सही ढंग से इंगित करता है, प्रत्येक प्रक्रिया का वर्चुअल एड्रेस मैपिंग प्रत्येक प्रक्रिया के लिए विशिष्ट है, फाइल डिस्क्रिप्टर, सॉकेट कनेक्शन, प्रोसेस पेरेंट और बच्चों आदि के सेट के विपरीत नहीं। है, पी 1 0x1000 को 0x710000 पर पता लगा सकता है जबकि पेज 2 गलती के लिए पी 2 मानचित्र पता 0x1000, और पी 3 को भौतिक 0x9f32a000 पर कुछ साझा लाइब्रेरी में मैप किया गया है। आभासी पता मैपिंग सावधानीपूर्वक ऑपरेटिंग सिस्टम द्वारा पर्यवेक्षित है, तर्कसंगत रूप से स्वैपिंग और पेजिंग जैसी सुविधाएं प्रदान करने के लिए, लेकिन साझा कोड और डेटा, और इंटरप्रोसेस साझा डेटा जैसी सुविधाएं प्रदान करने के लिए।

+0

मेरी समस्या साझा करने के बारे में नहीं है। समस्या यह है कि जब पी 1 वीए 0x04 तक पहुंचने का प्रयास करता है तो इस वीए को भौतिक पते में अनुवादित किया जाता है, तो संदर्भ स्विच हुआ और दूसरी प्रक्रिया पी 2 उसी वीए 0x04 तक पहुंचने का प्रयास करती है, इस वीए को दूसरे भौतिक पते में अनुवादित किया जाता है लेकिन यह पी 1 के साथ समान नहीं हो सकता है। ओएस द्वारा प्रदान किया गया यह अंतर कैसे हो सकता है। वे एक ही वीए तक पहुंच सकते हैं लेकिन इन वीए को एक ही भौतिक पते पर मैप नहीं किया जाता है। मुझे उस अनुवाद मुद्दे से परे तंत्र आश्चर्य है। ओएस इन प्रक्रियाओं को दूसरे के साथ संघर्ष करने से कैसे रोकता है? – dirtybit

+2

@ पुशडाउन जैसा कि बताया गया है, ओएस प्रति प्रक्रिया एक अलग मैपिंग रखता है, और जब यह प्रक्रियाओं के बीच स्विच करता है तो यह उन मैपिंग में और बाहर जाता है। – nos

22

वर्चुअल मेमोरी प्रदान करने वाला एक सीपीयू आपको मेमोरी पतों की मैपिंग सेट करने देता है क्योंकि सीपीयू इसे भौतिक स्मृति पते पर देखता है, आमतौर पर यह एमएमयू नामक एक हैयरवेयर इकाई द्वारा किया जाता है।

ओएस कर्नेल प्रोग्राम कर सकता है कि एमएमयू, आमतौर पर व्यक्तिगत पतों पर नहीं, बल्कि पृष्ठों की इकाइयों में (4096 बाइट आम है)। इसका मतलब है कि एमएमयू को अनुवाद करने के लिए प्रोग्राम किया जा सकता है उदा। आभासी पते 0x1000-0x2000 का भौतिक पता 0x20000-0x21000 में अनुवाद किया जाना है।

ओएस प्रति प्रक्रिया के इन मैपिंग का एक सेट रखता है, और इससे पहले कि यह एक प्रक्रिया को चलाने के लिए शेड्यूल करता है, इससे पहले एमएमयू में मैपिंग लोड हो जाती है इससे पहले कि यह प्रक्रिया पर नियंत्रण को स्विच कर लेता है। यह विभिन्न प्रक्रियाओं के लिए अलग-अलग मैपिंग सक्षम करता है, और कुछ भी मैपिंग को उसी वर्चुअल एड्रेस को एक अलग भौतिक पते पर मैप करने से रोकता है।

यह सभी पारदर्शी है जहां तक ​​प्रोग्राम का संबंध है, यह केवल सीपीयू पर निर्देश निष्पादित करता है, और चूंकि CPU को वर्चुअल मेमोरी मोड (पेजेड मोड) पर सेट किया गया है, इसलिए प्रत्येक मेमोरी एक्सेस का अनुवाद एमएमयू द्वारा किया जाता है स्मृति के लिए भौतिक बस पर बाहर चला जाता है।

वास्तविक कार्यान्वयन विवरण जटिल हैं, लेकिन यहां कुछ संदर्भ हैं जो अधिक अंतर्दृष्टि प्रदान कर सकते हैं;

+2

बीटीडब्ल्यू, गोर्मन पुस्तक के लिए धन्यवाद। यह वास्तव में बहुत अच्छा है। – dirtybit

1

यह मानचित्रण (भौतिक पता करने के लिए वर्चुअल ऐड्रेस) (@nos 'जवाब देखें) ओएस और MMU द्वारा नियंत्रित किया जाता है; इस अमूर्तता का बिंदु इतना पी 1 "सोचता है" यह 0x023f4a54 तक पहुंच रहा है जब वास्तव में यह 0x12321321 तक पहुंच रहा है।

यदि आप मशीन कोड स्तर पर प्रोग्राम कैसे काम करते हैं, इस पर आप अपनी कक्षा में वापस जाते हैं, तो पी 1 कुछ चरम/फ़ंक्शन/जो भी हो, उसी स्थान पर होगा (उदाहरण के लिए 0x023f4a54) प्रत्येक बार लोड होने पर। आभासी पते पर भौतिक ओएस मैपिंग इस अमूर्तता प्रदान करता है। हकीकत में, यह हमेशा भौतिक पते पर लोड नहीं किया जाएगा, लेकिन आपका प्रोग्राम तब तक परवाह नहीं करता है जब तक यह वर्चुअल पता में रहता है।

+2

जादू * आंतरिक * एमएमयू हैं (वास्तव में हार्डवेयर, ओएस नहीं), नोस का जवाब देखें। ओएस एमएमयू को वास्तव में अनुवाद को लागू करने के लिए मानचित्रण और कार्यक्रमों का निर्णय लेता है। – Wim

5

पेजिंग से निपटने वाले दो महत्वपूर्ण डेटा संरचनाएं हैं: पृष्ठ तालिका और टीएलबी। ओएस प्रति प्रक्रिया अलग पेज टेबल रखता है। टीएलबी पृष्ठ तालिका का सिर्फ एक कैश है।

अब, विभिन्न सीपीयू अच्छी तरह से अलग हैं। x86 सीआर 3 नामक एक विशेष रजिस्टर का उपयोग करके सीधे पृष्ठ टेबल तक पहुंचता है जो उपयोग में पेज तालिका को इंगित करता है। एमआईपीएस प्रोसेसर पेज टेबल के बारे में कुछ नहीं जानते हैं, इसलिए ओएस को सीधे टीएलबी के साथ काम करना चाहिए।

कुछ सीपीयू (उदाहरण: एमआईपीएस) विभिन्न प्रक्रियाओं को अलग करने के लिए टीएलबी में एक पहचानकर्ता रखता है, इसलिए ओएस एक संदर्भ स्विच करते समय केवल नियंत्रण रजिस्टर बदल सकता है (जब तक इसे पहचानकर्ता का पुन: उपयोग करने की आवश्यकता न हो)। अन्य सीपीयू को प्रत्येक संदर्भ स्विच में एक पूर्ण टीएलबी फ्लश की आवश्यकता होती है। इसलिए, मूल रूप से, ओएस को कुछ नियंत्रण रजिस्टरों को बदलने की ज़रूरत है और संभावित रूप से टीएलबी (टीएलबी फ्लश करें) को साफ़ करने की आवश्यकता है ताकि विभिन्न प्रक्रियाओं से वर्चुअल पतों को मानचित्र के किसी भी भौतिक पते पर नक्शा दें।

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