X86 मेमोरी सेगमेंटेशन

From Vigyanwiki
Revision as of 11:44, 28 April 2023 by alpha>Neetua08

x86 स्मृति विभाजन इंटेल x86 कंप्यूटर निर्देश सेट वास्तुकला में मेमोरी सेगमेंटेशन के कार्यान्वयन को संदर्भित करता है। 1978 में Intel 8086 पर सेगमेंटेशन की शुरुआत की गई थी, ताकि कार्यक्रमों को 64 KB (65,536 बाइट्स) से अधिक मेमोरी को संबोधित करने की अनुमति मिल सके। Intel 80286 ने 1982 में सेगमेंटेशन का दूसरा संस्करण पेश किया जिसमें आभासी मेमोरी और मेमोरी सुरक्षा के लिए समर्थन जोड़ा गया। इस बिंदु पर मूल मोड का नाम बदलकर वास्तविक मोड कर दिया गया था, और नए संस्करण को संरक्षित मोड नाम दिया गया था। 2003 में पेश किए गए x86-64 आर्किटेक्चर ने 64-बिट मोड में विभाजन के लिए काफी हद तक समर्थन छोड़ दिया है।

वास्तविक और संरक्षित दोनों मोड में, वास्तविक मेमोरी एड्रेस प्राप्त करने के लिए सिस्टम 16-बिट सेगमेंट रजिस्टर का उपयोग करता है। वास्तविक मोड में, CS, DS, SS और ES रजिस्टर वर्तमान में उपयोग किए गए प्रोग्राम कोड खंड (CS), वर्तमान डेटा खंड (DS), वर्तमान कॉल स्टैक (SS), और एक अतिरिक्त सेगमेंट की ओर इशारा करते हैं। प्रोग्रामर (ईएस) द्वारा निर्धारित। 1985 में पेश किया गया Intel 80386, दो अतिरिक्त खंड रजिस्टर, FS और GS जोड़ता है, जिसमें हार्डवेयर द्वारा परिभाषित कोई विशिष्ट उपयोग नहीं है। जिस तरह से सेगमेंट रजिस्टरों का उपयोग किया जाता है, वह दो मोड के बीच भिन्न होता है।[1]

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


रियल मोड

वास्तविक मोड मेमोरी में तीन खंड (विस्तार करने के लिए चित्र पर क्लिक करें)। सेगमेंट 2 और सेगमेंट 3 के बीच ओवरलैप है; फ़िरोज़ा क्षेत्र में बाइट्स का उपयोग दोनों खंड चयनकर्ताओं से किया जा सकता है।

रियल मोड या वर्चुअल 8086 मोड में, सेगमेंट का आकार 1 बाइट से लेकर 65,536 बाइट (16-बिट ऑफ़सेट का उपयोग करके) तक हो सकता है।

सेगमेंट रजिस्टर में 16-बिट सेगमेंट चयनकर्ता को एक रैखिक 20-बिट एड्रेस के सबसे महत्वपूर्ण 16 बिट्स के रूप में व्याख्या किया जाता है, जिसे सेगमेंट एड्रेस कहा जाता है, जिसमें से शेष चार सबसे कम महत्वपूर्ण बिट सभी शून्य हैं। खंड पता हमेशा एक रेखीय पता प्राप्त करने के निर्देश में 16-बिट ऑफ़सेट में जोड़ा जाता है, जो इस मोड में भौतिक पते के समान होता है। उदाहरण के लिए, खंडित पता 06EFh:1234h (यहाँ प्रत्यय h का अर्थ हेक्साडेसिमल है) में 06EFh का एक खंड चयनकर्ता है, जो 06EF0h के एक खंड पते का प्रतिनिधित्व करता है, जिसमें ऑफसेट जोड़ा जाता है, जिससे रैखिक पता 06EF0h + 1234h = 08124h प्राप्त होता है।

  0000 0110 1110 11110000 Segment 16 bits, shifted 4 bits left (or multiplied by 0x10)
+      0001 0010 0011 0100 Offset 16 bits
                            
  0000 1000 0001 0010 0100 Address 20 bits

