सिस्टम कॉल को नियमित फ़ंक्शन कॉल की तरह नियंत्रित नहीं किया जाता है। यह उपयोगकर्ता कोड से कर्नेल स्पेस में संक्रमण करने के लिए विशेष कोड लेता है, मूल रूप से कॉल साइट पर आपके प्रोग्राम में इंजेक्ट असेंबली कोड का एक सा कोड होता है। कर्नेल साइड कोड जो सिस्टम कॉल को "कैच" करता है, वह भी निम्न स्तर का सामान है जिसे आपको कम से कम पहले समझने की आवश्यकता नहीं है।
में include/linux/syscalls.h
अपने कर्नेल स्रोत निर्देशिका के अंतर्गत, तो आप इस पाते हैं:
asmlinkage long sys_mkdir(const char __user *pathname, int mode);
फिर /usr/include/asm*/unistd.h
, आप यह पाते हैं:
#define __NR_mkdir 83
__SYSCALL(__NR_mkdir, sys_mkdir)
यह कोड कह रहा है कि mkdir(2)
सिस्टम कॉल # 83 है। कहने का तात्पर्य यह है कि सिस्टम कॉल को नंबर से बुलाया जाता है, न कि पते के रूप में, अपने प्रोग्राम के भीतर एक सामान्य फ़ंक्शन कॉल के साथ या अपने प्रोग्राम से जुड़ी लाइब्रेरी में एक फंक्शन के लिए। इनलाइन असेंबली गोंद कोड जिसका मैंने ऊपर उल्लेख किया है, इसका उपयोग उपयोगकर्ता से कर्नेल स्थान में संक्रमण बनाने के लिए करता है, साथ में अपने मापदंडों को लेकर।
एक और साक्ष्य कि चीजें यहां थोड़ी अजीब हैं, यह है कि सिस्टम कॉल के लिए हमेशा सख्त पैरामीटर सूची नहीं होती है: open(2)
उदाहरण के लिए, 2 या 3 पैरामीटर ले सकते हैं। इसका मतलब open(2)
है कि अतिभारित , C ++ की सुविधा, C नहीं, फिर भी syscall इंटरफ़ेस C- संगत है। (यह सी के वैरैगस फीचर के समान नहीं है , जो एकल फ़ंक्शन को चर संख्या में तर्क लेने की अनुमति देता है।)
आपके पहले प्रश्न का उत्तर देने के लिए, कोई एकल फ़ाइल mkdir()
मौजूद नहीं है। लिनक्स कई अलग-अलग फ़ाइल सिस्टमों का समर्थन करता है और प्रत्येक में "mkdir" ऑपरेशन का अपना कार्यान्वयन है। अमूर्त परत जो कर्नेल को एक सिस्टम कॉल के पीछे सभी को छिपाने देती है, VFS कहलाता है । तो, आप शायद के fs/namei.c
साथ खुदाई शुरू करना चाहते हैं vfs_mkdir()
। निम्न-स्तरीय फ़ाइल सिस्टम संशोधन कोड के वास्तविक कार्यान्वयन कहीं और हैं। उदाहरण के लिए, ext4 कार्यान्वयन कहा जाता है ext4_mkdir()
, में परिभाषित किया गया है fs/ext4/namei.c
।
जैसा कि आपके दूसरे प्रश्न के लिए है, हाँ इस सब के पैटर्न हैं, लेकिन एक भी नियम नहीं है। वास्तव में आपको जिस चीज की आवश्यकता है वह इस बात की काफी व्यापक समझ है कि कर्नेल यह पता लगाने के लिए काम करता है कि आपको किसी विशेष सिस्टम कॉल के लिए कहां देखना चाहिए। सभी सिस्टम कॉल में VFS शामिल नहीं होता है, इसलिए उनकी कर्नेल-साइड कॉल चेन सभी शुरू नहीं होती हैं fs/namei.c
। mmap(2)
उदाहरण के लिए, इसमें शुरू होता है mm/mmap.c
, क्योंकि यह कर्नेल के मेमोरी प्रबंधन ("मिमी") सबसिस्टम का हिस्सा है।
मेरा सुझाव है कि आप Bovet और Cesati द्वारा " लिनक्स कर्नेल को समझना " की एक प्रति प्राप्त करें ।