2009-01-31 16 views
30

जब मैं उपयोगकर्ता मोड में सिस्टम कॉल का आह्वान करता हूं, तो कॉल को ओएस में कैसे संसाधित किया जाता है?लिनक्स में सिस्टम कॉल कैसे कार्यान्वित किया जाता है?

क्या यह कुछ निष्पादन योग्य बाइनरी या कुछ मानक पुस्तकालय का आह्वान करता है?

यदि हां, तो कॉल को पूरा करने के लिए किस तरह की चीज़ की आवश्यकता है?

उत्तर

2

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

+0

क्या कर्नेल कोड की तरह, निष्पादन द्विआधारी, विधानसभा या गतिशील जुड़ा हुआ पुस्तकालय है? – MainID

+0

कर्नेल आपके सिस्टम पर चल रहा कर्नेल है, यानी, स्मृति में ओएस छवि। – tvanfosson

29

this पर एक नज़र डालें।

संस्करण 2.5, लिनक्स के साथ शुरू गिरी पेंटियम II + प्रोसेसर पर एक नई प्रणाली कॉल प्रविष्टि तंत्र की शुरुआत की। प्रदर्शन के मुद्दों मौजूदा सॉफ्टवेयर बाधा विधि के साथ पेंटियम चतुर्थ प्रोसेसर पर होने के कारण विकल्प सिस्टम कॉल प्रवेश तंत्र SYSENTER/SYSEXIT निर्देश II + प्रोसेसर पेंटियम पर उपलब्ध का उपयोग कर लागू किया गया था। यह आलेख इस नए तंत्र की खोज करता है। चर्चा x86 आर्किटेक्चर तक सीमित है और सभी स्रोत कोड लिस्टिंग लिनक्स कर्नेल 2.6.15.6 पर आधारित हैं।

  1. सिस्टम कॉल क्या हैं?

    सिस्टम कॉल उपयोगकर्तालैंड कर्नेल से सेवाओं का अनुरोध करने के तरीके को संसाधित करता है। सेवाओं का प्रकार क्या है? सेवाएं जो को स्टोरेज, मेमोरी, नेटवर्क, प्रोसेस मैनेजमेंट इत्यादि जैसे ऑपरेटिंग सिस्टम द्वारा प्रबंधित की जाती हैं। उदाहरण के लिए यदि उपयोगकर्ता फ़ाइल को पढ़ना चाहता है, तो उसे 'ओपन' और 'रीड' सिस्टम कॉल करना होगा। आम तौर पर सिस्टम कॉल को सीधे प्रक्रियाओं द्वारा नहीं कहा जाता है। सी लाइब्रेरी सभी सिस्टम कॉल के लिए एक इंटरफ़ेस प्रदान करता है।

  2. सिस्टम कॉल में क्या होता है?

    एक कर्नेल कोड स्निपेट उपयोगकर्ता प्रक्रिया के अनुरोध पर चलाया जाता है। यह कोड रिंग 0 में चलता है (वर्तमान विशेषाधिकार स्तर -CPL- 0 के साथ), जो x86 आर्किटेक्चर में विशेषाधिकार का उच्चतम स्तर है। सभी उपयोगकर्ता प्रक्रियाएं रिंग 3 (सीपीएल 3) में चलाती हैं।

    तो, सिस्टम कॉल तंत्र लागू करने के लिए, हम क्या जरूरत है

    1) अंगूठी 3.

    2) अनुरोध की सेवा से कुछ कर्नेल कोड से अंगूठी 0 कोड कॉल करने के लिए एक तरीका है।

  3. यह

    कुछ समय पहले तक ऐसा करने का अच्छा पुराने तरीके, लिनक्स के लिए इस्तेमाल किया प्रणाली सॉफ्टवेयर बीच में आता है का उपयोग करते हुए प्लेटफार्मों सभी 86 पर कॉल को लागू। एक प्रणाली अधिकार, उपयोगकर्ता प्रक्रिया पर अमल करने के लिए% eax के लिए वांछित सिस्टम कॉल संख्या की प्रतिलिपि बनाएगा और 'पूर्णांक 0x80' पर अमल होगा। यह 0x80 और इंटरप्ट को उत्पन्न करेगा एक इंटरप्ट सेवा दिनचर्या कहा जाएगा। 0x80 को बाधित करने के लिए, यह दिनचर्या "सभी सिस्टम हैंडलिंग" दिनचर्या है। यह दिनचर्या रिंग 0 में निष्पादित होगी। फ़ाइल में परिभाषित /usr/src/linux/arch/i386/kernel/entry.S, वर्तमान स्थिति को सहेज लेगा और उचित सिस्टम कॉल हैंडलर आधारित पर कॉल करेगा % Eax में मान पर ।

  4. करने के नए चमकदार जिस तरह से यह

    यह पता चला कि इस सॉफ्टवेयर बाधा विधि पेंटियम चतुर्थ प्रोसेसर पर बहुत धीमी थी। इस समस्या को हल करने के लिए, लिनस ने वैकल्पिक सिस्टम कॉल तंत्र को पर लागू किया है, जो सभी पेंटियम II + प्रोसेसर द्वारा प्रदान किए गए निर्देशों का SYSENTER/SYSEXIT का लाभ उठाएं। यह कर के इस नए तरीके के साथ आगे जाने से पहले, के खुद इन निर्देशों से परिचित करते हैं।

