ऑपरेटिंग सिस्टम में उपयोगकर्ता और कर्नेल मोड के बीच अंतर क्या है?


104

उपयोगकर्ता मोड और कर्नेल मोड में क्या अंतर हैं, आप उनमें से किसी एक को क्यों और कैसे सक्रिय करते हैं, और उनके उपयोग के मामले क्या हैं?



1
@ CiroSantilli709 大 六四 事件 法轮功 question एक सवाल जो 7 साल पहले पूछा गया था वह 6 साल पहले पूछे गए एक प्रश्न के लिए एक डुप्लिकेट के रूप में बंद नहीं किया जा सकता है। यदि वे वास्तव में डुप्लिकेट हैं, तो बंद होने के आसपास अन्य तरीका होना चाहिए।
साल्वाडोर डाली

2
@ साल्वाडोरडाली हाय, वर्तमान सहमति "गुणवत्ता" को बंद करना है: meta.stackexchange.com/questions/147643/… चूँकि "गुणवत्ता" औसत दर्जे का नहीं है, मैं सिर्फ upvotes के द्वारा जाता हूँ। ;-) संभवतः यह नीचे आता है कि किस प्रश्न ने शीर्षक पर सर्वश्रेष्ठ newb Google कीवर्ड मारा। मैं आपको प्रोत्साहित करता हूं कि आप अपने उत्तर को नीचे दिए गए अस्वीकरण के साथ कॉपी करें, और इसे बंद करने की स्थिति में, इस लिंक से लिंक करें।
सिरो सेंटिल्ली 郝海东 冠状 i i

जवाबों:


143
  1. कर्नेल मोड

    कर्नेल मोड में, निष्पादन कोड में अंतर्निहित हार्डवेयर तक पूर्ण और अप्रतिबंधित पहुंच होती है। यह किसी भी सीपीयू निर्देश को निष्पादित कर सकता है और किसी भी मेमोरी पते को संदर्भित कर सकता है। कर्नेल मोड आम तौर पर ऑपरेटिंग सिस्टम के सबसे भरोसेमंद कार्यों के लिए निम्नतम-स्तर के लिए आरक्षित होता है। कर्नेल मोड में दुर्घटनाएं विनाशकारी हैं; वे पूरे पीसी को रोक देंगे।

  2. उपयोगकर्ता मोड

    उपयोगकर्ता मोड में, निष्पादन कोड में सीधे हार्डवेयर या संदर्भ मेमोरी तक पहुंचने की क्षमता नहीं है। उपयोगकर्ता मोड में चल रहे कोड को हार्डवेयर या मेमोरी तक पहुंचने के लिए सिस्टम एपीआई को सौंपना होगा। इस तरह के अलगाव से सुरक्षा के कारण, उपयोगकर्ता मोड में क्रैश हमेशा पुनर्प्राप्त करने योग्य होते हैं। आपके कंप्यूटर पर चल रहे अधिकांश कोड उपयोगकर्ता मोड में निष्पादित होंगे।

अधिक पढ़ें

उपयोगकर्ता और कर्नेल मोड को समझना


आश्चर्य है कि जब सीपीयू ऑपरेटिंग सिस्टम कोड चला रहा है, तो प्रोसेसर किस मोड में है?
जैकीलेम

2
@ जैकीलीम: यह कर्नेल मोड में होना चाहिए।
kadina

तो प्रति से, उपयोगकर्ता अंतरिक्ष प्रक्रिया को चलाने के लिए , इसे कर्नेल स्थान पर मैप किया जाना चाहिए ?
रोज़ट्रेलर

@ वराह मुझे संदेह है कि संदर्भ मेमोरी उपयोगकर्ता मोड द्वारा प्राप्त की जा सकती है या डेटा के सबसे सरल हेरफेर से लावा जैसी भाषा में महंगा मोड बदल जाएगा।
माकी XIE

48