जिस तरह से सेगमेंट एड्रेस और ऑफ़सेट जोड़े जाते हैं, उसके कारण एक सिंगल लीनियर एड्रेस को 2 तक मैप किया जा सकता है12 = 4096 विशिष्ट खंड: ऑफ़सेट जोड़े। उदाहरण के लिए, रैखिक पता 08124h में खंडित पते हो सकते हैं 06EFh:1234h, 0812h:0004h, 0000h:8124h, आदि।

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

(रैखिक पते के प्रमुख शून्य, खंडित पते, और खंड और ऑफसेट फ़ील्ड स्पष्टता के लिए यहां दिखाए गए हैं। वे आमतौर पर छोड़े जाते हैं।)

वास्तविक मोड का प्रभावी 20-बिट पता स्थान स्मृति पता को 2 तक सीमित करता है20 बाइट, या 1,048,576 बाइट (1 मेगाबाइट)। यह सीधे Intel 8086 (और, बाद में, निकट से संबंधित 8088) के हार्डवेयर डिज़ाइन से प्राप्त हुआ, जिसमें ठीक 20 पता बस थी। (दोनों को 40-पिन डीआईपी पैकेज में पैक किया गया था; केवल 20 एड्रेस लाइन के साथ भी, एड्रेस और डेटा बस को सीमित पिन काउंट के भीतर सभी एड्रेस और डेटा लाइन को फिट करने के लिए मल्टीप्लेक्स किया गया था।)

प्रत्येक खंड रेखीय (सपाट) पता स्थान की शुरुआत से 16 बाइट्स के गुणक से शुरू होता है, जिसे एक पैराग्राफ कहा जाता है। यानी 16 बाइट के अंतराल पर। चूंकि सभी सेगमेंट 64 केबी लंबे हैं, यह बताता है कि सेगमेंट के बीच ओवरलैप कैसे हो सकता है और लीनियर मेमोरी एड्रेस स्पेस में किसी भी स्थान को कई सेगमेंट:ऑफ़सेट जोड़े के साथ क्यों एक्सेस किया जा सकता है। रेखीय पता स्थान में एक खंड की शुरुआत के वास्तविक स्थान की गणना खंड × 16 के साथ की जा सकती है। 0Ch (12) का एक खंड मान रैखिक पता स्थान में C0h (192) पर एक रैखिक पता देगा। इसके बाद एड्रेस ऑफ़सेट को इस नंबर में जोड़ा जा सकता है। 0Ch:0Fh (12:15) होगा C0h+0Fh=CFh (192+15=207), CFh (207) रेखीय पता होगा। इस तरह के एड्रेस ट्रांसलेशन सीपीयू की सेगमेंटेशन यूनिट द्वारा किए जाते हैं। अंतिम खंड, FFFFh (65535), रेखीय पते FFFF0h (1048560) पर शुरू होता है, 20 बिट पता स्थान के अंत से 16 बाइट्स पहले, और इस प्रकार, 65,536 बाइट तक, 65,520 (65536) तक ऑफ़सेट के साथ पहुंच सकता है −16) बाइट्स 20 बिट 8088 एड्रेस स्पेस के अंत के बाद। 8088 पर, इन एड्रेस एक्सेस को एड्रेस स्पेस की शुरुआत में लपेटा गया था जैसे कि 65535:16 एड्रेस 0 तक पहुंच जाएगा और 65533:1000 लीनियर एड्रेस स्पेस के एड्रेस 952 तक पहुंच जाएगा। प्रोग्रामरों द्वारा इस सुविधा का उपयोग बाद की सीपीयू पीढ़ियों में गेट ए 20 संगतता मुद्दों के कारण हुआ, जहां रेखीय पता स्थान को 20 बिट्स से आगे बढ़ाया गया था।