3

यह glibc, जो मानकों के साथ रजिस्टर भरने के बाद एक 0x80 बाधा जारी करता है के माध्यम से चला जाता है। कर्नेल के इंटरप्ट हैंडलर तब syscall तालिका में syscall को देखता है और प्रासंगिक sys _ *() फ़ंक्शन को आमंत्रित करता है।

10

यह सिस्टम कॉल द्वारा आपके मतलब पर निर्भर करता है। क्या आपका मतलब सी लाइब्रेरी कॉल (ग्लिबैक के माध्यम से) या एक वास्तविक सिस्टम कॉल है? अंत में सिस्टम कॉल का उपयोग कर सी लाइब्रेरी कॉल हमेशा खत्म हो जाती है।

सिस्टम कॉल करने का पुराना तरीका एक सॉफ्टवेयर व्यवधान, जैसे कि, int अनुदेश के माध्यम से किया गया था। विंडोज़ में int 0x2e था जबकि लिनक्स में int 0x80 था। ओएस इंटरप्ट डिस्क्रिप्टर टेबल (आईडीटी) में 0x2e या 0x80 के लिए एक इंटरप्ट हैंडलर सेट करता है। यह हैंडलर तब सिस्टम कॉल करता है। यह उपयोगकर्ता-मोड से कर्नेल-मोड में तर्कों की प्रतिलिपि बनाता है (यह एक ओएस-विशिष्ट सम्मेलन द्वारा नियंत्रित होता है)। लिनक्स पर, तर्क ebx, ecx, edx, esi, और edi का उपयोग कर पारित कर रहे हैं। विंडोज़ पर, तर्क स्टैक से कॉपी किए जाते हैं। हैंडलर फिर किसी प्रकार का लुकअप (फ़ंक्शन का पता ढूंढने के लिए) करता है और सिस्टम कॉल निष्पादित करता है। सिस्टम कॉल पूरा होने के बाद, iret निर्देश उपयोगकर्ता-मोड पर लौटाता है।

नया तरीका sysenter और sysexit है। ये दो निर्देश मूल रूप से आपके लिए सभी रजिस्टर कार्य करते हैं। ओएस मॉडल विशिष्ट रजिस्टरों (एमएसआर) के माध्यम से निर्देश सेट करता है। इसके बाद यह व्यावहारिक रूप से int का उपयोग करने जैसा ही है। विधानसभा में

+0

"सी लाइब्रेरी कॉल अंत में सिस्टम कॉल का उपयोग करके हमेशा समाप्त होती है।" - उसमें कोई संदर्भ? –

+0

