मुझे बहुत संदेह है कि कंपाइलर जानता है कि यह एक सिस्टम कॉल है। यह कहीं अधिक संभावना है कि open
कहीं लाइब्रेरी में है और लाइब्रेरी के भीतर कोड प्रासंगिक कर्नेल इंटरफ़ेस को कॉल करता है।
साधारण प्रोग्राम से विधानसभा उत्पादन:
#include <stdio.h>
int main (void) {
int fd = open("xyz");
return 0;
}
(अप्रासंगिक बिट्स निकाला गया) है:
main:
pushl %ebp ; stack frame setup.
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl $.LC0, (%esp) ; Store file name address.
call open ; call the library function.
movl %eax, 28(%esp) ; save returned file descriptor.
movl $0, %eax ; return 0 error code.
leave ; stack frame teardown.
ret
.LC0:
.string "xyz" ; file name to open.
पहली बात आप ध्यान देंगे कि वहाँ एक कॉलopen
है। दूसरे शब्दों में, यह एक समारोह है। दृष्टि में int 80
या sysenter
नहीं है, जो कि उचित सिस्टम कॉल (मेरे प्लेटफॉर्म पर वैसे भी - वाईएमएमवी) के लिए उपयोग की जाने वाली तंत्र है।
libc में रैपर फ़ंक्शन हैं जहां सिस्टम कॉल इंटरफ़ेस तक पहुंचने का वास्तविक कार्य किया जाता है।
system calls पर विकिपीडिया से एक अंश:
आम तौर पर, सिस्टम एक पुस्तकालय है कि इस तरह glibc के रूप में सामान्य कार्यक्रमों और ऑपरेटिंग सिस्टम है, आमतौर पर सी पुस्तकालय (libc) के एक कार्यान्वयन, के बीच बैठता है प्रदान करते हैं। यह पुस्तकालय ओएस और एप्लिकेशन के बीच मौजूद है, और पोर्टेबिलिटी बढ़ जाती है।
exokernel आधारित सिस्टम पर, पुस्तकालय विशेष रूप से मध्यस्थ के रूप में महत्वपूर्ण है। Exokernels पर, पुस्तकालय बहुत कम स्तर कर्नेल एपीआई से उपयोगकर्ता अनुप्रयोग ढाल, और abstractions और संसाधन प्रबंधन प्रदान करते हैं।
शब्द "सिस्टम कॉल" और "syscall" अक्सर सी मानक लाइब्रेरी फ़ंक्शंस को संदर्भित करने के लिए गलत तरीके से उपयोग किए जाते हैं, विशेष रूप से वे जो एक ही नाम के साथ संबंधित सिस्टम कॉल के लिए एक रैपर के रूप में कार्य करते हैं। लाइब्रेरी फ़ंक्शन को कॉल करने से कॉल कर्नेल मोड में स्विच नहीं होता है (यदि निष्पादन पहले से ही कर्नेल मोड में नहीं था) और आमतौर पर सामान्य सबराउटिन कॉल होता है (यानी, कुछ आईएसए में "कॉल" असेंबली निर्देश का उपयोग करके)। वास्तविक सिस्टम कॉल कर्नेल को ट्रांसफर कंट्रोल करता है (और लाइब्रेरी कॉल से अधिक कार्यान्वयन-निर्भर है)। उदाहरण के लिए, fork
और execve
जीएलबीबीसी फ़ंक्शन हैं जो बदले में fork
और execve
सिस्टम-कॉल पर कॉल करते हैं।
और, खोज का एक सा के बाद, __open
समारोह io/open.c
फाइल में glibc 2.9 में पाया जाता है, और weakref
'open
को एड।यदि आप निष्पादित करें:
nm /usr/lib/libc.a | egrep 'W __open$|W open$'
तुम वहाँ में उन्हें देख सकते हैं:
00000000 W __open
00000000 W open
खुला सिस्टम कॉल भी है। किसी पुस्तकालय में खोलने के लिए कोई कोड नहीं है। कैसे संकलक खुला कॉल के लिए हल करता है? –
ऐसा नहीं, अद्यतन देखें। – paxdiablo
आइए कहें, मैंने अपना सिस्टम कॉल डाला और कर्नेल को संकलित किया जिसमें libc में wrapper function नहीं है। –