रूप प्रोग्रामिंग के रूप में आसान बना देता है आपने कहा कि आप में रुचि रखते थे यही कारण है कि, तो:
वास्तविक मोड में, एक खंड भौतिक स्मृति के लिए एक 64K "विंडो" है और इन खिड़कियों को 16 बाइट अलग रखा गया है। संरक्षित मोड में, एक सेगमेंट भौतिक या वर्चुअल मेमोरी के लिए एक विंडो है, जिसका आकार और स्थान ओएस द्वारा निर्धारित किया जाता है, और इसमें कई अन्य गुण होते हैं, जिसमें किसी विशेषाधिकार स्तर को किसी एक्सेस को एक्सेस करने के लिए होना चाहिए।
यहां से, जो कुछ भी मैं कहता हूं वह संरक्षित मोड को संदर्भित करता है।
वैश्विक वर्णनकर्ता तालिका (जीडीटी) नामक स्मृति में एक तालिका है, जहां इन विंडो आकारों और स्थानों और अन्य गुणों के बारे में जानकारी रखी जाती है। प्रति-प्रक्रिया के आधार पर स्थानीय डिस्क्रिप्टर टेबल भी हो सकते हैं, और वे इसी तरह से काम करते हैं, इसलिए मैं केवल जीडीटी पर ध्यान केंद्रित करूंगा।
आपके द्वारा सेगमेंट रजिस्टर में लोड होने वाला मान सेगमेंट चयनकर्ता के रूप में जाना जाता है। यह अतिरिक्त सुरक्षा जानकारी के साथ जीडीटी या एलडीटी में एक सूचकांक है। स्वाभाविक रूप से यदि कोई प्रोग्राम जीडीटी की सीमाओं के बाहर एक वर्णक लोड करने का प्रयास करता है, तो एक अपवाद होता है। अगर प्रक्रिया में सेगमेंट तक पहुंचने के लिए पर्याप्त विशेषाधिकार नहीं है, या कुछ और अमान्य है, तो एक अपवाद होता है।
जब कोई अपवाद होता है, तो कर्नेल इसे संभालता है। इस तरह के अपवाद को शायद सेगमेंटेशन गलती के रूप में वर्गीकृत किया जाएगा। तो ओएस आपके कार्यक्रम को मारता है।
एक अंतिम चेतावनी है: x86 निर्देश सेट में, आप सेगमेंट रजिस्टरों में तत्काल मान लोड नहीं कर सकते हैं। आपको सेगमेंट रजिस्टर में इंटरमीडिएट रजिस्टर या मेमोरी ऑपरेंड या पीओपी का उपयोग करना होगा।
MOV DS, 160 ;INVALID - won't assemble
MOV AX, 160 ;VALID - assembles, but will probably result in an
MOV DS, AX ;exception, and thus the death of your program
मुझे लगता है कि यह ध्यान दिया जाना चाहिए कि आर्किटेक्चर सेगमेंट के ढेर के लिए अनुमति देता है। लेकिन AFAIK, जब यह मुख्य धारा 86 ऑपरेटिंग सिस्टम के लिए आता है, खंड रजिस्टरों केवल कुछ प्रयोजनों की सेवा: इस तरह के एक दूसरे को या ओएस
कई के साथ काम को नुकसान पहुँचाने से उपयोगकर्ता अंतरिक्ष प्रक्रियाओं रखने के रूप में
- सुरक्षा तंत्र,/बहु-कोर प्रोसेसर
- थ्रेड-लोकल स्टोरेज: ऑप्टिमाइज़ेशन के रूप में, कुछ ऑपरेटिंग सिस्टम (लिनक्स और विंडोज सहित) थ्रेड-लोकल स्टोरेज (टीएलएस) के लिए सेगमेंट रजिस्ट्रार का उपयोग करते हैं। चूंकि धागे एक ही पता स्थान साझा करते हैं, इसलिए धागे को "पता" करना मुश्किल होता है जहां इसका टीएलएस क्षेत्र सिस्टम कॉल का उपयोग किए बिना या पंजीकरण बर्बाद कर रहा है ... लेकिन चूंकि सेगमेंट रजिस्ट्रार व्यावहारिक रूप से बेकार हैं, इसलिए "बर्बाद करने" में कोई हानि नहीं है उन्हें तेजी से टीएलएस के लिए। ध्यान दें कि इसे सेट करते समय, एक ओएस सेगमेंट रजिस्टरों को छोड़ सकता है और सीधे वर्णक कैश रजिस्टरों को लिख सकता है, जो सेगमेंट रजिस्टरों के संदर्भों से ट्रिगर किए गए जीडीटी/एलडीटी लुकअप को कैश करने के लिए उपयोग किए जाने वाले "छिपा" रजिस्ट्रार हैं, इस मामले में यदि आप कोशिश करते हैं सेगमेंट रजिस्टरों से पढ़ने के लिए आप इसे नहीं देख पाएंगे।
टीएलएस के लिए प्रति थ्रेड सेगमेंट के अलावा, वास्तव में केवल कुछ हद तक सेगमेंट (प्रोसेसर की संख्या) का उपयोग किया जाता है, और केवल ओएस द्वारा। आवेदन कार्यक्रम पूरी तरह से सेगमेंट रजिस्टरों को अनदेखा कर सकते हैं।
यह किसी भी तकनीकी सीमाओं के लिए ओएस डिज़ाइन के कारण है। एम्बेडेड ऑपरेटिंग सिस्टम हो सकते हैं जिसके लिए सेगमेंट रजिस्टरों के साथ काम करने के लिए उपयोगकर्ता-स्पेस प्रोग्राम की आवश्यकता होती है, हालांकि मुझे किसी के बारे में पता नहीं है।
त्रुटि क्या है? – Blorgbeard
ओएस के तहत, या फ्रीस्टैंडिंग? 16 असली या 32-बिट संरक्षित मोड? क्या कोड संकलित नहीं किया था? अवलोकन प्रभावों के साथ न्यूनतम 16-बिट उदाहरण: https://github.com/cirosantilli/x86-bare-metal-examples/blob/d4aae6183b98564819107b44a77641979c35d2c3/segment_registers.S –