लिनक्स में मुझे सभी सिस्टम कॉल के लिए स्रोत कोड कहां मिल सकता है, क्योंकि मेरे पास स्रोत पेड़ है? अगर मैं किसी विशेष सिस्टम कॉल के लिए स्रोत कोड और असेंबली देखना चाहता हूं तो क्या ऐसा कुछ है जिसे मैं टर्मिनल में टाइप कर सकता हूं जैसे-my_system_call?मुझे सिस्टम कॉल स्रोत कोड कहां मिल सकता है?
उत्तर
सिस्टम कॉल के वास्तविक स्रोत को देखने के लिए आपको लिनक्स कर्नेल स्रोतों की आवश्यकता होगी। मैन्युअल पेज, यदि आपके स्थानीय सिस्टम पर स्थापित है, तो केवल कॉल का प्रलेखन होता है, न कि उनके स्रोत को।
दुर्भाग्य से आपके लिए, सिस्टम कॉल पूरे कर्नेल पेड़ में केवल एक विशेष स्थान पर संग्रहीत नहीं होते हैं। ऐसा इसलिए है क्योंकि विभिन्न सिस्टम कॉल सिस्टम के विभिन्न हिस्सों (प्रक्रिया प्रबंधन, फाइल सिस्टम प्रबंधन इत्यादि) को संदर्भित कर सकते हैं और इसलिए सिस्टम के उस विशेष भाग से संबंधित पेड़ के हिस्से से उन्हें अलग करने के लिए अक्षम नहीं होगा।
सबसे अच्छी बात यह है कि आप SYSCALL_DEFINE[0-6]
मैक्रो की तलाश कर सकते हैं। यह सिस्टम कॉल के रूप में कोड के दिए गए ब्लॉक को परिभाषित करने के लिए (स्पष्ट रूप से) उपयोग किया जाता है।
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
/* do freaky ioctl stuff */
}
इस तरह की एक परिभाषा का अर्थ है कि ioctl
syscall घोषित किया जाता है और तीन तथ्य होते हैं: उदाहरण के लिए, fs/ioctl.c
निम्नलिखित कोड है। SYSCALL_DEFINE
के बगल में संख्या का अर्थ तर्कों की संख्या है।
SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current);
}
आशा है कि चीजें थोड़ा साफ करता है: उदाहरण के लिए, getpid(void)
के मामले में,, हम कोड निम्नलिखित है kernel/timer.c
में घोषित कर दिया।
किसी एप्लिकेशन के दृष्टिकोण से, system callkernel द्वारा किया गया एक प्राथमिक और परमाणु संचालन है।
Assembly Howto बताता है कि मशीन निर्देश के संदर्भ में क्या हो रहा है।
बेशक, कर्नेल एक सिस्कोल को संभालने के दौरान बहुत सी चीजें कर रहा है।
असल में, आप लगभग विश्वास कर सकते हैं कि संपूर्ण कर्नेल कोड सभी सिस्टम कॉल को संभालने के लिए समर्पित है (यह पूरी तरह से सत्य नहीं है, लेकिन लगभग; अनुप्रयोगों के दृष्टिकोण से, कर्नेल केवल सिस्टम कॉल के माध्यम से दिखाई देता है)। डैनियल कैमिल कोजर द्वारा अन्य answer बता रहे हैं कि कर्नेल फ़ंक्शन कुछ सिस्टम कॉल के संचालन को शुरू कर रहा है (लेकिन अक्सर, कर्नेल के कई अन्य हिस्सों पर अप्रत्यक्ष रूप से सिस्टम कॉल में भाग लेते हैं; उदाहरण के लिए, शेड्यूलर अप्रत्यक्ष रूप से fork
को लागू करने में भाग लेता है क्योंकि यह प्रबंधित करता है एक सफल fork
syscall द्वारा बनाई गई बाल प्रक्रिया)।
मैं जानता हूँ कि यह पुरानी है, लेकिन मैं भी _system_call()
के लिए स्रोत के लिए खोज रहा था और इस tidbit system_call प्रवेश बिंदु के लिए
वास्तविक कोड/usr/src/linux/कर्नेल/sys_call में पाया जा सकता पाया। कई सिस्टम कॉल के लिए एस वास्तविक कोड /usr/src/linux/kernel/sys.c में पाया जा सकता है, और शेष अन्यत्र पाए जाते हैं। ढूंढो तुम्हारा दोस्त है
मुझे लगता है कि यह दिनांकित है, क्योंकि मेरे पास यह फ़ाइल भी नहीं है। हालांकि, grep को ENTRY(system_call)
आर्क/x86/कर्नेल/entry_64 में मिला। और ऐसा लगता है कि व्यक्तिगत सिस्टम कॉल को कॉल किया जाता है। मैं अभी अपने इंटेल-सिंटैक्स x86 एएसएम पर नहीं हूं, इसलिए आपको देखना होगा कि यह वही है जो आप चाहते थे।
'entry_64.S' अब मुख्यलाइन 4.8 में मौजूद नहीं है। – sherrellbc
http://kernel.org/ – TJD