"सिस्टम कॉल" से क्या मतलब है यदि प्रोग्रामिंग भाषा में कार्यान्वयन नहीं है?


14

मैं "सिस्टम कॉल" शब्द को समझना चाहूंगा। मुझे पता है कि सिस्टम कॉल का उपयोग यूजरस्पेस एप्लिकेशन से कर्नेल सेवाओं को प्राप्त करने के लिए किया जाता है।

मुझे जिस भाग के साथ स्पष्टीकरण की आवश्यकता है वह "सिस्टम कॉल" और "सिस्टम कॉल का सी कार्यान्वयन" के बीच का अंतर है।

यहाँ एक उद्धरण है जो मुझे भ्रमित करता है:

यूनिक्स जैसी प्रणालियों पर, एपीआई आमतौर पर सी लाइब्रेरी (एफबीआईसी) के कार्यान्वयन का एक हिस्सा है, जैसे कि ग्लिबक, जो सिस्टम कॉल के लिए आवरण कार्य प्रदान करता है, जिसे अक्सर सिस्टम कॉल के रूप में नाम दिया जाता है।

"सिस्टम कॉल जिसे वे कहते हैं" क्या हैं? उनका स्रोत कहां है? क्या मैं उन्हें सीधे अपने कोड में शामिल कर सकता हूं?

क्या "सिस्टम कॉल" एक सामान्य अर्थ में सिर्फ एक POSIX परिभाषित इंटरफ़ेस है, लेकिन वास्तव में कार्यान्वयन को देखने के लिए कोई भी C स्रोत की जांच कर सकता है और इसमें यह देखता है कि वास्तविक उपयोगकर्ता का कर्नेल संचार वास्तव में कैसे जाता है?

पृष्ठभूमि नोट: मैं समझने की कोशिश कर रहा हूं, अगर अंत में, प्रत्येक सी फ़ंक्शन उपकरणों से बातचीत कर रहा है /dev

जवाबों:


21

सिस्टम कॉल प्रति se एक अवधारणा है। वे उन कार्यों का प्रतिनिधित्व करते हैं जो प्रक्रियाएं कर्नेल को प्रदर्शन करने के लिए कह सकती हैं।

उन सिस्टम कॉल को UNIX जैसी प्रणाली के कर्नेल में लागू किया जाता है। यह कार्यान्वयन (सी में लिखा गया है, और छोटे भागों के लिए asm में) वास्तव में सिस्टम में कार्रवाई करता है।

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

आप फ़ंक्शन को कर्नेल में कॉल कर सकते हैं जो सिस्टम-विशिष्ट तंत्र के माध्यम से सीधे सिस्टम कॉल करते हैं। समस्या यह है कि यह आपके कोड को बिल्कुल पोर्टेबल नहीं बनाता है।

तो, एक सिस्टम कॉल है:

  • एक अवधारणा, कर्नेल द्वारा उपयोगकर्ता प्रक्रिया के लिए एक सेवा प्रदान करने के लिए की गई कार्रवाई का एक क्रम
  • C मानक लाइब्रेरी का कार्य आपको कर्नेल से इस सेवा को प्राप्त करने के लिए अपने कोड में उपयोग करना चाहिए।

1
क्या आपके पास "रैपर फ़ंक्शन" और वास्तविक सिस्टम कॉल का उदाहरण है? (लिनक्स में फ़ाइल पथ या स्रोतों से लिंक)
TheMeaningfulEngineer

3
उदाहरण के लिए, यह getpidलिनक्स कर्नेल में सिस्टम कॉल का कार्यान्वयन है : lxr.free-electrons.com/source/kernel/timer.c?v=2.6.35#L1337 । और यह GNU C मानक पुस्तकालय glibc-2.19: fossies.org/dox/glibc-2.19/… में आवरण समारोह है ।
लेगगेट

@Igeorget: आपके लिंक अब काम नहीं करते। कर्नेल कार्यान्वयन के लिए अद्यतन लिंक: github.com/torvalds/linux/blob/… । मुझे नहीं पता है कि इन दिनों ग्लिब क्या करता है, उस कोड को नेविगेट करना असंभव है।
rchard2scout

6

एक सिस्टम कॉल आपके ऑपरेटिंग सिस्टम (कर्नेल) को आपके प्रोग्राम की ओर से कुछ ऑपरेशन करने के लिए कहने का एक तरीका है, जो प्रोग्राम खुद से नहीं कर सकता (या बस असुविधाजनक है)। कुछ ऑपरेशन नहीं कर पाने का कारण सामान्य रूप से यह है कि उन्हें करने के लिए एक यादृच्छिक कार्यक्रम की अनुमति देना सिस्टम की अखंडता से समझौता कर सकता है, जैसे कि I / O (सीधे RAM में, कुछ भी लिखना)।

POSIX कार्यक्रमों के लिए एक इंटरफ़ेस को परिभाषित करता है, कुछ फ़ंक्शन जिन्हें आपका प्रोग्राम कॉल कर सकता है। उनमें से कुछ सिस्टम कॉल में सीधे या कम अनुवाद करते हैं, दूसरों को अधिक विस्तार की आवश्यकता होती है। यह आपकी भाषा के लिए रनटाइम है, उदाहरण के लिए C लाइब्रेरी, जो POSIX इंटरफ़ेस की पेशकश के लिए जिम्मेदार है, और तर्क पैकेज करने और कॉल करने वाले को वापस करने के लिए परिणाम प्राप्त करता है।