ये दो अलग-अलग मोड हैं जिनमें आपका कंप्यूटर काम कर सकता है। इससे पहले, जब कंप्यूटर एक बड़े कमरे की तरह थे, अगर कुछ दुर्घटनाग्रस्त हो जाता है - यह पूरे कंप्यूटर को रोक देता है। इसलिए कंप्यूटर आर्किटेक्ट इसे बदलने का फैसला करते हैं। आधुनिक माइक्रोप्रोसेसर कम से कम 2 अलग-अलग राज्यों में हार्डवेयर लागू करते हैं।

उपयोगकर्ता मोड:

  • मोड जहां सभी उपयोगकर्ता प्रोग्राम निष्पादित करते हैं। इसमें रैम और हार्डवेयर की सुविधा नहीं है। इसका कारण यह है क्योंकि यदि सभी प्रोग्राम कर्नेल मोड में चलते हैं, तो वे एक-दूसरे की मेमोरी को अधिलेखित करने में सक्षम होंगे। यदि इसे इनमें से किसी भी सुविधा तक पहुँचने की आवश्यकता है - यह अंतर्निहित API पर कॉल करता है। सिस्टम प्रक्रिया को छोड़कर खिड़कियों द्वारा शुरू की गई प्रत्येक प्रक्रिया उपयोगकर्ता मोड में चलती है।

कर्नेल मोड:

  • वह मोड जहां सभी कर्नेल प्रोग्राम निष्पादित होते हैं (विभिन्न ड्राइवर)। इसमें हर संसाधन और अंतर्निहित हार्डवेयर की पहुंच है। किसी भी सीपीयू निर्देश को निष्पादित किया जा सकता है और हर मेमोरी पते तक पहुँचा जा सकता है। यह मोड उन ड्राइवरों के लिए आरक्षित है जो न्यूनतम स्तर पर काम करते हैं

स्विच कैसे होता है।

उपयोगकर्ता मोड से कर्नेल मोड में स्विच सीपीयू द्वारा स्वचालित रूप से नहीं किया जाता है। सीपीयू इंटरप्ट (टाइमर, कीबोर्ड, आई / ओ) से बाधित है। जब व्यवधान उत्पन्न होता है, तो CPU चालू चल रहे प्रोग्राम को निष्पादित करना बंद कर देता है, कर्नेल मोड पर स्विच करता है, इंटरप्ट हैंडलर को निष्पादित करता है। यह हैंडलर सीपीयू की स्थिति बचाता है, अपने ऑपरेशन करता है, राज्य को पुनर्स्थापित करता है और उपयोगकर्ता मोड में लौटता है।

http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

http://en.wikipedia.org/wiki/Direct_memory_access

http://en.wikipedia.org/wiki/Interrupt_request


आश्चर्य है कि जब सीपीयू ऑपरेटिंग सिस्टम कोड चला रहा है, तो प्रोसेसर किस मोड में है?
जैकीलेम

1
@ जैकीलैम: कर्नेल मोड
अपूर्वा नेरलेकर

10

विंडोज चलाने वाले कंप्यूटर के प्रोसेसर में दो अलग-अलग मोड होते हैं: यूजर मोड और कर्नेल मोड। प्रोसेसर पर किस प्रकार का कोड चल रहा है, इसके आधार पर प्रोसेसर दो मोड के बीच स्विच करता है। अनुप्रयोग उपयोगकर्ता मोड में चलते हैं, और कोर ऑपरेटिंग सिस्टम घटक कर्नेल मोड में चलते हैं। जबकि कई ड्राइवर कर्नेल मोड में चलते हैं, कुछ ड्राइवर उपयोगकर्ता मोड में चल सकते हैं।

