2011-09-13 16 views
12

के भीतर सिस्टम कॉल/जाल का कार्यान्वयन मैं वर्तमान में ऑपरेटिंग सिस्टम को लिनक्स कर्नेल के भीतर सिस्टम कॉल की सुविधा के लिए जाल के उपयोग के बारे में सीख रहा हूं। मैंने traps.c में जाल की मेज और प्रवेश के भीतर कई जाल के कार्यान्वयन को स्थापित किया है।लिनक्स कर्नेल स्रोत

हालांकि, मुझे लिनक्स कर्नेल में दो सिस्टम कॉल का कार्यान्वयन करने का निर्देश दिया गया है जो सिस्टम कॉल को लागू करने के लिए जाल का उपयोग करता है। हालांकि मैं खुद को जाल की परिभाषा पा सकता हूं, मुझे यकीन नहीं है कि कर्नेल के भीतर इन जाल में से किसी एक को "कॉल" कैसा दिखता है। इसलिए, मैं इस व्यवहार का एक उदाहरण खोजने के लिए संघर्ष कर रहा हूं।

कोई पूछने से पहले, हाँ, यह होमवर्क है।

एक नोट के रूप में, मैं गिरी स्रोत ब्राउज़ करने के लिए Github उपयोग कर रहा हूँ, क्योंकि kernel.org नीचे है: https://github.com/torvalds/linux/

+2

होमवर्क प्रश्न का अच्छा प्रकार :) – James

+6

लिनक्स स्रोत ब्राउज़ करने के लिए http://lxr.linux.no/ का उपयोग करें। आपको बहुत समय बचाएगा;) – rumpel

+0

@ ट्रम्पेल: इसके बारे में कभी नहीं सुना .. काफी सादा दिखता है। क्या यहां कुछ खास है जो vim + 'ctags' के साथ उपलब्ध नहीं है? –

उत्तर

0

मैं दो प्रणाली के एक कार्यान्वयन लिनक्स कर्नेल में कॉल लगाने के लिए निर्देश दिए रहा हूँ जो एक सिस्टम कॉल को लागू करने के जाल का उपयोग

हर सिस्टम कॉल एक जाल (बीच में 0x80 अगर मैं सही ढंग से याद करते हैं) तो "कर्नेल" बिट PSW में चालू हो जाएगा, का इस्तेमाल करता है और विशेषाधिकार प्राप्त संचालन प्रोसेसर लिए उपलब्ध हो जाएगा ।

जैसा कि आपने बताया है कि सिस्टम कॉल प्रविष्टि में निर्दिष्ट हैं। sys_call_table: के तहत और वे सभी "sys" उपसर्ग के साथ शुरू होते हैं।

आप में सिस्टम कॉल समारोह हैडर पा सकते हैं: शामिल/linux/syscalls.h, तो आप इसे यहाँ पा सकते हैं: http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h

उपयोग LXR करने के क्रम में सामान्य रूप में (टिप्पणी ऊपर पहले से ही उल्लेख किया है के रूप में) स्रोत कोड ब्राउज़ करें।

किसी भी तरह, समारोह SYSCALL_DEFINE1 या मैक्रो के othe संस्करणों का उपयोग कर कार्यान्वित किया जाता है, http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c

+1

ऐसे फास्टकॉल भी हैं जिन्हें बाधा की आवश्यकता नहीं होती है। मुझे यकीन नहीं है कि उन्हें कैसे कार्यान्वित किया जाता है, इसलिए आपको इसके लिए Google करना होगा, मुझे खेद है। – RedX

+0

@RedX आप सामान्य रूप से सही हैं लेकिन मुझे पूरा यकीन है कि सिस्टम sys_call_table' के नीचे प्रविष्टि में कॉल करता है, एक बाधा के साथ कार्यान्वित किया जाता है (संक्षेप में कोड पढ़ने के बाद) –

+2

@RedX x86 में SYSENTER/SYSEXIT निर्देश हैं जो शायद आप इस बारे में सोच रहे हैं: http://articles.manugarg.com/systemcallinlinux2_6.html – SoapBox

0

देखते हैं कि आप एक वास्तविक सिस्टम कॉल के लिए देख रहे हैं, एक सिस्टम कॉल के एक कार्यान्वयन नहीं, हो सकता है आप करना चाहते हैं कुछ सी पुस्तकालयों की जांच करें। एक कर्नेल में सिस्टम कॉल क्यों शामिल होगा? (मैं एक सिस्टम कॉल कार्यान्वयन के बारे में बात नहीं कर रहा हूँ, मैं जैसे उदाहरण के लिए एक वास्तविक chdir कॉल के बारे में बात कर रहा हूँ। एक chdirसिस्टम कॉल, जो निर्देशिका को परिवर्तित करने के लिए एक अनुरोध है नहीं है और वहाँ एक chdirहै सिस्टम कॉल कार्यान्वयन जो वास्तव में इसे बदलता है और कर्नेल में कहीं होना चाहिए)। ठीक है, हो सकता है कि कुछ कर्नेल में कुछ सिस्को भी शामिल हों लेकिन यह एक और कहानी है :)

वैसे भी, अगर मुझे आपका प्रश्न सही लगता है, तो आप एक कार्यान्वयन की तलाश नहीं कर रहे हैं लेकिन एक वास्तविक कॉल। जीएनयू libc मेरे लिए बहुत जटिल है, लेकिन आप dietlibc स्रोतों को ब्राउज़ करने का प्रयास कर सकते हैं। कुछ उदाहरण:

chdir.S

syscalls.h

7

86 आर्किटेक्चर SYCALL_VECTOR (0x80) बीच में के लिए केवल 32 बिट कर्नेल के लिए प्रयोग किया जाता है। आप arch/x86/include/asm/irq_vectors.h में इंटरप्ट वेक्टर लेआउट देख सकते हैं।

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

64 बिट कर्नेल के लिए, नई SYSENTER (इंटेल) या syscall (एएमडी) intructions हैं: traps.c से trap_init() समारोह एक है कि जाल हैंडलर entry_32.S में परिभाषित करता है प्रदर्शन कारणों के लिए इस्तेमाल किया। syscall_init()arch/x86/kernel/cpu/common.c से फ़ंक्शन entry_64.S में परिभाषित "हैंडलर" सेट करता है और उसी नाम (system_call) को परिभाषित करता है।

उपयोगकर्ता-स्थान के लिए लगातार आप this page (फ़ंक्शन/फ़ाइल नामों के लिए पुराना पुराना) देखना चाहते हैं।

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