यूनिक्स सिस्टम सिस्टम कॉल के रूप में POSIX इंटरफेस को कम या ज्यादा सीधे पेश करते हैं। आमतौर पर सिस्टम कॉल को सीधे इनवॉइस करने का एक तरीका है, syscall(2)लिनक्स में इस सुविधा का उपयोग करने के तरीके के बारे में विवरण देखें।


1
आप एक महत्वपूर्ण बिंदु पर स्पर्श करते हैं कि अन्य उत्तर बस के खिलाफ ब्रश करते हैं। किसी भी समारोह है कि एक यथोचित सक्षम प्रोग्रामर खुद के लिए लिख सकता है (जैसे strlen, strcpy, sqrt, और qsort) हो सकता है और शायद, एक पुस्तकालय से लोड उपयोगकर्ता अंतरिक्ष में है। (ज्यादातर libc; गणित के कार्य sqrtऔर त्रिकोणमितीय और अतिपरवलयिक कार्य संभवतः libm, गणित पुस्तकालय में हैं।) ... (जारी)
स्कॉट

1
(जारी) ... लेकिन ऐसा कोई तरीका नहीं है कि कोई उपयोगकर्ता अपना स्वयं का fork, killया openफ़ंक्शन लिख सके , क्योंकि इसके लिए ऑपरेटिंग सिस्टम कर्नेल मेमोरी स्पेस (जैसे, प्रोसेस टेबल) या विशेषाधिकार प्राप्त निर्देशों (जैसे, I / O) तक पहुंच की आवश्यकता होती है। इसलिए इन कार्यों को करने वाला कोड ऑपरेटिंग सिस्टम कर्नेल में होना चाहिए; इसलिए, सिस्टम फ़ंक्शन या सिस्टम कॉल।
स्कॉट

5

ज़रूर, चलो, कैसे-कितने दिशा-निर्देश-हम-पर-इस-हाथी-से-कर सकते हैं? चीज़।

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

एक बार ओएस कोड में ही, मशीन-विशिष्ट सामान जो उपयोगकर्तालैंड रनटाइम किया था और फिर एक पूरी तरह से साधारण सबरूटीन कॉल का आईना-इमेज अनडिंडिंग है।
यदि आप वास्तव में यह देखना चाहते हैं कि यह पूर्ण पैमाने पर ओएस में कैसे काम करता है, तो कर्नेल स्रोत ( git clone https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/) को खींचें और उदाहरण के लिए git grep -i system\ call। ग्लिबक स्रोत को खींचो और इसी तरह करो।


यह सच है, लेकिन लिनक्स या
ग्लिबक में चारों

3

लिनक्स में कम से कम सिस्टम कॉल तंत्र कुछ विशेष रूप से स्वरूपित डेटा (आमतौर पर किसी प्रकार की सी संरचना) को कुछ रजिस्टरों या पूर्वनिर्धारित स्मृति पतों में रखकर अधिकांश आर्किटेक्चर के तहत काम करता है।

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

आम तौर पर कर्नेल दोष को या तो कारण प्रक्रिया को मारता है या उपयोगकर्ता द्वारा संचालित हैंडलर को चलाता है। हालाँकि syscall के मामले में यह पूर्वनिर्धारित रजिस्टरों और मेमोरी स्थानों की जाँच करेगा और यदि उनमें syscall अनुरोध शामिल है तो यह चलेगा कि इन-मेमरी संरचना में उपयोगकर्ता प्रक्रिया द्वारा उपलब्ध कराए गए डेटा का उपयोग करना। यह आमतौर पर कुछ विशेष रूप से हाथ से तैयार की गई विधानसभा के साथ किया जाता है और उपयोगकर्ता के लिए syscall के उपयोग को कम करने के लिए सिस्टम के सी लाइब्रेरी को इसे फ़ंक्शन के रूप में लपेटना पड़ता है। निचले स्तर के इंटरफ़ेस के लिए कृपया देखें http://man7.org/linux/man-pages/man2/syscall.2.html पर कुछ जानकारी के लिए कि कैसे syscalls काम करते हैं और कैसे आप एक C आवरण के बिना कॉल कर सकते हैं।

इसे एक ओवरसाइम्प्लिफिकेशन दिया गया है, यह सभी आर्किटेक्चर में सही नहीं है (mips के पास एक विशेष syscall निर्देश है) और जरूरी नहीं कि सभी OSes पर समान काम करें। फिर भी, अगर आपके पास कोई टिप्पणी या प्रश्न हैं, तो कृपया पूछें।

संशोधित: ध्यान दें, / देव / में चीजों के बारे में आपकी टिप्पणी के बारे में यह वास्तव में कर्नेल के लिए एक उच्च स्तर का इंटरफ़ेस है, कम नहीं। ये उपकरण वास्तव में (लगभग) 4 syscalls का उपयोग करते हैं। उनके लिए लिखना एक लिखने वाले syscall के समान है, एक पढ़ा हुआ syscall पढ़ना, उन्हें खुले और बंद syscalls के समतुल्य / बंद करना और एक ioctl को चलाना एक विशेष ioctl syscall का कारण बनता है जो अपने आप में सिस्टम के कई ioctl में से एक का उपयोग करने के लिए एक इंटरफ़ेस है। कॉल (विशेष, आमतौर पर डिवाइस विशिष्ट कॉल बहुत संकीर्ण उपयोग के साथ उनके लिए संपूर्ण syscall लिखने के लिए)।


1

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


प्रत्येक कॉल (ऑपरेशन) को आंतरिक रूप से एक नंबर से पहचाना जाता है, सच। लेकिन संख्या ऑपरेशन पर निर्भर करती है , न रिटर्न वैल्यू पर और न ही तर्कों की संख्या पर। यह x86 पर
यूजरलैंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.