@MywikiWitwiki नहीं * किसी भी * सी लाइब्रेरी कॉल, लेकिन 'पढ़ने', 'लिखने' आदि पर कॉल करते हैं। एकमात्र कारण जहां वे नहीं हो सकते - यदि वे भी मौजूद हैं - अत्यंत विशिष्ट अनुकूलन के कारण हैं। आप मान सकते हैं कि वे हमेशा कर्नेल मोड पर जाते हैं, जब तक कि आप अभिनव अंतर्दृष्टि वाले कर्नेल विशेषज्ञ न हों। –

2

पूर्णांक एक्स एक सिस्टम कॉल संख्या n करने के लिए अनुवाद।
पूर्व पढ़ने के लिए सिस्कोल को नंबर 4 दिया जा सकता है।
सिस्टम स्टार्टअप पर, ओएस इंटरप्ट डिस्क्रिप्टर टेबल (आईडीटी) नामक पॉइंटर्स की एक तालिका बनाता है जिसमें सिस्टम कॉल के लिए पते की एक सूची होती है, जिससे उन्हें निष्पादित करने के लिए विशेषाधिकार आवश्यक होता है।
वर्तमान विशेषाधिकार स्तर (सीपीएल) सीएस रजिस्टर के कुछ में से एक में सहेजा गया है (तकनीकी रूप से x86 पर 2 बिट्स)।
यह एक निर्देश के बाद दिए गए कदम हैं:
• आईडीटी से एन'एथ डिस्क्रिप्टर प्राप्त करें, जहां एन int का तर्क है।
• जांचें कि% सीएस में सीपीएल < = डीपीएल है, जहां डीपीएल वर्णनकर्ता में विशेषाधिकार स्तर है।
• यदि नहीं तो उपयोगकर्ता को निष्पादित करने के लिए पर्याप्त विशेषाधिकार नहीं था और परिणामस्वरूप एक इंटेल 13 निर्देश (सामान्य सुरक्षा गलती) निष्पादित की जाएगी, (उपयोगकर्ता के पास पर्याप्त विशेषाधिकार नहीं था)
• यदि हां तो उपयोगकर्ता कोड में है इस सिस्टम कॉल करने के लिए पर्याप्त विशेषाधिकार, वर्तमान निष्पादन संदर्भ सहेजा गया है (रजिस्टर्स इत्यादि), क्योंकि अब हम कर्नेल मोड पर स्विच करते हैं।
जानकारी में रजिस्ट्रार, झंडे शामिल हैं क्योंकि जब सिस्टम कॉल को समाप्त किया जाता है तो हम जहां से छोड़े गए वहां से निष्पादन जारी रखना चाहते हैं। • सिस्टम कॉल के पैरामीटर कर्नेल स्टैक पर सहेजे जाते हैं, क्योंकि सिस्टम कॉल को कर्नेल मोड में निष्पादित किया जाता है।

VSYSCALL (फास्ट सिस्टम कॉल)
हर बार सिस्टम कॉल उपयोगकर्ता द्वारा निष्पादित किया जाता है, ओएस मशीन की वर्तमान स्थिति की बचत होती है (यानी रजिस्टर, ढेर सूचक आदि) और निष्पादन के लिए कर्नेल मोड पर स्विच करता है । कुछ सिस्टम कॉल के लिए सभी रजिस्टर को सहेजना आवश्यक नहीं है। दिन सिस्टम कॉल के पूर्व गेटटाइम वर्तमान समय और सिस्टम कॉल रिटर्न पढ़ता है। तो कुछ सिस्टम कॉल को vsyscalls कहा जाता है के माध्यम से लागू किया जाता है। यहां जब एक सिस्टम कॉल किया जाता है, तो इसे उपयोगकर्ता स्थान में कभी भी कर्नेल पर स्विच किए बिना निष्पादित किया जाता है। तो समय बचाया गया है।
http://www.trilithium.com/johan/2005/08/linux-gate/
और यहाँ Anyone can understand how gettimeofday works?

0

एक syscall एक विशेष जाल अनुदेश, एक syscall संख्या और तर्क से बना है vsyscall पर जानकारी के लिए यहाँ देखें।

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