जब आप उपयोगकर्ता-मोड अनुप्रयोग प्रारंभ करते हैं, तो Windows अनुप्रयोग के लिए एक प्रक्रिया बनाता है। प्रक्रिया एक निजी वर्चुअल एड्रेस स्पेस और एक निजी हैंडल टेबल के साथ एप्लिकेशन प्रदान करती है। क्योंकि किसी अनुप्रयोग का वर्चुअल पता स्थान निजी है, एक अनुप्रयोग किसी अन्य अनुप्रयोग से संबंधित डेटा को परिवर्तित नहीं कर सकता है। प्रत्येक एप्लिकेशन अलगाव में चलता है, और यदि कोई एप्लिकेशन क्रैश हो जाता है, तो क्रैश उस एक एप्लिकेशन तक सीमित है। अन्य एप्लिकेशन और ऑपरेटिंग सिस्टम क्रैश से प्रभावित नहीं होते हैं।

निजी होने के अलावा, उपयोगकर्ता-मोड एप्लिकेशन का वर्चुअल पता स्थान सीमित है। उपयोगकर्ता मोड में चलने वाला प्रोसेसर वर्चुअल एड्रेस को एक्सेस नहीं कर सकता है जो ऑपरेटिंग सिस्टम के लिए आरक्षित हैं। उपयोगकर्ता-मोड एप्लिकेशन के वर्चुअल पता स्थान को सीमित करने से एप्लिकेशन को बदलने से रोका जा सकता है, और संभवतः हानिकारक, महत्वपूर्ण ऑपरेटिंग सिस्टम डेटा।

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

यदि आप एक Windows उपयोगकर्ता हैं, तो एक बार इस लिंक पर जाएं तो आपको अधिक मिलेगा।

उपयोगकर्ता मोड और कर्नेल मोड के बीच संचार


6

सीपीयू के छल्ले सबसे स्पष्ट अंतर हैं

X86 संरक्षित मोड में, CPU हमेशा 4 रिंग में से एक में होता है। लिनक्स कर्नेल केवल 0 और 3 का उपयोग करता है:

  • 0 कर्नेल के लिए
  • उपयोगकर्ताओं के लिए 3

यह कर्नेल बनाम उपयोगकर्ताभूमि की सबसे कठिन और तेज़ परिभाषा है।

क्यों लिनक्स 1 और 2 के छल्ले का उपयोग नहीं करता है: सीपीयू विशेषाधिकार के छल्ले: क्यों 1 और 2 के छल्ले का उपयोग नहीं किया जाता है?

वर्तमान रिंग कैसे निर्धारित की जाती है?

वर्तमान रिंग को इसके संयोजन द्वारा चुना गया है:

  • वैश्विक डिस्क्रिप्टर तालिका: जीडीटी प्रविष्टियों की इन-मेमोरी टेबल और प्रत्येक प्रविष्टि में एक फ़ील्ड होता है Privlजो रिंग को एनकोड करता है।

    LGDT इंस्ट्रक्शन वर्तमान डिस्क्रिप्टर टेबल पर पता सेट करता है।

    इसे भी देखें: http://wiki.osdev.org/Global_Descriptor_Table

  • खंड सीएस, डीएस, आदि को पंजीकृत करता है, जो जीडीटी में एक प्रविष्टि के सूचकांक को इंगित करता है।

    उदाहरण के लिए, CS = 0मतलब GDT की पहली प्रविष्टि वर्तमान में निष्पादन कोड के लिए सक्रिय है।

प्रत्येक अंगूठी क्या कर सकती है?

