X86 मेमोरी सेगमेंटेशन: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{short description|Implementation of memory segmentation on Intel x86}} | {{short description|Implementation of memory segmentation on Intel x86}} | ||
x[[86]] [[ स्मृति विभाजन ]] इंटेल x86 कंप्यूटर [[ निर्देश सेट वास्तुकला ]] में | x[[86]] [[ स्मृति विभाजन ]] इंटेल x86 कंप्यूटर [[ निर्देश सेट वास्तुकला ]] में स्मृति विभाजन के कार्यान्वयन को संदर्भित करता है। 1978 में [[Index.php?title=इंटेल 8086|इंटेल 8086]] पर विभाजन की शुरुआत की गई थी, ताकि कार्यक्रमों को 64 KB (65,536 [[बाइट]]स) से अधिक स्मृति को संबोधित करने की अनुमति मिल सके। [[Intel 80286|इंटेल 80286]] ने 1982 में विभाजन का दूसरा संस्करण पेश किया जिसमें [[ आभासी मेमोरी | आभासी स्मृति]] और स्मृति सुरक्षा के लिए समर्थन जोड़ा गया। इस बिंदु पर मूल प्रणाली का नाम बदलकर [[वास्तविक मोड|वास्तविक प्रणाली]] कर दिया गया था, और नए संस्करण को संरक्षित प्रणाली नाम दिया गया था। 2003 में पेश किए गए [[x86-64]] संरचना ने 64-अंश प्रणाली में विभाजन के लिए काफी हद तक समर्थन छोड़ दिया है। | ||
वास्तविक और संरक्षित दोनों | वास्तविक और संरक्षित दोनों प्रणाली में, वास्तविक स्मृति एड्रेस प्राप्त करने के लिए सिस्टम 16-अंश ''सेगमेंट रजिस्टर'' का उपयोग करता है। वास्तविक प्रणाली में, CS, DS, SS और ES रजिस्टर वर्तमान में उपयोग किए गए प्रोग्राम [[ कोड खंड ]] (CS), वर्तमान [[डेटा खंड]] (DS), वर्तमान [[कॉल स्टैक]] (SS), और एक ''अतिरिक्त'' सेगमेंट की ओर इशारा करते हैं। प्रोग्रामर (ईएस) द्वारा निर्धारित। 1985 में पेश किया गया [[Intel 80386]], दो अतिरिक्त खंड रजिस्टर, FS और GS जोड़ता है, जिसमें हार्डवेयर द्वारा परिभाषित कोई विशिष्ट उपयोग नहीं है। जिस तरह से सेगमेंट रजिस्टरों का उपयोग किया जाता है, वह दो प्रणाली के बीच भिन्न होता है।<ref name=Arch /> | ||
क्रियान्वित किए जा रहे कार्य के अनुसार खंड की पसंद आमतौर पर प्रोसेसर द्वारा डिफॉल्ट की जाती है। निर्देश हमेशा कोड सेगमेंट से प्राप्त किए जाते हैं। कोई भी स्टैक पुश या पॉप या कोई भी डेटा संदर्भ जो स्टैक का जिक्र करता है, स्टैक सेगमेंट का उपयोग करता है। डेटा के अन्य सभी संदर्भ डेटा सेगमेंट का उपयोग करते हैं। अतिरिक्त खंड स्ट्रिंग संचालन के लिए डिफ़ॉल्ट गंतव्य है (उदाहरण के लिए MOVS या CMPS)। एफएस और जीएस के पास हार्डवेयर-असाइन किए गए उपयोग नहीं हैं। निर्देश प्रारूप एक वैकल्पिक खंड उपसर्ग बाइट की अनुमति देता है जिसका उपयोग वांछित होने पर चयनित निर्देशों के लिए डिफ़ॉल्ट खंड को ओवरराइड करने के लिए किया जा सकता है।<ref>{{cite book|last=Intel Corporation|title=IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture|date=2004|url=http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf}}</ref> | क्रियान्वित किए जा रहे कार्य के अनुसार खंड की पसंद आमतौर पर प्रोसेसर द्वारा डिफॉल्ट की जाती है। निर्देश हमेशा कोड सेगमेंट से प्राप्त किए जाते हैं। कोई भी स्टैक पुश या पॉप या कोई भी डेटा संदर्भ जो स्टैक का जिक्र करता है, स्टैक सेगमेंट का उपयोग करता है। डेटा के अन्य सभी संदर्भ डेटा सेगमेंट का उपयोग करते हैं। अतिरिक्त खंड स्ट्रिंग संचालन के लिए डिफ़ॉल्ट गंतव्य है (उदाहरण के लिए MOVS या CMPS)। एफएस और जीएस के पास हार्डवेयर-असाइन किए गए उपयोग नहीं हैं। निर्देश प्रारूप एक वैकल्पिक खंड उपसर्ग बाइट की अनुमति देता है जिसका उपयोग वांछित होने पर चयनित निर्देशों के लिए डिफ़ॉल्ट खंड को ओवरराइड करने के लिए किया जा सकता है।<ref>{{cite book|last=Intel Corporation|title=IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture|date=2004|url=http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf}}</ref> | ||
== रियल | == रियल प्रणाली == | ||
[[Image:Overlapping realmode segments.svg|thumb|right|300px|वास्तविक | [[Image:Overlapping realmode segments.svg|thumb|right|300px|वास्तविक प्रणाली स्मृति में तीन खंड (विस्तार करने के लिए चित्र पर क्लिक करें)। सेगमेंट 2 और सेगमेंट 3 के बीच ओवरलैप है; फ़िरोज़ा क्षेत्र में बाइट्स का उपयोग दोनों खंड चयनकर्ताओं से किया जा सकता है।]]रियल प्रणाली या [[वर्चुअल 8086 मोड|वर्चुअल 8086 प्रणाली]] में, सेगमेंट का आकार 1 बाइट से लेकर 65,536 बाइट (16-अंश ऑफ़सेट का उपयोग करके) तक हो सकता है। | ||
सेगमेंट रजिस्टर में 16- | सेगमेंट रजिस्टर में 16-अंश सेगमेंट चयनकर्ता को एक रैखिक 20-अंश एड्रेस के सबसे महत्वपूर्ण 16 अंश्स के रूप में व्याख्या किया जाता है, जिसे सेगमेंट एड्रेस कहा जाता है, जिसमें से शेष चार सबसे कम महत्वपूर्ण अंश सभी शून्य हैं। खंड पता हमेशा एक रेखीय पता प्राप्त करने के निर्देश में 16-अंश ऑफ़सेट में जोड़ा जाता है, जो इस प्रणाली में भौतिक पते के समान होता है। उदाहरण के लिए, खंडित पता 06EFh:1234h (यहाँ प्रत्यय h का अर्थ [[हेक्साडेसिमल]] है) में 06EFh का एक खंड चयनकर्ता है, जो 06EF0h के एक खंड पते का प्रतिनिधित्व करता है, जिसमें ऑफसेट जोड़ा जाता है, जिससे रैखिक पता 06EF0h + 1234h = 08124h प्राप्त होता है। | ||
{| | {| | ||
Line 31: | Line 31: | ||
जिस तरह से सेगमेंट एड्रेस और ऑफ़सेट जोड़े जाते हैं, उसके कारण एक सिंगल लीनियर एड्रेस को 2 तक मैप किया जा सकता है<sup>12</sup> = 4096 विशिष्ट खंड: ऑफ़सेट जोड़े। उदाहरण के लिए, रैखिक पता 08124h में खंडित पते हो सकते हैं 06EFh:1234h, 0812h:0004h, 0000h:8124h, आदि। | जिस तरह से सेगमेंट एड्रेस और ऑफ़सेट जोड़े जाते हैं, उसके कारण एक सिंगल लीनियर एड्रेस को 2 तक मैप किया जा सकता है<sup>12</sup> = 4096 विशिष्ट खंड: ऑफ़सेट जोड़े। उदाहरण के लिए, रैखिक पता 08124h में खंडित पते हो सकते हैं 06EFh:1234h, 0812h:0004h, 0000h:8124h, आदि। | ||
यह अद्वितीय एड्रेसिंग योजनाओं के आदी प्रोग्रामरों के लिए भ्रमित करने वाला हो सकता है, लेकिन इसका उपयोग लाभ के लिए भी किया जा सकता है, उदाहरण के लिए कई नेस्टेड डेटा संरचनाओं को संबोधित करते समय। जबकि वास्तविक | यह अद्वितीय एड्रेसिंग योजनाओं के आदी प्रोग्रामरों के लिए भ्रमित करने वाला हो सकता है, लेकिन इसका उपयोग लाभ के लिए भी किया जा सकता है, उदाहरण के लिए कई नेस्टेड डेटा संरचनाओं को संबोधित करते समय। जबकि वास्तविक प्रणाली सेगमेंट हमेशा 64 [[किलोबाइट]] लंबे होते हैं, व्यावहारिक प्रभाव केवल यह है कि कोई भी सेगमेंट 64 केबी से अधिक लंबा नहीं हो सकता है, इसके बजाय प्रत्येक सेगमेंट 64 केबी लंबा होना चाहिए। क्योंकि वास्तविक प्रणाली में कोई सुरक्षा या विशेषाधिकार सीमा नहीं है, भले ही एक खंड को 64 केबी से छोटा परिभाषित किया जा सकता है, फिर भी यह पूरी तरह से कार्यक्रमों पर निर्भर करेगा कि वे समन्वय करें और अपने खंडों की सीमा के भीतर रखें, जैसा कि कोई भी कार्यक्रम कर सकता है हमेशा किसी भी स्मृति तक पहुंचें (चूंकि यह मनमाने ढंग से खंड चयनकर्ताओं को बिना किसी पर्यवेक्षण के खंड पते बदलने के लिए सेट कर सकता है)। इसलिए, 1 से 65,536 बाइट्स की सीमा में प्रत्येक खंड के लिए एक चर लंबाई होने के रूप में वास्तविक प्रणाली की कल्पना की जा सकती है, जो कि सीपीयू द्वारा लागू नहीं किया गया है। | ||
(रैखिक पते के प्रमुख शून्य, खंडित पते, और खंड और ऑफसेट फ़ील्ड स्पष्टता के लिए यहां दिखाए गए हैं। वे आमतौर पर छोड़े जाते हैं।) | (रैखिक पते के प्रमुख शून्य, खंडित पते, और खंड और ऑफसेट फ़ील्ड स्पष्टता के लिए यहां दिखाए गए हैं। वे आमतौर पर छोड़े जाते हैं।) | ||
वास्तविक | वास्तविक प्रणाली का प्रभावी 20-अंश [[ पता स्थान ]] [[ स्मृति पता ]] को 2 तक सीमित करता है<sup>20</sup> बाइट, या 1,048,576 बाइट (1 [[मेगाबाइट]])। यह सीधे Intel 8086 (और, बाद में, निकट से संबंधित 8088) के हार्डवेयर डिज़ाइन से प्राप्त हुआ, जिसमें ठीक 20 [[ पता बस ]] थी। (दोनों को 40-पिन डीआईपी पैकेज में पैक किया गया था; केवल 20 एड्रेस लाइन के साथ भी, एड्रेस और डेटा बस को सीमित पिन काउंट के भीतर सभी एड्रेस और डेटा लाइन को फिट करने के लिए मल्टीप्लेक्स किया गया था।) | ||
प्रत्येक खंड रेखीय (सपाट) पता स्थान की शुरुआत से 16 बाइट्स के गुणक से शुरू होता है, जिसे एक पैराग्राफ कहा जाता है। यानी 16 बाइट के अंतराल पर। चूंकि सभी सेगमेंट 64 केबी लंबे हैं, यह बताता है कि सेगमेंट के बीच ओवरलैप कैसे हो सकता है और लीनियर | प्रत्येक खंड रेखीय (सपाट) पता स्थान की शुरुआत से 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- | 16-अंश वास्तविक प्रणाली में, कई स्मृति सेगमेंट का उपयोग करने के लिए एप्लिकेशन को सक्षम करना (किसी एक 64K-सेगमेंट में उपलब्ध स्मृति से अधिक स्मृति तक पहुंचने के लिए) काफी जटिल है, लेकिन इसे सभी के लिए एक आवश्यक बुराई के रूप में देखा गया था लेकिन सबसे छोटे उपकरण ( जो कम स्मृति के साथ कर सकता है)। समस्या की जड़ यह है कि संपूर्ण स्मृति रेंज के फ्लैट एड्रेसिंग के लिए उपयुक्त कोई उपयुक्त पता-अंकगणितीय निर्देश उपलब्ध नहीं हैं।{{Citation needed|date=July 2011}} कई निर्देशों को लागू करने से फ्लैट एड्रेसिंग संभव है, जो हालांकि धीमे प्रोग्राम की ओर ले जाता है। | ||
[[x86 मेमोरी मॉडल]] अवधारणा खंड रजिस्टरों के सेटअप से निकली है। उदाहरण के लिए, छोटे मॉडल CS=DS=SS में, यानी प्रोग्राम का कोड, डेटा और स्टैक सभी एक ही 64 KB सेगमेंट में समाहित हैं। छोटे | [[x86 मेमोरी मॉडल|x86 स्मृति मॉडल]] अवधारणा खंड रजिस्टरों के सेटअप से निकली है। उदाहरण के लिए, छोटे मॉडल CS=DS=SS में, यानी प्रोग्राम का कोड, डेटा और स्टैक सभी एक ही 64 KB सेगमेंट में समाहित हैं। छोटे स्मृति मॉडल DS=SS में, इसलिए डेटा और स्टैक दोनों एक ही सेगमेंट में रहते हैं; सीएस 64 केबी तक के अलग कोड सेगमेंट की ओर इशारा करता है। | ||
== संरक्षित | == संरक्षित प्रणाली == | ||
[[Image:Protected mode segments.svg|thumb|300px|left|स्थानीय डिस्क्रिप्टर तालिका के साथ संरक्षित | [[Image:Protected mode segments.svg|thumb|300px|left|स्थानीय डिस्क्रिप्टर तालिका के साथ संरक्षित प्रणाली स्मृति में तीन खंड (विस्तार करने के लिए छवि पर क्लिक करें)।]] | ||
=== 80286 संरक्षित | === 80286 संरक्षित प्रणाली === | ||
Intel 80286 का संरक्षित | Intel 80286 का संरक्षित प्रणाली प्रोसेसर के एड्रेस स्पेस को 2 तक बढ़ा देता है<sup>24</sup> बाइट्स (16 मेगाबाइट्स), लेकिन शिफ्ट वैल्यू को समायोजित करके नहीं। इसके बजाय, 16-अंश सेगमेंट रजिस्टरों में अब 24-अंश बेस एड्रेस वाले [[खंड वर्णनकर्ता]] की तालिका में एक इंडेक्स होता है जिसमें ऑफ़सेट जोड़ा जाता है। पुराने सॉफ़्टवेयर का समर्थन करने के लिए, प्रोसेसर वास्तविक प्रणाली में शुरू होता है, एक ऐसा प्रणाली जिसमें यह 8086 के खंडित एड्रेसिंग मॉडल का उपयोग करता है। हालांकि एक छोटा सा अंतर है: परिणामी भौतिक पता अब 20 अंश तक छोटा नहीं किया जाता है, इसलिए वास्तविक प्रणाली पॉइंटर्स (लेकिन 8086 पॉइंटर्स नहीं) अब 100000 के बीच के पतों को संदर्भित कर सकते हैं<sub>16</sub> और 10FFEF<sub>16</sub>. स्मृति के लगभग 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 संरक्षित | 286 संरक्षित प्रणाली का उपयोग शायद ही कभी किया गया था क्योंकि यह 8086/88 मशीनों वाले उपयोगकर्ताओं के बड़े निकाय को बाहर कर देता था। इसके अलावा, यह अभी भी स्मृति को 64k सेगमेंट में विभाजित करने [[की]] आवश्यकता है जैसे वास्तविक प्रणाली में किया गया था। इस सीमा को 32-अंश सीपीयू पर काम किया जा सकता है जो आकार में 64k से अधिक स्मृति पॉइंटर्स के उपयोग की अनुमति देता है, हालांकि सेगमेंट लिमिट फ़ील्ड केवल 24-अंश लंबा है, जो अधिकतम सेगमेंट आकार बनाया जा सकता है वह 16MB है (यद्यपि पेजिंग अधिक स्मृति आवंटित करने के लिए उपयोग किया जा सकता है, कोई भी व्यक्तिगत खंड 16MB से अधिक नहीं हो सकता है)। इस पद्धति का उपयोग आमतौर पर विंडोज 3.x अनुप्रयोगों पर फ्लैट स्मृति स्पेस बनाने के लिए किया जाता था, हालांकि ओएस अभी भी 16-अंश था, 32-अंश निर्देशों के साथ एपीआई कॉल नहीं की जा सकती थी। इस प्रकार, 64k सेगमेंट में एपीआई कॉल करने वाले सभी कोड को रखना अभी भी आवश्यक था। | ||
एक बार 286 संरक्षित | एक बार 286 संरक्षित प्रणाली लागू हो जाने के बाद, इसे हार्डवेयर रीसेट करने के अलावा बाहर नहीं निकाला जा सकता है। बढ़ती आईबीएम पीसी/एटी मानक का पालन करने वाली मशीनें मानकीकृत कीबोर्ड नियंत्रक के माध्यम से सीपीयू को रीसेट करने का ढोंग कर सकती हैं, लेकिन यह काफी सुस्त था। विंडोज़ 3.x ने सीपीयू के इंटरप्ट-हैंडलिंग मैकेनिज्म में जानबूझकर [[ ट्रिपल दोष ]] को ट्रिगर करके इन दोनों समस्याओं के आसपास काम किया, जिससे सीपीयू वास्तविक प्रणाली में वापस आ जाएगा, लगभग तुरंत।<ref>{{Cite web|url=http://blogs.msdn.com/b/larryosterman/archive/2005/02/08/369243.aspx|title = DevBlogs}}</ref> | ||
=== विस्तृत विभाजन इकाई कार्यप्रवाह === | === विस्तृत विभाजन इकाई कार्यप्रवाह === | ||
एक तार्किक पते में 16- | एक तार्किक पते में 16-अंश खंड चयनकर्ता (13 + 1 पता अंश्स की आपूर्ति) और 16-अंश ऑफ़सेट होता है। खंड चयनकर्ता को खंड रजिस्टरों में से एक में स्थित होना चाहिए। उस चयनकर्ता में 2-अंश रिक्वेस्ट्ड प्रिविलेज लेवल (RPL), 1-अंश टेबल इंडिकेटर (TI) और 13-अंश इंडेक्स होता है। | ||
किसी दिए गए लॉजिकल एड्रेस के एड्रेस ट्रांसलेशन का प्रयास करते समय, प्रोसेसर 64- | किसी दिए गए लॉजिकल एड्रेस के एड्रेस ट्रांसलेशन का प्रयास करते समय, प्रोसेसर 64-अंश [[ खंड वर्णनकर्ता ]] स्ट्रक्चर को या तो [[ग्लोबल डिस्क्रिप्टर टेबल]] से पढ़ता है जब TI = 0 या [[ स्थानीय वर्णनकर्ता तालिका ]] जब TI = 1 होता है। यह तब विशेषाधिकार जांच करता है: | ||
: मैक्स (सीपीएल, आरपीएल) ≤ डीपीएल | : मैक्स (सीपीएल, आरपीएल) ≤ डीपीएल | ||
जहाँ CPL वर्तमान [[विशेषाधिकार स्तर]] है (CS रजिस्टर के निचले 2 | जहाँ CPL वर्तमान [[विशेषाधिकार स्तर]] है (CS रजिस्टर के निचले 2 अंश्स में पाया जाता है), RPL खंड चयनकर्ता से अनुरोधित विशेषाधिकार स्तर है, और DPL खंड का वर्णनकर्ता विशेषाधिकार स्तर है (विवरणकर्ता में पाया जाता है)। सभी विशेषाधिकार स्तर 0-3 की सीमा में पूर्णांक हैं, जहाँ सबसे कम संख्या उच्चतम विशेषाधिकार से मेल खाती है। | ||
यदि असमानता गलत है, तो प्रोसेसर एक सामान्य सुरक्षा दोष | सामान्य सुरक्षा (GP) दोष उत्पन्न करता है। अन्यथा, पता अनुवाद जारी रहता है। प्रोसेसर तब 32- | यदि असमानता गलत है, तो प्रोसेसर एक सामान्य सुरक्षा दोष | सामान्य सुरक्षा (GP) दोष उत्पन्न करता है। अन्यथा, पता अनुवाद जारी रहता है। प्रोसेसर तब 32-अंश या 16-अंश ऑफ़सेट लेता है और इसकी तुलना सेगमेंट डिस्क्रिप्टर में निर्दिष्ट सेगमेंट लिमिट से करता है। यदि यह बड़ा है, तो जीपी दोष उत्पन्न होता है। अन्यथा, प्रोसेसर 24-अंश खंड आधार जोड़ता है, वर्णनकर्ता में निर्दिष्ट, ऑफ़सेट में, एक रेखीय भौतिक पता बनाता है। | ||
विशेषाधिकार जांच केवल तब की जाती है जब सेगमेंट रजिस्टर लोड हो जाता है, क्योंकि सेगमेंट डिस्क्रिप्टर को सेगमेंट रजिस्टरों के छिपे हुए हिस्सों में कैश किया जाता है।{{Citation needed|date=July 2011|reason=Is this true on the 80286, or only on the 80386 and above?}}<ref name=Arch>"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.''"</ref> | विशेषाधिकार जांच केवल तब की जाती है जब सेगमेंट रजिस्टर लोड हो जाता है, क्योंकि सेगमेंट डिस्क्रिप्टर को सेगमेंट रजिस्टरों के छिपे हुए हिस्सों में कैश किया जाता है।{{Citation needed|date=July 2011|reason=Is this true on the 80286, or only on the 80386 and above?}}<ref name=Arch>"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.''"</ref> | ||
=== 80386 संरक्षित | === 80386 संरक्षित प्रणाली === | ||
इंटेल 80386 और बाद में, संरक्षित | इंटेल 80386 और बाद में, संरक्षित प्रणाली 80286 संरक्षित प्रणाली के विभाजन तंत्र को बरकरार रखता है, लेकिन विभाजन इकाई और भौतिक बस के बीच पता अनुवाद की दूसरी परत के रूप में एक [[पेजिंग]] इकाई को जोड़ा गया है। इसके अलावा, महत्वपूर्ण बात यह है कि एड्रेस ऑफ़सेट 32-अंश (16-अंश के बजाय) हैं, और प्रत्येक सेगमेंट डिस्क्रिप्टर में सेगमेंट बेस भी 32-अंश (24-अंश के बजाय) है। विभाजन इकाई का सामान्य संचालन अन्यथा अपरिवर्तित है। पृष्ठन इकाई सक्षम या अक्षम हो सकती है; यदि अक्षम किया गया है, तो संचालन 80286 के समान है। यदि पेजिंग इकाई सक्षम है, तो खंड में पते अब भौतिक पते के बजाय आभासी पते हैं, जैसा कि वे 80286 पर थे। और अंतिम 32-अंश पता दो को जोड़कर प्राप्त विभाजन इकाई सभी आभासी (या तार्किक) पते हैं जब पेजिंग इकाई सक्षम होती है। जब विभाजन इकाई इन 32-अंश आभासी पतों को उत्पन्न और मान्य करती है, तो सक्षम पेजिंग इकाई अंत में इन आभासी पतों को भौतिक पतों में बदल देती है। Intel 80386 पर भौतिक पते 32-अंश हैं, लेकिन नए प्रोसेसर पर बड़े हो सकते हैं जो भौतिक पता एक्सटेंशन का समर्थन करते हैं। | ||
80386 ने चार खंड रजिस्टरों (सीएस, डीएस, ईएस, और एसएस) के मूल सेट में दो नए सामान्य-उद्देश्य डेटा खंड रजिस्टर, एफएस और जीएस भी पेश किए। | 80386 ने चार खंड रजिस्टरों (सीएस, डीएस, ईएस, और एसएस) के मूल सेट में दो नए सामान्य-उद्देश्य डेटा खंड रजिस्टर, एफएस और जीएस भी पेश किए। | ||
एक 386 CPU को CR0 नियंत्रण रजिस्टर में थोड़ा सा साफ़ करके वास्तविक | एक 386 CPU को CR0 नियंत्रण रजिस्टर में थोड़ा सा साफ़ करके वास्तविक प्रणाली में वापस रखा जा सकता है, हालाँकि सुरक्षा और मजबूती को लागू करने के लिए यह एक विशेषाधिकार प्राप्त ऑपरेशन है। तुलना के माध्यम से, एक 286 को केवल प्रोसेसर रीसेट के लिए मजबूर करके वास्तविक प्रणाली में लौटाया जा सकता है, उदा। ट्रिपल फॉल्ट या बाहरी हार्डवेयर का उपयोग करके। | ||
== बाद के घटनाक्रम == | == बाद के घटनाक्रम == | ||
x86-64 | x86-64 संरचना लंबे प्रणाली (64-अंश प्रणाली) में विभाजन का उपयोग नहीं करता है। सेगमेंट रजिस्टरों में से चार, सीएस, एसएस, डीएस, और ईएस, आधार पता 0 और 2 की सीमा के लिए मजबूर हैं<sup>64</सुप>. खंड रजिस्टर FS और GS में अभी भी एक गैर-शून्य आधार पता हो सकता है। यह ऑपरेटिंग सिस्टम को इन सेगमेंट को विशेष उद्देश्यों के लिए उपयोग करने की अनुमति देता है। विरासत प्रणाली द्वारा उपयोग किए जाने वाले वैश्विक विवरणक तालिका तंत्र के विपरीत, इन खंडों का आधार पता [[मॉडल-विशिष्ट रजिस्टर]] में संग्रहीत होता है। x86-64 संरचना विशेष SWAPGS निर्देश प्रदान करता है, जो [[कर्नेल मोड|कर्नेल प्रणाली]] और [[उपयोगकर्ता मोड|उपयोगकर्ता प्रणाली]] बेस पतों को स्वैप करने की अनुमति देता है। | ||
उदाहरण के लिए, x86-64 पर [[Microsoft Windows]] जीएस सेगमेंट का उपयोग [[Win32 थ्रेड सूचना ब्लॉक]] को इंगित करने के लिए करता है, प्रत्येक थ्रेड (कंप्यूटर विज्ञान) के लिए एक छोटी डेटा संरचना, जिसमें अपवाद हैंडलिंग, थ्रेड-स्थानीय चर और अन्य प्रति- के बारे में जानकारी शामिल है। थ्रेड स्टेट। इसी तरह, [[लिनक्स कर्नेल]] प्रति-सीपीयू डेटा स्टोर करने के लिए जीएस सेगमेंट का उपयोग करता है। | उदाहरण के लिए, x86-64 पर [[Microsoft Windows]] जीएस सेगमेंट का उपयोग [[Win32 थ्रेड सूचना ब्लॉक]] को इंगित करने के लिए करता है, प्रत्येक थ्रेड (कंप्यूटर विज्ञान) के लिए एक छोटी डेटा संरचना, जिसमें अपवाद हैंडलिंग, थ्रेड-स्थानीय चर और अन्य प्रति- के बारे में जानकारी शामिल है। थ्रेड स्टेट। इसी तरह, [[लिनक्स कर्नेल]] प्रति-सीपीयू डेटा स्टोर करने के लिए जीएस सेगमेंट का उपयोग करता है। | ||
Line 92: | Line 92: | ||
* सभी सीपीयू निर्देश सीएस रजिस्टर में रखे गए सेगमेंट चयनकर्ता द्वारा निर्दिष्ट कोड सेगमेंट से निहित रूप से प्राप्त किए जाते हैं। | * सभी सीपीयू निर्देश सीएस रजिस्टर में रखे गए सेगमेंट चयनकर्ता द्वारा निर्दिष्ट कोड सेगमेंट से निहित रूप से प्राप्त किए जाते हैं। | ||
* अधिकांश स्मृति संदर्भ डीएस रजिस्टर में रखे गए खंड चयनकर्ता द्वारा निर्दिष्ट डेटा खंड से आते हैं। ये ES रजिस्टर में रखे गए खंड चयनकर्ता द्वारा निर्दिष्ट अतिरिक्त खंड से भी आ सकते हैं, यदि एक खंड-ओवरराइड उपसर्ग उस निर्देश से पहले आता है जो स्मृति संदर्भ बनाता है। अधिकांश, लेकिन सभी नहीं, निर्देश जो डिफ़ॉल्ट रूप से DS का उपयोग करते हैं, एक ES ओवरराइड उपसर्ग को स्वीकार करेंगे। | * अधिकांश स्मृति संदर्भ डीएस रजिस्टर में रखे गए खंड चयनकर्ता द्वारा निर्दिष्ट डेटा खंड से आते हैं। ये ES रजिस्टर में रखे गए खंड चयनकर्ता द्वारा निर्दिष्ट अतिरिक्त खंड से भी आ सकते हैं, यदि एक खंड-ओवरराइड उपसर्ग उस निर्देश से पहले आता है जो स्मृति संदर्भ बनाता है। अधिकांश, लेकिन सभी नहीं, निर्देश जो डिफ़ॉल्ट रूप से DS का उपयोग करते हैं, एक ES ओवरराइड उपसर्ग को स्वीकार करेंगे। | ||
* प्रोसेसर [[रन-टाइम स्टैक]] संदर्भ, या तो निहित रूप से (जैसे 'पुश' और 'पॉप' निर्देश) या स्पष्ट रूप से ([[स्टैक-आधारित मेमोरी आवंटन]] | (ई) एसपी या (ई) बीपी रजिस्टरों का उपयोग करके | * प्रोसेसर [[रन-टाइम स्टैक]] संदर्भ, या तो निहित रूप से (जैसे 'पुश' और 'पॉप' निर्देश) या स्पष्ट रूप से ([[स्टैक-आधारित मेमोरी आवंटन|स्टैक-आधारित स्मृति आवंटन]] | (ई) एसपी या (ई) बीपी रजिस्टरों का उपयोग करके स्मृति एक्सेस) निर्दिष्ट स्टैक सेगमेंट का उपयोग करें SS रजिस्टर में मौजूद सेगमेंट सिलेक्टर द्वारा। | ||
* [[x86 स्ट्रिंग निर्देश]] (जैसे 'stos', 'movs'), डेटा सेगमेंट के साथ, ES रजिस्टर में रखे गए सेगमेंट चयनकर्ता द्वारा निर्दिष्ट अतिरिक्त सेगमेंट का भी उपयोग करते हैं। | * [[x86 स्ट्रिंग निर्देश]] (जैसे 'stos', 'movs'), डेटा सेगमेंट के साथ, ES रजिस्टर में रखे गए सेगमेंट चयनकर्ता द्वारा निर्दिष्ट अतिरिक्त सेगमेंट का भी उपयोग करते हैं। | ||
विभाजन को x86-32 प्रोसेसर पर बंद नहीं किया जा सकता है (यह 64- | विभाजन को x86-32 प्रोसेसर पर बंद नहीं किया जा सकता है (यह 64-अंश प्रणाली के लिए भी सही है, लेकिन चर्चा के दायरे से परे है), इतने सारे 32-अंश ऑपरेटिंग सिस्टम सभी सेगमेंट के बेस को 0 पर सेट करके एक [[फ्लैट मेमोरी मॉडल|फ्लैट स्मृति मॉडल]] का अनुकरण करते हैं। विभाजन को कार्यक्रमों के प्रति तटस्थ बनाने के लिए। उदाहरण के लिए, लिनक्स कर्नेल केवल 4 सामान्य प्रयोजन खंड स्थापित करता है: | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 113: | Line 113: | ||
वर्तमान लिनक्स थ्रेड-लोकल स्टोरेज को इंगित करने के लिए जीएस का भी उपयोग करता है। | वर्तमान लिनक्स थ्रेड-लोकल स्टोरेज को इंगित करने के लिए जीएस का भी उपयोग करता है। | ||
सेगमेंट को कोड, डेटा या सिस्टम सेगमेंट के रूप में परिभाषित किया जा सकता है। सेगमेंट को केवल पढ़ने, पढ़ने/लिखने, निष्पादित करने आदि के लिए अतिरिक्त अनुमति | सेगमेंट को कोड, डेटा या सिस्टम सेगमेंट के रूप में परिभाषित किया जा सकता है। सेगमेंट को केवल पढ़ने, पढ़ने/लिखने, निष्पादित करने आदि के लिए अतिरिक्त अनुमति अंश मौजूद हैं। | ||
संरक्षित | संरक्षित प्रणाली में, कोड हमेशा सीएस (कोड सेगमेंट चयनकर्ता) को छोड़कर सभी सेगमेंट रजिस्टरों को संशोधित कर सकता है। ऐसा इसलिए है क्योंकि प्रोसेसर का वर्तमान विशेषाधिकार स्तर (CPL) CS रजिस्टर के निचले 2 अंश्स में संग्रहीत है। प्रोसेसर विशेषाधिकार स्तर (और CS को पुनः लोड करने) को बढ़ाने का एकमात्र तरीका 'lcall' (दूर कॉल) और INT (x86 निर्देश) | 'int' (व्यवधान) निर्देश हैं। इसी तरह, विशेषाधिकार स्तर (और सीएस को पुनः लोड करने) को कम करने का एकमात्र तरीका 'lret' (दूर वापसी) और 'iret' (व्यवधान वापसी) निर्देश हैं। वास्तविक प्रणाली में, कोड दूर छलांग लगाकर (या एक गैर-दस्तावेजी का उपयोग करके) सीएस रजिस्टर को संशोधित भी कर सकता है <code>POP CS</code> 8086 या 8088 पर निर्देश)<ref><code>POP CS</code> 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 <code>POP CS</code> 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.</ref>). बेशक, वास्तविक प्रणाली में, कोई विशेषाधिकार स्तर नहीं हैं; सभी प्रोग्रामों में सभी स्मृति और सभी CPU निर्देशों तक पूर्ण अनियंत्रित पहुंच होती है। | ||
विभाजन के बारे में अधिक जानकारी के लिए, [[एएमडी]] या [[इंटेल]] वेबसाइटों पर स्वतंत्र रूप से उपलब्ध [[आईए-32]] मैनुअल देखें। | विभाजन के बारे में अधिक जानकारी के लिए, [[एएमडी]] या [[इंटेल]] वेबसाइटों पर स्वतंत्र रूप से उपलब्ध [[आईए-32]] मैनुअल देखें। | ||
Line 123: | Line 123: | ||
== यह भी देखें == | == यह भी देखें == | ||
* x86 | * x86 स्मृति मॉडल | ||
* [[मल्टीप्रोग्रामिंग सिस्टम]] | * [[मल्टीप्रोग्रामिंग सिस्टम]] | ||
* [[स्प्लिट ऑक्टल]] | * [[स्प्लिट ऑक्टल]] |
Revision as of 12:02, 28 April 2023
x86 स्मृति विभाजन इंटेल x86 कंप्यूटर निर्देश सेट वास्तुकला में स्मृति विभाजन के कार्यान्वयन को संदर्भित करता है। 1978 में इंटेल 8086 पर विभाजन की शुरुआत की गई थी, ताकि कार्यक्रमों को 64 KB (65,536 बाइटस) से अधिक स्मृति को संबोधित करने की अनुमति मिल सके। इंटेल 80286 ने 1982 में विभाजन का दूसरा संस्करण पेश किया जिसमें आभासी स्मृति और स्मृति सुरक्षा के लिए समर्थन जोड़ा गया। इस बिंदु पर मूल प्रणाली का नाम बदलकर वास्तविक प्रणाली कर दिया गया था, और नए संस्करण को संरक्षित प्रणाली नाम दिया गया था। 2003 में पेश किए गए x86-64 संरचना ने 64-अंश प्रणाली में विभाजन के लिए काफी हद तक समर्थन छोड़ दिया है।
वास्तविक और संरक्षित दोनों प्रणाली में, वास्तविक स्मृति एड्रेस प्राप्त करने के लिए सिस्टम 16-अंश सेगमेंट रजिस्टर का उपयोग करता है। वास्तविक प्रणाली में, CS, DS, SS और ES रजिस्टर वर्तमान में उपयोग किए गए प्रोग्राम कोड खंड (CS), वर्तमान डेटा खंड (DS), वर्तमान कॉल स्टैक (SS), और एक अतिरिक्त सेगमेंट की ओर इशारा करते हैं। प्रोग्रामर (ईएस) द्वारा निर्धारित। 1985 में पेश किया गया Intel 80386, दो अतिरिक्त खंड रजिस्टर, FS और GS जोड़ता है, जिसमें हार्डवेयर द्वारा परिभाषित कोई विशिष्ट उपयोग नहीं है। जिस तरह से सेगमेंट रजिस्टरों का उपयोग किया जाता है, वह दो प्रणाली के बीच भिन्न होता है।[1]
क्रियान्वित किए जा रहे कार्य के अनुसार खंड की पसंद आमतौर पर प्रोसेसर द्वारा डिफॉल्ट की जाती है। निर्देश हमेशा कोड सेगमेंट से प्राप्त किए जाते हैं। कोई भी स्टैक पुश या पॉप या कोई भी डेटा संदर्भ जो स्टैक का जिक्र करता है, स्टैक सेगमेंट का उपयोग करता है। डेटा के अन्य सभी संदर्भ डेटा सेगमेंट का उपयोग करते हैं। अतिरिक्त खंड स्ट्रिंग संचालन के लिए डिफ़ॉल्ट गंतव्य है (उदाहरण के लिए MOVS या CMPS)। एफएस और जीएस के पास हार्डवेयर-असाइन किए गए उपयोग नहीं हैं। निर्देश प्रारूप एक वैकल्पिक खंड उपसर्ग बाइट की अनुमति देता है जिसका उपयोग वांछित होने पर चयनित निर्देशों के लिए डिफ़ॉल्ट खंड को ओवरराइड करने के लिए किया जा सकता है।[2]
रियल प्रणाली
रियल प्रणाली या वर्चुअल 8086 प्रणाली में, सेगमेंट का आकार 1 बाइट से लेकर 65,536 बाइट (16-अंश ऑफ़सेट का उपयोग करके) तक हो सकता है।
सेगमेंट रजिस्टर में 16-अंश सेगमेंट चयनकर्ता को एक रैखिक 20-अंश एड्रेस के सबसे महत्वपूर्ण 16 अंश्स के रूप में व्याख्या किया जाता है, जिसे सेगमेंट एड्रेस कहा जाता है, जिसमें से शेष चार सबसे कम महत्वपूर्ण अंश सभी शून्य हैं। खंड पता हमेशा एक रेखीय पता प्राप्त करने के निर्देश में 16-अंश ऑफ़सेट में जोड़ा जाता है, जो इस प्रणाली में भौतिक पते के समान होता है। उदाहरण के लिए, खंडित पता 06EFh:1234h (यहाँ प्रत्यय h का अर्थ हेक्साडेसिमल है) में 06EFh का एक खंड चयनकर्ता है, जो 06EF0h के एक खंड पते का प्रतिनिधित्व करता है, जिसमें ऑफसेट जोड़ा जाता है, जिससे रैखिक पता 06EF0h + 1234h = 08124h प्राप्त होता है।
0000 0110 1110 1111 0000
|
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.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."
- ↑ Intel Corporation (2004). IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture (PDF).
- ↑ "DevBlogs".
- ↑
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 ofPOP 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.
यह भी देखें
- x86 स्मृति मॉडल
- मल्टीप्रोग्रामिंग सिस्टम
- स्प्लिट ऑक्टल