16-बिट वास्तविक मोड में, कई मेमोरी सेगमेंट का उपयोग करने के लिए एप्लिकेशन को सक्षम करना (किसी एक 64K-सेगमेंट में उपलब्ध मेमोरी से अधिक मेमोरी तक पहुंचने के लिए) काफी जटिल है, लेकिन इसे सभी के लिए एक आवश्यक बुराई के रूप में देखा गया था लेकिन सबसे छोटे उपकरण ( जो कम स्मृति के साथ कर सकता है)। समस्या की जड़ यह है कि संपूर्ण मेमोरी रेंज के फ्लैट एड्रेसिंग के लिए उपयुक्त कोई उपयुक्त पता-अंकगणितीय निर्देश उपलब्ध नहीं हैं।[citation needed] कई निर्देशों को लागू करने से फ्लैट एड्रेसिंग संभव है, जो हालांकि धीमे प्रोग्राम की ओर ले जाता है।

x86 मेमोरी मॉडल अवधारणा खंड रजिस्टरों के सेटअप से निकली है। उदाहरण के लिए, छोटे मॉडल CS=DS=SS में, यानी प्रोग्राम का कोड, डेटा और स्टैक सभी एक ही 64 KB सेगमेंट में समाहित हैं। छोटे मेमोरी मॉडल DS=SS में, इसलिए डेटा और स्टैक दोनों एक ही सेगमेंट में रहते हैं; सीएस 64 केबी तक के अलग कोड सेगमेंट की ओर इशारा करता है।

संरक्षित मोड

स्थानीय डिस्क्रिप्टर तालिका के साथ संरक्षित मोड मेमोरी में तीन खंड (विस्तार करने के लिए छवि पर क्लिक करें)।

80286 संरक्षित मोड

Intel 80286 का संरक्षित मोड प्रोसेसर के एड्रेस स्पेस को 2 तक बढ़ा देता है24 बाइट्स (16 मेगाबाइट्स), लेकिन शिफ्ट वैल्यू को समायोजित करके नहीं। इसके बजाय, 16-बिट सेगमेंट रजिस्टरों में अब 24-बिट बेस एड्रेस वाले खंड वर्णनकर्ता की तालिका में एक इंडेक्स होता है जिसमें ऑफ़सेट जोड़ा जाता है। पुराने सॉफ़्टवेयर का समर्थन करने के लिए, प्रोसेसर वास्तविक मोड में शुरू होता है, एक ऐसा मोड जिसमें यह 8086 के खंडित एड्रेसिंग मॉडल का उपयोग करता है। हालांकि एक छोटा सा अंतर है: परिणामी भौतिक पता अब 20 बिट तक छोटा नहीं किया जाता है, इसलिए वास्तविक मोड पॉइंटर्स (लेकिन 8086 पॉइंटर्स नहीं) अब 100000 के बीच के पतों को संदर्भित कर सकते हैं16 और 10FFEF16. मेमोरी के लगभग 64-किलोबाइट क्षेत्र को हाई मेमोरी एरिया (HMA) के रूप में जाना जाता था, और DOS के बाद के संस्करण इसका उपयोग उपलब्ध पारंपरिक मेमोरी (यानी पहले मेगाबाइट के भीतर) को बढ़ाने के लिए कर सकते थे। HMA को जोड़ने के साथ, कुल पता स्थान लगभग 1.06 MB हो जाता है। हालांकि 80286 रीयल-मोड पतों को 20 बिट तक छोटा नहीं करता है, 80286 वाला सिस्टम 21वीं एड्रेस लाइन, ए 20 लाइन को गेट ऑफ करके प्रोसेसर के बाहरी हार्डवेयर के साथ ऐसा कर सकता है। IBM PC AT ने ऐसा करने के लिए हार्डवेयर प्रदान किया (मूल IBM PC और IBM PC/XT|PC/XT मॉडल के लिए सॉफ़्टवेयर के साथ पूर्ण पिछड़े संगतता के लिए), और इसलिए बाद के सभी IBM PC/AT-श्रेणी के PC क्लोनों ने भी किया।