सीपीयू चिप को भौतिक रूप से बनाया गया है ताकि:

  • अंगूठी 0 कुछ भी कर सकती है

  • रिंग 3 कई निर्देश नहीं चला सकता है और कई रजिस्टरों को लिख सकता है, विशेष रूप से:

    • अपनी खुद की अंगूठी नहीं बदल सकते हैं! अन्यथा, यह खुद को अंगूठी 0 पर सेट कर सकता है और रिंग बेकार हो जाएगा।

      दूसरे शब्दों में, वर्तमान खंड वर्णनकर्ता को संशोधित नहीं कर सकता है , जो वर्तमान रिंग को निर्धारित करता है।

    • पृष्ठ तालिकाओं को संशोधित नहीं कर सकते: x86 पेजिंग कैसे काम करता है?

      दूसरे शब्दों में, सीआर 3 रजिस्टर को संशोधित नहीं किया जा सकता है, और पेजिंग स्वयं पेज तालिकाओं के संशोधन को रोकता है।

      यह एक प्रक्रिया को सुरक्षा कारणों के लिए अन्य प्रक्रियाओं की स्मृति को देखने से रोकता है / प्रोग्रामिंग कारणों में आसानी।

    • बाधित हैंडलर पंजीकृत नहीं कर सकते। इन्हें स्मृति स्थानों पर लिखकर कॉन्फ़िगर किया जाता है, जिसे पेजिंग द्वारा भी रोका जाता है।

      हैंडलर रिंग 0 में दौड़ते हैं, और सुरक्षा मॉडल को तोड़ देंगे।

      दूसरे शब्दों में, LGDT और LIDT निर्देशों का उपयोग नहीं कर सकते।

    • IO जैसे निर्देश inऔर नहीं कर सकता out, और इस तरह मनमाने ढंग से हार्डवेयर एक्सेस है।

      अन्यथा, उदाहरण के लिए, फ़ाइल अनुमति बेकार हो जाएगी यदि कोई भी प्रोग्राम डिस्क से सीधे पढ़ सकता है।

      माइकल पेटी के लिए अधिक सटीक धन्यवाद : यह वास्तव में ओएस के लिए रिंग 3 पर आईओ के निर्देशों की अनुमति देने के लिए संभव है, यह वास्तव में टास्क सेक्शन द्वारा नियंत्रित किया जाता है ।

      क्या संभव नहीं है रिंग 3 के लिए खुद को ऐसा करने की अनुमति देना अगर यह पहली जगह में नहीं था।

      लिनक्स हमेशा इसे नापसंद करता है। इसे भी देखें: लिनक्स TSS के माध्यम से हार्डवेयर संदर्भ स्विच का उपयोग क्यों नहीं करता है?

