यूजर स्पेस और कर्नेल स्पेस में क्या अंतर है?


72

क्या कर्नेल स्थान का उपयोग तब किया जाता है जब कर्नेल उपयोगकर्ता प्रोग्राम यानी सिस्टम कॉल की ओर से क्रियान्वित होता है? या क्या यह सभी कर्नेल थ्रेड्स (उदाहरण शेड्यूलर के लिए) का पता स्थान है?

यदि यह पहला है, तो इसका मतलब यह है कि सामान्य उपयोगकर्ता प्रोग्राम में 3GB से अधिक मेमोरी नहीं हो सकती है (यदि विभाजन 3GB + 1GB है)? इसके अलावा, उस स्थिति में कर्नेल उच्च मेमोरी का उपयोग कैसे कर सकता है, क्योंकि किस वर्चुअल मेमोरी पते से उच्च मेमोरी के पृष्ठों को मैप किया जा सकेगा, क्योंकि 1 जीबी की कर्नेल जगह को तार्किक रूप से मैप किया जाएगा?

जवाबों:


93

क्या कर्नेल स्थान का उपयोग तब किया जाता है जब कर्नेल उपयोगकर्ता प्रोग्राम यानी सिस्टम कॉल की ओर से क्रियान्वित होता है? या क्या यह सभी कर्नेल थ्रेड्स (उदाहरण शेड्यूलर के लिए) का पता स्थान है?

हाँ और हाँ।

इससे पहले कि हम आगे बढ़ें, हमें स्मृति के बारे में यह बताना चाहिए।

मेमोरी दो अलग-अलग क्षेत्रों में विभाजित है:

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

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

कर्नेल स्पेस कोड में "कर्नेल मोड" चलाने की संपत्ति होती है, जो (आपके सामान्य डेस्कटॉप -x86- कंप्यूटर में) है जिसे आप कोड कहते हैं जो रिंग 0 के तहत निष्पादित होता हैआमतौर पर x86 वास्तुकला में, सुरक्षा के 4 छल्ले हैं । रिंग 0 (कर्नेल मोड), रिंग 1 (वर्चुअल मशीन हाइपरवाइजर या ड्राइवर द्वारा इस्तेमाल किया जा सकता है), रिंग 2 (ड्राइवरों द्वारा उपयोग किया जा सकता है, मैं इसके बारे में इतना निश्चित नहीं हूं)। रिंग 3 वह है जो विशिष्ट अनुप्रयोगों के तहत चलता है। यह कम से कम विशेषाधिकार प्राप्त अंगूठी है, और इस पर चलने वाले अनुप्रयोगों में प्रोसेसर के निर्देशों के सबसेट तक पहुंच होती है। रिंग 0 (कर्नेल स्पेस) सबसे विशेषाधिकार प्राप्त रिंग है, और मशीन के सभी निर्देशों तक इसकी पहुंच है। उदाहरण के लिए, एक "प्लेन" एप्लिकेशन (ब्राउज़र की तरह) x86 असेंबली निर्देशों का उपयोग नहीं कर सकता हैlgdtवैश्विक डिस्क्रिप्टर तालिका लोड करने के लिए या hltएक प्रोसेसर को रोकने के लिए।

यदि यह पहला है, तो इसका मतलब यह है कि सामान्य उपयोगकर्ता प्रोग्राम में 3GB से अधिक मेमोरी नहीं हो सकती है (यदि विभाजन 3GB + 1GB है)? इसके अलावा, उस स्थिति में कर्नेल उच्च मेमोरी का उपयोग कैसे कर सकता है, क्योंकि किस वर्चुअल मेमोरी पते से उच्च मेमोरी के पृष्ठों को मैप किया जा सकेगा, क्योंकि 1 जीबी की कर्नेल जगह को तार्किक रूप से मैप किया जाएगा?

इस पर एक उत्तर के लिए, कृपया यहां wag द्वारा उत्कृष्ट उत्तर देखें


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

धन्यवाद! मुझे लगता है कि अब मैं इसे बेहतर समझ रहा हूं। बस यह सुनिश्चित करने के लिए कि मैं इसे सही ढंग से प्राप्त करूं, मेरे पास एक और सवाल है। फिर से विचार करने पर कि पहले 3GB का उपयोग यूजरस्पेस के लिए किया जाता है और 128MB के कर्नेल स्थान का उपयोग उच्च मेमोरी के लिए किया जाता है, क्या शेष 896MB (कम मेमोरी) बूट-टाइम पर सांख्यिकीय रूप से मैप की जाती है?
पूजन

1
@NlightNFotis मैं कहता हूं कि लगभग 15 लोग मानते हैं कि आपने जो भी कहा है, वह सही है (या इसलिए आप हमें सोचते हैं;))
Braiam

मुझे लगा कि x86 रिंग -1हाइपरविजर्स के लिए है? en.wikipedia.org/wiki/Protection_ring
डोरी

1
वर्चुअल मेमोरी और भौतिक मेमोरी के बीच अंतर पर ध्यान दें। वर्चुअल मेमोरी के बारे में आप जो पूछते हैं, उसमें से ज्यादातर वर्चुअल मेमोरी के बारे में है। इसे भौतिक मेमोरी में मैप किया जाता है, यह जटिल हो जाता है क्योंकि भौतिक मेमोरी 3GB तक पहुंच जाती है, और PAE का उपयोग किया जाता है। यह तब सरल हो जाता है जब 64 बिट कर्नेल का उपयोग किया जाता है, इस मामले में नकारात्मक पते कर्नेल के लिए आरक्षित होते हैं, और उपयोगकर्ता स्थान के लिए सकारात्मक होते हैं। 32 बिट प्रक्रिया अब 4GB वर्चुअल स्पेस का उपयोग कर सकती है। 64 बिट प्रक्रियाएं बहुत अधिक उपयोग कर सकती हैं - आम तौर पर 48 बिट्स मूल्य (इस समय x86-64 पर)।
ctrl-alt-delor