286 संरक्षित मोड का उपयोग शायद ही कभी किया गया था क्योंकि यह 8086/88 मशीनों वाले उपयोगकर्ताओं के बड़े निकाय को बाहर कर देता था। इसके अलावा, यह अभी भी मेमोरी को 64k सेगमेंट में विभाजित करने की आवश्यकता है जैसे वास्तविक मोड में किया गया था। इस सीमा को 32-बिट सीपीयू पर काम किया जा सकता है जो आकार में 64k से अधिक मेमोरी पॉइंटर्स के उपयोग की अनुमति देता है, हालांकि सेगमेंट लिमिट फ़ील्ड केवल 24-बिट लंबा है, जो अधिकतम सेगमेंट आकार बनाया जा सकता है वह 16MB है (यद्यपि पेजिंग अधिक मेमोरी आवंटित करने के लिए उपयोग किया जा सकता है, कोई भी व्यक्तिगत खंड 16MB से अधिक नहीं हो सकता है)। इस पद्धति का उपयोग आमतौर पर विंडोज 3.x अनुप्रयोगों पर फ्लैट मेमोरी स्पेस बनाने के लिए किया जाता था, हालांकि ओएस अभी भी 16-बिट था, 32-बिट निर्देशों के साथ एपीआई कॉल नहीं की जा सकती थी। इस प्रकार, 64k सेगमेंट में एपीआई कॉल करने वाले सभी कोड को रखना अभी भी आवश्यक था।

एक बार 286 संरक्षित मोड लागू हो जाने के बाद, इसे हार्डवेयर रीसेट करने के अलावा बाहर नहीं निकाला जा सकता है। बढ़ती आईबीएम पीसी/एटी मानक का पालन करने वाली मशीनें मानकीकृत कीबोर्ड नियंत्रक के माध्यम से सीपीयू को रीसेट करने का ढोंग कर सकती हैं, लेकिन यह काफी सुस्त था। विंडोज़ 3.x ने सीपीयू के इंटरप्ट-हैंडलिंग मैकेनिज्म में जानबूझकर ट्रिपल दोष को ट्रिगर करके इन दोनों समस्याओं के आसपास काम किया, जिससे सीपीयू वास्तविक मोड में वापस आ जाएगा, लगभग तुरंत।[3]


विस्तृत विभाजन इकाई कार्यप्रवाह

एक तार्किक पते में 16-बिट खंड चयनकर्ता (13 + 1 पता बिट्स की आपूर्ति) और 16-बिट ऑफ़सेट होता है। खंड चयनकर्ता को खंड रजिस्टरों में से एक में स्थित होना चाहिए। उस चयनकर्ता में 2-बिट रिक्वेस्ट्ड प्रिविलेज लेवल (RPL), 1-बिट टेबल इंडिकेटर (TI) और 13-बिट इंडेक्स होता है।

किसी दिए गए लॉजिकल एड्रेस के एड्रेस ट्रांसलेशन का प्रयास करते समय, प्रोसेसर 64-बिट खंड वर्णनकर्ता स्ट्रक्चर को या तो ग्लोबल डिस्क्रिप्टर टेबल से पढ़ता है जब TI = 0 या स्थानीय वर्णनकर्ता तालिका जब TI = 1 होता है। यह तब विशेषाधिकार जांच करता है:

मैक्स (सीपीएल,  आरपीएल) ≤ डीपीएल

जहाँ CPL वर्तमान विशेषाधिकार स्तर है (CS रजिस्टर के निचले 2 बिट्स में पाया जाता है), RPL खंड चयनकर्ता से अनुरोधित विशेषाधिकार स्तर है, और DPL खंड का वर्णनकर्ता विशेषाधिकार स्तर है (विवरणकर्ता में पाया जाता है)। सभी विशेषाधिकार स्तर 0-3 की सीमा में पूर्णांक हैं, जहाँ सबसे कम संख्या उच्चतम विशेषाधिकार से मेल खाती है।

यदि असमानता गलत है, तो प्रोसेसर एक सामान्य सुरक्षा दोष | सामान्य सुरक्षा (GP) दोष उत्पन्न करता है। अन्यथा, पता अनुवाद जारी रहता है। प्रोसेसर तब 32-बिट या 16-बिट ऑफ़सेट लेता है और इसकी तुलना सेगमेंट डिस्क्रिप्टर में निर्दिष्ट सेगमेंट लिमिट से करता है। यदि यह बड़ा है, तो जीपी दोष उत्पन्न होता है। अन्यथा, प्रोसेसर 24-बिट खंड आधार जोड़ता है, वर्णनकर्ता में निर्दिष्ट, ऑफ़सेट में, एक रेखीय भौतिक पता बनाता है।