रिंगों के बीच प्रोग्राम और ऑपरेटिंग सिस्टम कैसे संक्रमण करते हैं?

  • जब CPU चालू होता है, तो यह रिंग 0 में प्रारंभिक प्रोग्राम चलाना शुरू कर देता है (अच्छी तरह से, लेकिन यह एक अच्छा सन्निकटन है)। आप इस प्रारंभिक कार्यक्रम को कर्नेल होने के रूप में सोच सकते हैं (लेकिन यह आमतौर पर एक बूटलोडर है जो तब कर्नेल को अभी भी रिंग 0 में कहता है )।

  • जब कोई उपयोगकर्ता प्रक्रिया इसके लिए कर्नेल को कुछ करना चाहता है जैसे किसी फ़ाइल में लिखना, यह एक निर्देश का उपयोग करता है जो कि एक बाधा उत्पन्न करता है जैसे कि int 0x80याsyscall कर्नेल को संकेत देना। x86-64 लिनक्स syscall हैलो दुनिया उदाहरण:

    .data
    hello_world:
        .ascii "hello world\n"
        hello_world_len = . - hello_world
    .text
    .global _start
    _start:
        /* write */
        mov $1, %rax
        mov $1, %rdi
        mov $hello_world, %rsi
        mov $hello_world_len, %rdx
        syscall
    
        /* exit */
        mov $60, %rax
        mov $0, %rdi
        syscall
    

    संकलित करें और चलाएं:

    as -o hello_world.o hello_world.S
    ld -o hello_world.out hello_world.o
    ./hello_world.out
    

    गिटहब ऊपर

    जब ऐसा होता है, CPU एक कॉलबैक हैंडलर को कॉल करता है जिसे कर्नेल बूट समय पर पंजीकृत करता है। यहां एक ठोस नंगेपन का उदाहरण है जो एक हैंडलर को पंजीकृत करता है और इसका उपयोग करता है

    यह हैंडलर रिंग 0 में चलता है, जो यह तय करता है कि कर्नेल इस क्रिया को करने देगा, एक्शन करेगा, और रिंग में यूजरलैंड प्रोग्राम को पुनः आरंभ करेगा 3. x86_64

  • जब execसिस्टम कॉल का उपयोग किया जाता है (या जब कर्नेल शुरू हो जाएगा/init ), कर्नेल नए यूजरलैंड प्रक्रिया के रजिस्टरों और मेमोरी को तैयार करता है, तो यह प्रवेश बिंदु पर कूदता है और सीपीयू को रिंग 3 में स्विच करता है

  • यदि प्रोग्राम कुछ शरारती करने की कोशिश करता है जैसे निषिद्ध रजिस्टर या मेमोरी एड्रेस (पेजिंग के कारण) को लिखने के लिए, सीपीयू रिंग 0 में कुछ कर्नेल कॉलबैक हैंडलर भी कहता है।

    लेकिन चूंकि यूजरलैंड शरारती था, इसलिए कर्नेल इस बार प्रक्रिया को मार सकता है, या इसे सिग्नल के साथ चेतावनी दे सकता है।

  • जब कर्नेल बूट होता है, तो यह कुछ निश्चित आवृत्ति के साथ एक हार्डवेयर घड़ी सेटअप करता है, जो समय-समय पर व्यवधान उत्पन्न करता है।

    यह हार्डवेयर क्लॉक रिंग 0 को चलाने वाले इंटरप्ट को जनरेट करता है, और इसे शेड्यूल करने की अनुमति देता है कि कौन सी यूजरलैंड उठती है।

    इस तरह, शेड्यूलिंग तब भी हो सकती है, जब प्रक्रियाएं कोई सिस्टम कॉल नहीं कर रही हैं।

कई छल्ले होने की बात क्या है?

कर्नेल और यूजरलैंड को अलग करने के दो प्रमुख लाभ हैं:

  • प्रोग्राम बनाना आसान है क्योंकि आप अधिक निश्चित हैं कि कोई दूसरे के साथ हस्तक्षेप नहीं करेगा। उदाहरण के लिए, एक उपयोगकर्ता प्रक्रिया को पेजिंग के कारण किसी अन्य प्रोग्राम की मेमोरी को ओवरराइट करने के बारे में चिंता करने की आवश्यकता नहीं है, और न ही किसी अन्य प्रक्रिया के लिए अमान्य स्थिति में हार्डवेयर डालने के बारे में।
  • यह अधिक सुरक्षित है। उदाहरण के लिए फ़ाइल अनुमतियां और मेमोरी पृथक्करण एक हैकिंग ऐप को आपके बैंक डेटा को पढ़ने से रोक सकते हैं। यह, ज़ाहिर है, कि आप कर्नेल पर भरोसा करते हैं।

इसके साथ कैसे खेलें?

मैंने एक नंगे धातु सेटअप का निर्माण किया है जो रिंगों में सीधे हेरफेर करने का एक अच्छा तरीका होना चाहिए: https://github.com/cirosantilli/x86-bare-metal-examples

मेरे पास दुर्भाग्य से एक उपयोगकर्ता के उदाहरण को बनाने के लिए धैर्य नहीं था, लेकिन मैं सेटअप पेजिंग के रूप में दूर तक गया था, इसलिए उपयोगकर्ताभूमि को व्यवहार्य होना चाहिए। मुझे एक पुल अनुरोध देखना अच्छा लगेगा।

वैकल्पिक रूप से, लिनक्स कर्नेल मॉड्यूल रिंग 0 में चलते हैं, इसलिए आप उनका उपयोग विशेषाधिकार प्राप्त संचालन को आज़माने के लिए कर सकते हैं, उदाहरण के लिए नियंत्रण रजिस्टर पढ़ें: नियंत्रण रजिस्टर को कैसे एक्सेस करें cr0, cr2, cr3 एक प्रोग्राम से? विभाजन की गलती हो रही है

