2013-05-24 11 views
6

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

तो एप्लिकेशन डेवलपर्स के दृष्टिकोण से, हमारे पास कुछ जैसा है;

//library //syscall //k_driver //device_driver 
fread() -> read() -> k_read() -> d_read() 

मेरा प्रश्न है; मुझे fread() और read() फ़ंक्शंस में सीधे मेरे प्रोग्राम में सभी निर्देशों को रेखांकित करने में क्या रोक रहा है? निर्देश वही हैं, इसलिए सीपीयू को वैसे ही व्यवहार करना चाहिए? मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि यह किसी कारण से काम नहीं करता है, मुझे याद आ रही है। अन्यथा कोई भी अनुप्रयोग मनमाने ढंग से कर्नेल मोड ऑपरेशन प्राप्त कर सकता है।

टीएल; डीआर: क्या सिस्टम को कर्नेल मोड में 'प्रवेश' करने की अनुमति देता है जो किसी एप्लिकेशन द्वारा कॉपी-सक्षम नहीं है?

उत्तर

8

सिस्टम कॉल कर्नेल स्वयं दर्ज नहीं करते हैं। अधिक सटीक, उदाहरण के लिए आपके द्वारा कॉल किए गए पढ़ने वाले फ़ंक्शन अभी भी हैं, जहां तक ​​आपका एप्लिकेशन संबंधित है, लाइब्रेरी कॉल। सीपीयू आर्किटेक्चर और ओएस के आधार पर read(2) आंतरिक रूप से कुछ बाधाओं या syscall(2) असेंबली निर्देश का उपयोग करके वास्तविक सिस्टम कॉल को कॉल कर रहा है।

उपयोगकर्तालैंड कोड के लिए यह विशेषाधिकार प्राप्त कोड होने का एकमात्र तरीका है, लेकिन यह एक अप्रत्यक्ष तरीका है। उपयोगकर्ता संदर्भ और कर्नेल कोड विभिन्न संदर्भों में निष्पादित करते हैं।

इसका मतलब है कि आप कर्नेल स्रोत कोड को अपने उपयोगकर्तालैंड कोड में नहीं जोड़ सकते हैं और उम्मीद करते हैं कि यह कुछ उपयोगी लेकिन क्रैश हो। विशेष रूप से, कर्नेल कोड में हार्डवेयर के साथ संवाद करने के लिए आवश्यक भौतिक स्मृति पते तक पहुंच होती है। उपयोगकर्तालैंड कोड वर्चुअल मेमोरी स्पेस तक पहुंचने तक सीमित है जिसमें यह क्षमता नहीं है। साथ ही, निर्देश उपयोगकर्तालैंड कोड निष्पादित करने की अनुमति है CPU समर्थन का सबसेट है। कई I/O, बाधा और वर्चुअलाइजेशन संबंधित निर्देश निषिद्ध कोड के उदाहरण हैं। उन्हें विशेषाधिकार प्राप्त निर्देश के रूप में जाना जाता है और सीपीयू आर्किटेक्चर के आधार पर निचली अंगूठी या पर्यवेक्षक मोड में होना आवश्यक है।

+0

अहह तो यह स्मृति मैपिंग, दिलचस्प के लिए नीचे आता है। धन्यवाद, पढ़ने के लिए कुछ और। – lynks

+0

उपयोगकर्ता मोड (उत्तर अपडेट) में वर्जित किए गए विशेषाधिकार प्राप्त निर्देशों का उल्लेख नहीं करना चाहिए। – jlliagre

+0

हम्म, मैं अभी भी नहीं कैसे स्विच होता है पर स्पष्ट कर रहा हूँ, और क्यों मैं निष्पादित नहीं कर सकता 'स्विच निर्देश' मैन्युअल: '<*switch*>' अगर मैं वह सब inlined कहते हैं, एक shellcode, मुझे कर्नेल-मोड निष्पादन क्यों नहीं मिलता है? – lynks

0

आप उन्हें इनलाइन कर सकते हैं। आप syscall(2) के माध्यम से सीधे सिस्टम कॉल जारी कर सकते हैं, लेकिन जल्द ही यह गन्दा हो जाता है। ध्यान दें कि सिस्टम ओवरहेड (संदर्भ पीछे और आगे, कर्नेल चेक, ...) स्विच करता है, सिस्टम कॉल स्वयं के समय का उल्लेख नहीं करने के लिए, शोर में गायब होने के द्वारा अपना लाभ बनाता है (यदि कोई लाभ है, अधिक कोड का मतलब है कैश इतना उपयोगी नहीं है, और प्रदर्शन पीड़ित है)। इस मामले का अध्ययन करने के लिए libc/कर्नेल लोगों पर भरोसा करें और अपनी पीठ के पीछे आपके लिए इनलाइनिंग करें (प्रासंगिक *.h फ़ाइल में) यदि यह वास्तव में एक मापनीय लाभ है।

+1

मैं 'की सामग्री को इनलाइन मतलब पढ़ें()' भी, निश्चित रूप से यह काम नहीं होगा, नहीं तो मैं बस जो कुछ बिंदु मेरा कार्यक्रम अंगूठी 0 में प्रवेश करती है में बंद हो सकता है, और कुछ मैलवेयर के लिए रवाना शाखा। – lynks

संबंधित मुद्दे