विशेषाधिकार जांच केवल तब की जाती है जब सेगमेंट रजिस्टर लोड हो जाता है, क्योंकि सेगमेंट डिस्क्रिप्टर को सेगमेंट रजिस्टरों के छिपे हुए हिस्सों में कैश किया जाता है।[citation needed][1]


80386 संरक्षित मोड

इंटेल 80386 और बाद में, संरक्षित मोड 80286 संरक्षित मोड के विभाजन तंत्र को बरकरार रखता है, लेकिन विभाजन इकाई और भौतिक बस के बीच पता अनुवाद की दूसरी परत के रूप में एक पेजिंग इकाई को जोड़ा गया है। इसके अलावा, महत्वपूर्ण बात यह है कि एड्रेस ऑफ़सेट 32-बिट (16-बिट के बजाय) हैं, और प्रत्येक सेगमेंट डिस्क्रिप्टर में सेगमेंट बेस भी 32-बिट (24-बिट के बजाय) है। विभाजन इकाई का सामान्य संचालन अन्यथा अपरिवर्तित है। पृष्ठन इकाई सक्षम या अक्षम हो सकती है; यदि अक्षम किया गया है, तो संचालन 80286 के समान है। यदि पेजिंग इकाई सक्षम है, तो खंड में पते अब भौतिक पते के बजाय आभासी पते हैं, जैसा कि वे 80286 पर थे। और अंतिम 32-बिट पता दो को जोड़कर प्राप्त विभाजन इकाई सभी आभासी (या तार्किक) पते हैं जब पेजिंग इकाई सक्षम होती है। जब विभाजन इकाई इन 32-बिट आभासी पतों को उत्पन्न और मान्य करती है, तो सक्षम पेजिंग इकाई अंत में इन आभासी पतों को भौतिक पतों में बदल देती है। Intel 80386 पर भौतिक पते 32-बिट हैं, लेकिन नए प्रोसेसर पर बड़े हो सकते हैं जो भौतिक पता एक्सटेंशन का समर्थन करते हैं।

80386 ने चार खंड रजिस्टरों (सीएस, डीएस, ईएस, और एसएस) के मूल सेट में दो नए सामान्य-उद्देश्य डेटा खंड रजिस्टर, एफएस और जीएस भी पेश किए।

एक 386 CPU को CR0 नियंत्रण रजिस्टर में थोड़ा सा साफ़ करके वास्तविक मोड में वापस रखा जा सकता है, हालाँकि सुरक्षा और मजबूती को लागू करने के लिए यह एक विशेषाधिकार प्राप्त ऑपरेशन है। तुलना के माध्यम से, एक 286 को केवल प्रोसेसर रीसेट के लिए मजबूर करके वास्तविक मोड में लौटाया जा सकता है, उदा। ट्रिपल फॉल्ट या बाहरी हार्डवेयर का उपयोग करके।

बाद के घटनाक्रम

x86-64 आर्किटेक्चर लंबे मोड (64-बिट मोड) में सेगमेंटेशन का उपयोग नहीं करता है। सेगमेंट रजिस्टरों में से चार, सीएस, एसएस, डीएस, और ईएस, आधार पता 0 और 2 की सीमा के लिए मजबूर हैं64</सुप>. खंड रजिस्टर FS और GS में अभी भी एक गैर-शून्य आधार पता हो सकता है। यह ऑपरेटिंग सिस्टम को इन सेगमेंट को विशेष उद्देश्यों के लिए उपयोग करने की अनुमति देता है। विरासत मोड द्वारा उपयोग किए जाने वाले वैश्विक विवरणक तालिका तंत्र के विपरीत, इन खंडों का आधार पता मॉडल-विशिष्ट रजिस्टर में संग्रहीत होता है। x86-64 आर्किटेक्चर विशेष SWAPGS निर्देश प्रदान करता है, जो कर्नेल मोड और उपयोगकर्ता मोड बेस पतों को स्वैप करने की अनुमति देता है।