यहाँ एक सुविधाजनक QEMU + बिल्डरोट सेटअप है जो आपके मेजबान को मारे बिना इसे आज़मा सकता है।

कर्नेल मॉड्यूल का नकारात्मक पक्ष यह है कि अन्य kthreads चल रहे हैं और आपके प्रयोगों में हस्तक्षेप कर सकते हैं। लेकिन सिद्धांत रूप में आप अपने कर्नेल मॉड्यूल के साथ सभी रुकावट संभाल सकते हैं और सिस्टम के मालिक हैं, जो वास्तव में एक दिलचस्प परियोजना होगी।

नेगेटिव रिंग्स

जबकि नकारात्मक रिंग्स वास्तव में इंटेल मैनुअल में संदर्भित नहीं होते हैं, वास्तव में सीपीयू मोड हैं जिनके पास रिंग 0 की तुलना में आगे की क्षमता है, और इसलिए "नेगेटिव रिंग" नाम के लिए एक अच्छा फिट है।

एक उदाहरण वर्चुअलाइजेशन में उपयोग किया जाने वाला हाइपरविजर मोड है।

अधिक जानकारी के लिए देखें:

एआरएम

एआरएम में, छल्ले को इसके बजाय अपवाद स्तर कहा जाता है, लेकिन मुख्य विचार समान रहते हैं।

ARMv8 में 4 अपवाद स्तर मौजूद हैं, जिनका आमतौर पर उपयोग किया जाता है:

  • EL0: उपयोगकर्ता क्षेत्र

  • EL1: कर्नेल (एआरएम शब्दावली में "पर्यवेक्षक")।

    svcनिर्देश (सुपरवाइजर कॉल) के साथ दर्ज किया गया , जिसे swi पहले एकीकृत असेंबली के रूप में जाना जाता था , जो कि लिनक्स सिस्टम कॉल करने के लिए उपयोग किया जाने वाला निर्देश है। नमस्ते दुनिया ARMv8 उदाहरण:

    hello.S

    .text
    .global _start
    _start:
        /* write */
        mov x0, 1
        ldr x1, =msg
        ldr x2, =len
        mov x8, 64
        svc 0
    
        /* exit */
        mov x0, 0
        mov x8, 93
        svc 0
    msg:
        .ascii "hello syscall v8\n"
    len = . - msg
    

    गिटहब ऊपर

    16.04 पर QEMU के साथ इसका परीक्षण करें:

    sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
    arm-linux-gnueabihf-as -o hello.o hello.S
    arm-linux-gnueabihf-ld -o hello hello.o
    qemu-arm hello
    

    यहां एक ठोस नंगेपन का उदाहरण है जो एक एसवीसी हैंडलर को पंजीकृत करता है और एक एसवीसी कॉल करता है

  • EL2: हाइपरविजर , उदाहरण के लिए Xen

    hvcनिर्देश (हाइपरविजर कॉल) के साथ दर्ज किया गया ।

    एक हाइपरविजर एक ओएस के लिए है, एक ओएस क्या उपयोगकर्ता के लिए है।

    उदाहरण के लिए, Xen आपको एक ही समय में एक ही सिस्टम पर कई OS जैसे कि Linux या Windows चलाने की अनुमति देता है, और यह OSes को एक दूसरे से सुरक्षा और डिबग की आसानी के लिए अलग करता है, ठीक वैसे ही जैसे कि लिनक्स उपयोगकर्ता कार्यक्रमों के लिए करता है।

    Hypervisers आज के क्लाउड बुनियादी ढांचे का एक महत्वपूर्ण हिस्सा हैं: वे कई सर्वरों को एक हार्डवेयर पर चलने की अनुमति देते हैं, हार्डवेयर उपयोग को हमेशा 100% के करीब रखते हैं और बहुत सारे पैसे बचाते हैं।

    उदाहरण के लिए AWS ने 2017 तक Xen का उपयोग किया जब इसके KVM के कदम ने समाचार बनाया

  • EL3: अभी तक एक और स्तर। TODO उदाहरण।

    smcनिर्देश (सुरक्षित मोड कॉल) के साथ दर्ज किया गया

