2013-09-24 6 views
6

के बीच अंतर SYS_exit, sys_exit() और निकास() के बीच क्या अंतर है?सिस्टम कॉल: sys_exit(), SYS_exit और निकास()

मैं क्या समझ:

  • लिनक्स कर्नेल प्रणाली कॉल है, जो man 2 syscalls में सूचीबद्ध हैं प्रदान करता है।
  • glibc द्वारा प्रदान किए गए उन सिस्कोल के रैपर फ़ंक्शन हैं जिनमें ज्यादातर सिस्को के समान नाम हैं।

मेरा प्रश्न: man 2 syscalls में, SYS_exit और sys_exit() का कोई उल्लेख नहीं है, उदाहरण के लिए। वे क्या हैं?

नोट: सिस्कोल exit यहां केवल एक उदाहरण है। मेरा सवाल वास्तव में है: SYS_xxx और sys_xxx() क्या हैं?

उत्तर

3

मैं आपके उदाहरण के रूप में बाहर निकलें() का उपयोग करूंगा हालांकि यह सभी सिस्टम कॉल पर लागू होता है।

फॉर्म sys_exit() के फ़ंक्शन कर्नेल रूटीन के वास्तविक प्रविष्टि बिंदु हैं जो आपके द्वारा निकाले जाने वाले फ़ंक्शन को लागू करते हैं()। ये प्रतीक उपयोगकर्ता-मोड प्रोग्रामर के लिए भी उपलब्ध नहीं हैं। यही है, जब तक कि आप कर्नेल को हैक नहीं कर रहे हैं, आप इन कार्यों से लिंक नहीं कर सकते हैं क्योंकि उनके प्रतीक कर्नेल के बाहर उपलब्ध नहीं हैं। अगर मैं libmsw.a जो

static int msw_func() {} 

उस में परिभाषित की तरह एक फ़ाइल गुंजाइश समारोह था लिखा था, आप कोई इसे करने के लिए लिंक करने के लिए, क्योंकि यह libmsw प्रतीक तालिका में निर्यात नहीं कर रहा है की कोशिश कर सफलता के लिए होता है; वह यह है कि:

cc your_program.c libmsw.a 

की तरह एक त्रुटि प्राप्त होते हैं:

ld: cannot resolve symbol msw_func 

क्योंकि इसका निर्यात नहीं है; कर्नेल में निहित sys_exit() के लिए भी यही लागू होता है।

आदेश में एक उपयोगकर्ता कार्यक्रम दिनचर्या कर्नेल पाने के लिए, syscall (2) इंटरफ़ेस उपयोगकर्ता के मोड से एक स्विच को प्रभावित करने के मोड कर्नेल के लिए इस्तेमाल किया जाना चाहिए। जब उस मोड-स्विच (कभी-कभी जाल कहा जाता है) होता है तो कर्नेल फ़ंक्शन में पूर्णांक को मैप करने वाले कर्नेल तालिका में उचित कर्नेल रूटीन को देखने के लिए एक छोटा पूर्णांक उपयोग किया जाता है। तालिका में एक प्रविष्टि प्रपत्र

{SYS_exit, sys_exit}, 

कहाँ SYS_exit एक पूर्वप्रक्रमक मैक्रो जो

#define SYS_exit (1) 

है और इससे पहले कि आप क्योंकि वहाँ इसे बदलने के लिए कारण नहीं किया गया है पैदा हुए थे के बाद से किया गया है 1 है। यह सिस्टम कॉल की तालिका में पहली प्रविष्टि भी होती है जो एक साधारण सरणी सूचकांक को देखती है।

आप अपने प्रश्न में नोट के रूप में, sys_exit तक पहुँचने के लिए एक नियमित उपयोगकर्ता-मोड कार्यक्रम के लिए उचित तरीके से glibc (या इसी तरह कोर पुस्तकालय) में पतली आवरण के माध्यम से है। SYS_exit या sys_exit के साथ आपको गड़बड़ करने का एकमात्र कारण यह है कि यदि आप कर्नेल कोड लिख रहे थे।

+0

glibc तो कुछ मामलों में आप सीधे syscall के माध्यम से 'एक सिस्टम कॉल आह्वान करने के लिए इसी' SYS_' पूर्वप्रक्रमक मैक्रो आवश्यकता हो सकती है, हर सिस्टम कॉल के लिए रैपर प्रदान नहीं करता है() 'उपयोगकर्ता अंतरिक्ष कोड में। हालांकि ये मामले दुर्लभ हैं। –

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