उदाहरण के लिए, x86-64 पर Microsoft Windows जीएस सेगमेंट का उपयोग Win32 थ्रेड सूचना ब्लॉक को इंगित करने के लिए करता है, प्रत्येक थ्रेड (कंप्यूटर विज्ञान) के लिए एक छोटी डेटा संरचना, जिसमें अपवाद हैंडलिंग, थ्रेड-स्थानीय चर और अन्य प्रति- के बारे में जानकारी शामिल है। थ्रेड स्टेट। इसी तरह, लिनक्स कर्नेल प्रति-सीपीयू डेटा स्टोर करने के लिए जीएस सेगमेंट का उपयोग करता है।

GS/FS का उपयोग जीएनयू संकलक संग्रह के थ्रेड-लोकल स्टोरेज और बफर ओवरफ्लो प्रोटेक्शन#GNU कम्पाइलर कलेक्शन .28GCC.29|कैनरी-बेस्ड स्टैक प्रोटेक्टर में भी किया जाता है।

अभ्यास

तार्किक पतों को x86 असेंबली भाषा में स्पष्ट रूप से निर्दिष्ट किया जा सकता है, उदा। (एटी एंड टी सिंटैक्स):

movl $42, %fs:(%eax); स्थानांतरण भाषा पंजीकृत करें  में M[fs:eax]<-42) के बराबर

या इंटेल सिंटैक्स में:

mov dword [fs:eax], 42

हालाँकि, खंड रजिस्टरों का उपयोग आमतौर पर निहित रूप से किया जाता है।

  • सभी सीपीयू निर्देश सीएस रजिस्टर में रखे गए सेगमेंट चयनकर्ता द्वारा निर्दिष्ट कोड सेगमेंट से निहित रूप से प्राप्त किए जाते हैं।
  • अधिकांश स्मृति संदर्भ डीएस रजिस्टर में रखे गए खंड चयनकर्ता द्वारा निर्दिष्ट डेटा खंड से आते हैं। ये ES रजिस्टर में रखे गए खंड चयनकर्ता द्वारा निर्दिष्ट अतिरिक्त खंड से भी आ सकते हैं, यदि एक खंड-ओवरराइड उपसर्ग उस निर्देश से पहले आता है जो स्मृति संदर्भ बनाता है। अधिकांश, लेकिन सभी नहीं, निर्देश जो डिफ़ॉल्ट रूप से DS का उपयोग करते हैं, एक ES ओवरराइड उपसर्ग को स्वीकार करेंगे।
  • प्रोसेसर रन-टाइम स्टैक संदर्भ, या तो निहित रूप से (जैसे 'पुश' और 'पॉप' निर्देश) या स्पष्ट रूप से (स्टैक-आधारित मेमोरी आवंटन | (ई) एसपी या (ई) बीपी रजिस्टरों का उपयोग करके मेमोरी एक्सेस) निर्दिष्ट स्टैक सेगमेंट का उपयोग करें SS रजिस्टर में मौजूद सेगमेंट सिलेक्टर द्वारा।
  • x86 स्ट्रिंग निर्देश (जैसे 'stos', 'movs'), डेटा सेगमेंट के साथ, ES रजिस्टर में रखे गए सेगमेंट चयनकर्ता द्वारा निर्दिष्ट अतिरिक्त सेगमेंट का भी उपयोग करते हैं।

विभाजन को x86-32 प्रोसेसर पर बंद नहीं किया जा सकता है (यह 64-बिट मोड के लिए भी सही है, लेकिन चर्चा के दायरे से परे है), इतने सारे 32-बिट ऑपरेटिंग सिस्टम सभी सेगमेंट के बेस को 0 पर सेट करके एक फ्लैट मेमोरी मॉडल का अनुकरण करते हैं। विभाजन को कार्यक्रमों के प्रति तटस्थ बनाने के लिए। उदाहरण के लिए, लिनक्स कर्नेल केवल 4 सामान्य प्रयोजन खंड स्थापित करता है:

Name Description Base Limit DPL
__KERNEL_CS Kernel code segment 0 4 GiB 0
__KERNEL_DS Kernel data segment 0 4 GiB 0
__USER_CS User code segment 0 4 GiB 3
__USER_DS User data segment 0 4 GiB 3

चूंकि आधार सभी मामलों में 0 पर सेट है और 4 GiB की सीमा है, पेजिंग इकाई पर पहुंचने से पहले विभाजन इकाई कार्यक्रम के मुद्दों को प्रभावित नहीं करती है। (यह निश्चित रूप से 80386 और बाद के प्रोसेसर को संदर्भित करता है, क्योंकि पहले के x86 प्रोसेसर में पेजिंग यूनिट नहीं है।)

वर्तमान लिनक्स थ्रेड-लोकल स्टोरेज को इंगित करने के लिए जीएस का भी उपयोग करता है।

सेगमेंट को कोड, डेटा या सिस्टम सेगमेंट के रूप में परिभाषित किया जा सकता है। सेगमेंट को केवल पढ़ने, पढ़ने/लिखने, निष्पादित करने आदि के लिए अतिरिक्त अनुमति बिट मौजूद हैं।

संरक्षित मोड में, कोड हमेशा सीएस (कोड सेगमेंट चयनकर्ता) को छोड़कर सभी सेगमेंट रजिस्टरों को संशोधित कर सकता है। ऐसा इसलिए है क्योंकि प्रोसेसर का वर्तमान विशेषाधिकार स्तर (CPL) CS रजिस्टर के निचले 2 बिट्स में संग्रहीत है। प्रोसेसर विशेषाधिकार स्तर (और CS को पुनः लोड करने) को बढ़ाने का एकमात्र तरीका 'lcall' (दूर कॉल) और INT (x86 निर्देश) | 'int' (व्यवधान) निर्देश हैं। इसी तरह, विशेषाधिकार स्तर (और सीएस को पुनः लोड करने) को कम करने का एकमात्र तरीका 'lret' (दूर वापसी) और 'iret' (व्यवधान वापसी) निर्देश हैं। वास्तविक मोड में, कोड दूर छलांग लगाकर (या एक गैर-दस्तावेजी का उपयोग करके) सीएस रजिस्टर को संशोधित भी कर सकता है POP CS 8086 या 8088 पर निर्देश)[4]). बेशक, वास्तविक मोड में, कोई विशेषाधिकार स्तर नहीं हैं; सभी प्रोग्रामों में सभी मेमोरी और सभी CPU निर्देशों तक पूर्ण अनियंत्रित पहुंच होती है।

विभाजन के बारे में अधिक जानकारी के लिए, एएमडी या इंटेल वेबसाइटों पर स्वतंत्र रूप से उपलब्ध आईए-32 मैनुअल देखें।

नोट्स और संदर्भ

  1. 1.0 1.1 "Intel 64 and IA-32 Architectures Software Developer's Manual", Volume 3, "System Programming Guide", published in 2011, Page "Vol. 3A 3-11", the book is written: "Every segment register has a “visible” part and a “hidden” part. (The hidden part is sometimes referred to as a “descriptor cache” or a “shadow register.”) When a segment selector is loaded into the visible part of a segment register, the processor also loads the hidden part of the segment register with the base address, segment limit, and access control information from the segment descriptor pointed to by the segment selector. The information cached in the segment register (visible and hidden) allows the processor to translate addresses without taking extra bus cycles to read the base address and limit from the segment descriptor."
  2. Intel Corporation (2004). IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture (PDF).
  3. "DevBlogs".
  4. POP CS must be used with extreme care and has limited usefulness, because it immediately changes the effective address that will be computed from the instruction pointer to fetch the next instruction. Generally, a far jump is much more useful. The existence of POP CS is probably an accident, as it follows a pattern of PUSH and POP instruction opcodes for the four segment registers on the 8086 and 8088.

यह भी देखें

बाहरी संबंध