ARMv8 वास्तुकला संदर्भ मॉडल DDI 0487C.a - अध्याय डी 1 - AArch64 सिस्टम स्तर प्रोग्रामर मॉडल - चित्रा D1-1 इस खूबसूरती से दिखाता है:

यहां छवि विवरण दर्ज करें

ARMv8.1 वर्चुअलाइजेशन होस्ट एक्सटेंशन्स (VHE) के आगमन के साथ ARM की स्थिति थोड़ी बदल गई । यह एक्सटेंशन कर्नेल को EL2 में कुशलतापूर्वक चलाने की अनुमति देता है:

यहां छवि विवरण दर्ज करें

VHE इसलिए बनाया गया था क्योंकि KVM जैसे लिनक्स-कर्नेल वर्चुअलाइजेशन सॉल्यूशन को ज़मीन पर अधिग्रहित किया गया है (उदाहरण के लिए देखें कि AWS 'KVM में ऊपर उल्लिखित है), क्योंकि अधिकांश क्लाइंट को केवल Linux VMs की आवश्यकता होती है, और जैसा कि आप कल्पना कर सकते हैं, सभी एक में होने के नाते प्रोजेक्ट, KVM सरल और संभावित रूप से Xen से अधिक कुशल है। तो अब मेजबान लिनक्स कर्नेल उन मामलों में हाइपरवाइजर के रूप में कार्य करता है।

ध्यान दें कि कैसे एआरएम, शायद hindight के लाभ के कारण, नकारात्मक स्तर की आवश्यकता के बिना x86 की तुलना में विशेषाधिकार स्तरों के लिए एक बेहतर नामकरण सम्मेलन है: 0 कम और 3 उच्चतम। उच्च स्तर कम लोगों की तुलना में अधिक बार बनाए जाते हैं।

वर्तमान ईएल को MRSनिर्देश के साथ समझा जा सकता है : वर्तमान निष्पादन मोड / अपवाद स्तर, आदि क्या है?

एआरएम को कार्यान्वयन के लिए अनुमति देने के लिए सभी अपवाद स्तरों की आवश्यकता नहीं है जो चिप क्षेत्र को बचाने के लिए सुविधा की आवश्यकता नहीं है। ARMv8 "अपवाद स्तर" कहते हैं:

कार्यान्वयन में अपवाद स्तर शामिल नहीं हो सकते हैं। सभी कार्यान्वयन में EL0 और EL1 शामिल होना चाहिए। EL2 और EL3 वैकल्पिक हैं।

Q1U उदाहरण के लिए EL1 में चूक, लेकिन EL2 और EL3 को कमांड लाइन विकल्पों के साथ सक्षम किया जा सकता है: qemu-system-anarch64 जब a1 पावर अप का अनुकरण करते हुए el1 में प्रवेश करता है

कोड स्निपेट्स ने उबंटू 18.10 पर परीक्षण किया।


1
चूँकि यह प्रश्न किसी भी OS के लिए विशिष्ट नहीं है, inऔर outरिंग 3 के लिए उपलब्ध हैं। TSS वर्तमान टास्क में एक IO अनुमति तालिका को सभी या विशिष्ट पोर्टों को पढ़ने / लिखने की अनुमति दे सकता है।
माइकल पेट

बेशक आप IOPL बिट्स को मान 3 पर सेट करते हैं तो रिंग 3 प्रोग्राम में पूर्ण पोर्ट एक्सेस है और TSS IO अनुमतियां लागू नहीं होती हैं।
माइकल पेट

@MichaelPetch धन्यवाद, मुझे यह नहीं पता था। मैंने जवाब अपडेट कर दिया है।
सिरो सेंटिल्ली 郝海东 冠状 iro 事件 法轮功 '

5

मैं अंधेरे में एक छुरा लेने जा रहा हूं और लगता है कि आप विंडोज के बारे में बात कर रहे हैं। संक्षेप में, कर्नेल मोड में हार्डवेयर की पूरी पहुंच है, लेकिन उपयोगकर्ता मोड नहीं है। उदाहरण के लिए, कई अगर अधिकांश डिवाइस ड्राइवर कर्नेल मोड में नहीं लिखे जाते हैं क्योंकि उन्हें अपने हार्डवेयर की बारीक जानकारी को नियंत्रित करने की आवश्यकता होती है।

आप भी देखिये इस विकाइबूक को


2
यह एक प्रोग्रामर के रूप में आपके लिए महत्वपूर्ण है क्योंकि कर्नेल बग आप की तुलना में कहीं अधिक खराब कहर बरपा सकते हैं। कर्नेल / उपयोगकर्ता भेद का एक कारण यह है कि कर्नेल महत्वपूर्ण सिस्टम संसाधनों की निगरानी / नियंत्रण कर सकता है और प्रत्येक उपयोगकर्ता को दूसरों से सुरक्षित रख सकता है। यह थोड़ा अधिक है, लेकिन फिर भी उपयोगी है, अपने आप को याद दिलाने के लिए कि उपयोगकर्ता बग अक्सर कष्टप्रद होते हैं, लेकिन कर्नेल कीड़े पूरी मशीन को नीचे लाते हैं।
एडम लिस

3

अन्य उत्तर पहले से ही उपयोगकर्ता और कर्नेल मोड के बीच का अंतर बताते हैं। यदि आप वास्तव में विस्तार से जाना चाहते हैं, तो आपको विंडोज इंटर्नल की एक प्रति मिलनी चाहिए , जो मार्क रोसिनोविच और डेविड सोलोमन द्वारा लिखित एक उत्कृष्ट पुस्तक है, जो विभिन्न विंडोज ऑपरेटिंग सिस्टमों की वास्तुकला और अंदर के विवरण का वर्णन करती है।


2

क्या

मूल रूप से कर्नेल और उपयोगकर्ता मोड के बीच का अंतर ओएस पर निर्भर नहीं है और केवल हार्डवेयर डिज़ाइन के माध्यम से केवल कर्नेल मोड में चलाने के लिए कुछ निर्देशों को प्रतिबंधित करके प्राप्त किया जाता है। स्मृति संरक्षण जैसे अन्य सभी उद्देश्य केवल उस प्रतिबंध से ही हो सकते हैं।

किस तरह

इसका मतलब है कि प्रोसेसर कर्नेल मोड में या उपयोगकर्ता मोड में रहता है। कुछ तंत्रों का उपयोग करके आर्किटेक्चर यह गारंटी दे सकता है कि जब भी इसे कर्नेल मोड पर स्विच किया जाता है तो OS कोड को चलाने के लिए लाया जाता है।

क्यों

इस हार्डवेयर अवसंरचना के होने से इन्हें सामान्य ओएस में प्राप्त किया जा सकता है:

  • उदाहरण के लिए, ओएस को अधिलेखित न करने देने के लिए, पूरे प्रोग्राम को मेमोरी से एक्सेस करने से उपयोगकर्ता प्रोग्राम्स की सुरक्षा करना,
  • उपयोगकर्ता प्रोग्राम को संवेदनशील निर्देश जैसे कि सीपीयू मेमोरी पॉइंटर सीमा को बदलने से रोकते हैं, उदाहरण के लिए प्रोग्राम को उनकी मेमोरी सीमा को तोड़ने न दें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.