16

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

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

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

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

लिनक्स 1 और 2 के छल्ले का उपयोग क्यों नहीं करता है: https://stackoverflow.com/questions/6710040/cpu-privilege-rings-why-rings-1-and-2-arent-used

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

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

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

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

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

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

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

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

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

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

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

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

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

    • पृष्ठ तालिकाएँ संशोधित नहीं कर सकते: https://stackoverflow.com/questions/18431261/how-does-x86-aging-work

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

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

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

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

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

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

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

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

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

      लिनक्स हमेशा इसे नापसंद करता है। इसे भी देखें: https://stackoverflow.com/questions/2711044/why-doesnt-linux-use-the-hardware-context-switch-via-the-ts

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

  • जब 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 में चलता है, जो तय करता है कि कर्नेल इस क्रिया को करने देगा, एक्शन करेगा, और रिंग में यूजरलैंड प्रोग्राम को पुनः आरंभ करेगा। x86_64

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

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

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

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

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

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

एकाधिक वलय होने की बात क्या है?

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

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

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

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

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

वैकल्पिक रूप से, लिनक्स कर्नेल मॉड्यूल रिंग 0 में चलते हैं, इसलिए आप उनका उपयोग विशेषाधिकार प्राप्त संचालन को आज़माने के लिए कर सकते हैं, उदाहरण के लिए कंट्रोल रजिस्टर पढ़ें: https://stackoverflow.com/questions/7415515/how-to-access-the-control-registers -cr0-CR2-CR3-से-एक कार्यक्रम-हो रही-segmentà / 7,419,306 # 7,419,306

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

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

नकारात्मक वलय

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

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

अधिक जानकारी के लिए देखें: https://security.stackexchange.com/questions/129098/what-is-protection-ring-1

एआरएम

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

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

  • EL0: उपयोगकर्ता भूमि

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

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

    .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निर्देश के साथ दर्ज किया गया (हाइपरविजर कॉल)।

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

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

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

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

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

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

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

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

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

वर्तमान ईएल को MRSनिर्देश के साथ समझा जा सकता है : https://stackoverflow.com/questions/31787617/what-is-the-current-execution-mode-exception-level-etc

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

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

उदाहरण के लिए QEMU EL1 में चूक के लिए, लेकिन EL2 और EL3 को कमांड लाइन विकल्पों के साथ सक्षम किया जा सकता है: https://stackoverflow.com/questions/42824706/qemu-system-aarch64-entering-el1-when-emulating-a53-power-up

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


3

यदि यह पहला है, तो इसका मतलब यह है कि सामान्य उपयोगकर्ता प्रोग्राम में 3GB से अधिक मेमोरी नहीं हो सकती है (यदि विभाजन 3GB + 1GB है)?

हाँ यह एक सामान्य लिनक्स प्रणाली पर मामला है। एक बिंदु पर चारों ओर "4 जी / 4 जी" पैच का एक सेट तैर रहा था जिसने उपयोगकर्ता और कर्नेल पते के रिक्त स्थान को पूरी तरह से स्वतंत्र बना दिया था (एक प्रदर्शन लागत पर क्योंकि यह कर्नेल के लिए उपयोगकर्ता मेमोरी तक पहुंचना कठिन बना दिया था) लेकिन मुझे नहीं लगता है वे कभी भी ऊपर की ओर विलीन हो गए थे और ब्याज x86-64 के उदय के साथ कम हो गया था

इसके अलावा, उस स्थिति में कर्नेल उच्च मेमोरी का उपयोग कैसे कर सकता है, क्योंकि किस वर्चुअल मेमोरी पते से उच्च मेमोरी के पृष्ठों को मैप किया जा सकेगा, क्योंकि 1 जीबी की कर्नेल जगह को तार्किक रूप से मैप किया जाएगा?

जिस तरह से linux काम करता था (और अभी भी सिस्टम पर करता है जहाँ पता स्थान की तुलना में मेमोरी छोटा है) यह था कि पूरी भौतिक मेमोरी को स्थायी रूप से पता स्थान के कर्नेल भाग में मैप किया गया था। इसने कर्नेल को बिना किसी रीमैपिंग के साथ सभी भौतिक मेमोरी तक पहुंचने की अनुमति दी, लेकिन स्पष्ट रूप से यह 32-बिट मशीनों को बहुत सारी भौतिक मेमोरी के साथ स्केल नहीं करता है।

इसलिए निम्न और उच्च स्मृति की अवधारणा का जन्म हुआ। "कम" मेमोरी स्थायी रूप से गुठली पते की जगह में मैप की जाती है। "उच्च" मेमोरी नहीं है।

जब प्रोसेसर एक सिस्टम कॉल चला रहा होता है तो यह कर्नेल मोड में चल रहा होता है लेकिन फिर भी वर्तमान प्रक्रिया के संदर्भ में। तो यह सीधे कर्नेल पता स्थान और वर्तमान प्रक्रिया के उपयोगकर्ता पता स्थान दोनों को एक्सेस कर सकता है (यह मानते हुए कि आप उपरोक्त 4 जी / 4 जी पैच का उपयोग नहीं कर रहे हैं)। इसका मतलब यह है कि यह "उच्च" मेमोरी के लिए एक यूजरलैंड प्रक्रिया को आवंटित करने के लिए कोई समस्या नहीं है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.