X86 CPU केवल 4 में से 2 रिंगों का उपयोग क्यों करते हैं?


13

तो या तो लिनक्स या विंडोज आधारित x86 सिस्टम केवल कर्नेल मोड के लिए रिंग 0 और उपयोगकर्ता मोड के लिए रिंग 3 का उपयोग करते हैं। क्यों प्रोसेसर भी चार अलग-अलग रिंगों को भेद करते हैं यदि वे सभी को उनमें से सिर्फ दो का उपयोग करके समाप्त करते हैं? और यह AMD64 वास्तुकला पर बदल गया है?


वैसे, मेरा सुझाव है कि प्रश्न शीर्षक को "क्यों x86 ऑपरेटिंग सिस्टम केवल 4 रिंगों में से 2 का उपयोग करता है?" या हो सकता है "क्यों x86 CPUs पर OS केवल ..." सीपीयू केवल वही करता है जो ओएस उसे करने के लिए कहता है।
जेमी हनराहन

जवाबों:


16

इसके दो प्राथमिक कारण हैं।

पहला कारण यह है कि, हालाँकि x86 CPU मेमोरी प्रोटेक्शन के चार वलय प्रदान करते हैं, पर सुरक्षा की ग्रेन्युलैरिटी की पेशकश प्रति-सेगमेंट स्तर पर ही होती है। यही है, प्रत्येक खंड को 0 से 3 तक एक विशिष्ट अंगूठी ("विशेषाधिकार स्तर") पर सेट किया जा सकता है, साथ ही अन्य सुरक्षा जैसे कि लेखन-अक्षम। लेकिन कई खंड वर्णनकर्ता उपलब्ध नहीं हैं। अधिकांश ऑपरेटिंग सिस्टम मेमोरी प्रोटेक्शन की अधिक महीनता चाहते हैं। जैसे ... व्यक्तिगत पृष्ठों के लिए।

इसलिए, पृष्ठ तालिका प्रविष्टियों (PTE) के आधार पर सुरक्षा दर्ज करें। अधिकांश नहीं तो सभी आधुनिक x86 ऑपरेटिंग सिस्टम कम या ज्यादा सेगमेंटिंग तंत्र को अनदेखा करते हैं (जितना वे कर सकते हैं, वैसे भी) और पीटीई-आधारित सुरक्षा पर भरोसा करते हैं। यह ध्वज बिट्स द्वारा निर्दिष्ट है जो प्रत्येक पीटीई में निचले 12 बिट्स हैं - सीपीयू पर प्लस 63 जो नो-एक्जीक्यूट का समर्थन करते हैं। प्रत्येक पृष्ठ के लिए एक PTE है, जो सामान्य रूप से 4K है।

उन ध्वज बिट्स में से एक को "विशेषाधिकार प्राप्त" बिट कहा जाता है। यह बिट नियंत्रित करता है कि प्रोसेसर को पृष्ठ तक पहुंचने के लिए "विशेषाधिकार प्राप्त" स्तरों में से एक में होना है या नहीं। "विशेषाधिकार प्राप्त" स्तर पीएल 0, 1, और 2 हैं। लेकिन यह सिर्फ एक बिट है, इसलिए पृष्ठ-दर-पृष्ठ संरक्षण स्तर पर "मोड" की संख्या जहां तक ​​स्मृति संरक्षण का संबंध है, वह सिर्फ दो है: एक पृष्ठ गैर-विशेषाधिकार प्राप्त मोड से पहुँचा जा सकता है, या नहीं। इसलिए सिर्फ दो रिंग।

प्रत्येक पृष्ठ के लिए चार संभव रिंग होने के लिए, उन्हें प्रत्येक पेज टेबल एंट्री में दो प्रोटेक्शन बिट्स रखने होंगे, जो कि चार संभावित रिंग नंबरों में से एक को एनकोड करने के लिए (जैसा कि सेगमेंट डिस्क्रिप्टर करते हैं)। वे नहीं करते।

दूसरा कारण ओएस पोर्टेबिलिटी का लक्ष्य है। यह सिर्फ x86 के बारे में नहीं है; यूनिक्स ने हमें सिखाया कि एक ओएस कई प्रोसेसर आर्किटेक्चर के लिए अपेक्षाकृत पोर्टेबल हो सकता है, और यह एक अच्छी बात थी। और कुछ प्रोसेसर केवल दो रिंग का समर्थन करते हैं। आर्किटेक्चर में कई रिंगों के आधार पर नहीं, ओएस के कार्यान्वयनकर्ताओं ने ओएस को अधिक पोर्टेबल बना दिया।

एक तीसरा कारण है जो विंडोज एनटी विकास के लिए विशिष्ट है। NT के डिज़ाइनर (डेविड कटलर और उनकी टीम, जिन्हें Microsoft ने DEC वेस्टर्न रीजन लैब्स से दूर रखा था) को VMS पर व्यापक पिछला अनुभव था; वास्तव में, कटलर और कुछ अन्य वीएमएस के मूल डिजाइनरों में से थे। और VAX प्रोसेसर जिसके लिए VMS डिजाइन किया गया था (और इसके विपरीत) में चार रिंग हैं। VMS चार रिंग का उपयोग करता है। (वास्तव में VAX में PTE में चार प्रोटेक्शन बिट्स हैं, जो "केवल-उपयोगकर्ता मोड से रीड-ओनली, लेकिन रिंग 2 और इनरवेयर से राइट करने योग्य है" जैसे संयोजनों की अनुमति देता है।

लेकिन वीएमएस के छल्ले 1 और 2 (रिकॉर्ड मैनेजमेंट सर्विसेज और सीएलआई, रिस्पांस) में चलने वाले घटक एनटी डिजाइन से बचे थे। वीएमएस में रिंग 2 वास्तव में ओएस सुरक्षा के बारे में नहीं था, बल्कि उपयोगकर्ता के सीएलआई पर्यावरण को एक कार्यक्रम से दूसरे कार्यक्रम में संरक्षित करने के बारे में था, और विंडोज एनटी में बस यह अवधारणा नहीं थी; सीएलआई एक सामान्य प्रक्रिया के रूप में चलता है। वीएमएस की अंगूठी 1 के लिए, रिंग 1 में आरएमएस कोड को अक्सर 0 में अंगूठी में कॉल करना पड़ता था, और रिंग संक्रमण महंगा होता है। यह केवल रिंग 0 पर जाने के लिए कहीं अधिक कुशल निकला और रिंग 1 कोड के भीतर रिंग के बहुत सारे बदलाव होने के बजाय इसके साथ किया गया। (फिर से नहीं कि NT के पास वैसे भी RMS जैसा कुछ भी नहीं है।)

लेकिन वे वहां क्यों हैं? जैसा कि x86 ने चार रिंगों को क्यों लागू किया, जबकि OSs ने उनका उपयोग नहीं किया - आप x86 की तुलना में कहीं अधिक हालिया डिज़ाइन के OS के बारे में बात कर रहे हैं। X86 के बहुत सारे "सिस्टम प्रोग्रामिंग" फीचर्स NT या सच्चे यूनिक्स-ईश गुठली पर लंबे समय से पहले डिजाइन किए गए थे, और वे वास्तव में नहीं जानते थे कि ओएस क्या उपयोग करेगा। (यह तब तक नहीं था जब तक हमें x86 पर पेजिंग नहीं मिली - जो कि 80386 तक नहीं दिखाई दी - कि हम जमीन से मेमोरी मैनेजमेंट को रीथिंक किए बिना सही यूनिक्स-ईश या वीएमएस जैसे कर्नेल लागू कर सकते हैं ।)

न केवल आधुनिक x86 OS बड़े पैमाने पर सेगमेंटिंग को अनदेखा करते हैं (वे आधार पते 0 और 4 जीबी के आकार के साथ सी, डी और एस सेगमेंट सेट करते हैं; एफ और जी सेगमेंट कभी-कभी मुख्य ओएस डेटा संरचनाओं को इंगित करने के लिए उपयोग किए जाते हैं), वे भी बड़े पैमाने पर "कार्य राज्य क्षेत्रों" जैसी चीजों को अनदेखा करें। TSS तंत्र स्पष्ट रूप से थ्रेड संदर्भ स्विचिंग के लिए डिज़ाइन किया गया था, लेकिन यह बहुत अधिक दुष्प्रभाव है, इसलिए आधुनिक x86 OS इसे "हाथ से" करते हैं। केवल समय x86 NT हार्डवेयर कार्यों को बदलता है, उदाहरण के लिए, कुछ सही मायने में असाधारण स्थितियों के लिए है, एक दोहरे दोष अपवाद की तरह।

पुनः x64, इन अप्रयुक्त सुविधाओं का एक बहुत कुछ छोड़ दिया गया था। (अपने क्रेडिट के लिए, एएमडी ने वास्तव में ओएस कर्नेल टीमों से बात की और पूछा कि उन्हें x86 से क्या चाहिए, उन्हें क्या ज़रूरत नहीं थी या क्या नहीं चाहिए, और वे क्या चाहते हैं।) x64 पर खंड केवल उसी में मौजूद हैं जो हो सकता है। वेस्टीजियल फॉर्म, टास्क स्टेट स्विचिंग मौजूद नहीं है, आदि और ओएस सिर्फ दो रिंग का उपयोग करना जारी रखते हैं।


1
धन्यवाद! (यदि आप नहीं बता सकते हैं, तो मैंने वीएमएस कर्नेल के आसपास थोड़ा अधिक समय बिताया ...)
जेमी हन्रहान

हाँ, मुझे यह आभास हुआ ... :-) मुझे बहुत अच्छा लगा जब किसी को आप जैसे किसी चीज़ का गहरा ज्ञान इस तरह का उत्तर लिखने में मिला, यह आईटी का इतिहास है, और मुझे यह जानना अच्छा लगता है। आपके उत्तर ने मुझे याद किया जब मैं 20 साल पहले स्कूल में एक लड़का था, और मैंने "इंटेल 80268 प्रोग्रामर संदर्भ मैनुअल" और फिर 386 संदर्भ मैनुअल खरीदा। मैंने सुरक्षा के छल्ले के बारे में बहुत कुछ पढ़ा ... लेकिन वास्तव में उनके साथ कुछ भी नहीं किया। बस कुछ सरल x86 कोडांतरक प्रोग्रामिंग ... फिर टर्बो पास्कल, फिर C / C ++, जावा ... और अंत में .Net पिछले 13 वर्षों के लिए :-)
मैक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.