2012-05-05 13 views
29

मैंने पढ़ा है कि यह उन कार्यों के लिए उपयोग किया जाता है जो लिनक्स में सिस्टम कॉल लागू करते हैं। उदाहरण के लिए:'asmlinkage' संशोधक के लिए क्या मतलब है?

asmlinkage long sys_getjiffies(void) 
{ 
    return (long)get_jiffies_64(); 
} 

और यह संकलक बताता है कि ढेर पर सभी समारोह तर्क पारित करने के लिए। लेकिन क्या यह पहले से ही मामला नहीं है? फ़ंक्शन तर्क आमतौर पर केवल स्टैक पर धक्का देकर पारित होते हैं। या यह है कि हम रजिस्टरों के माध्यम से कार्य तर्कों को पारित करने का जिक्र कर रहे हैं?

+3

ध्यान दें कि लिनक्स कर्नेल कार्यों के पहले पैरामीटर डिफ़ॉल्ट रूप से 86 पर रजिस्टरों में पारित कर रहे हैं। X86-32 पर पहले 3 पैरामीटर '% eax','% edx' और '% ecx' में दिए गए हैं, बाकी क्रम में, बाकी स्टैक पर जाते हैं। परिवर्तनीय तर्क सूचियों वाले फ़ंक्शन एक अपवाद हैं, उन्हें x86-32 पर स्टैक पर उनके सभी तर्क मिलते हैं। X86-64 पर, पहले 6 पैरामीटर '% आरडीआई','% आरएसआई', '% rdx','% आरसीएक्स', '% आर 8','% आर 9' (यहां तक ​​कि varargs के साथ कार्यों के लिए) में पारित किए जाते हैं, उस क्रम में, बाकी - ढेर पर। हालांकि सिस्टम कॉल विभिन्न सम्मेलनों का पालन करता है। – Eugene

+0

(जारी) जैसा कि @ dirkgently उल्लेख किया गया है, 'asmlinkage' पैरामीटर गुजरने पर डिफ़ॉल्ट डिफेंशन को ओवरराइड करने का एक तरीका है। [एग्नेर फोग के मैनुअल] (http://www.agner.org/optimize/calling_conventions.pdf) में विभिन्न कॉलिंग सम्मेलनों का एक विस्तृत विवरण भी देखें। – Eugene

+0

क्वारा में एक अच्छी व्याख्या है: [https://www.quora.com/Linux- कर्नेल/What-does-asmlinkage-mean-in-the-definition-of-system-calls ](https://www .quora.com/लिनक्स कर्नेल/क्या-क्या-asmlinkage-मतलब-इन-परिभाषा के- सिस्टम-कॉल)। –

उत्तर

26

एक FAQ नहीं है:

asmlinkage टैग एक दूसरी बात यह है कि हम के बारे में इस सरल समारोह का पालन करना चाहिए है। यह कुछ जीसीसी जादू कि संकलक कि समारोह रजिस्टरों में अपने तर्क के किसी भी (एक आम अनुकूलन) को खोजने के लिए उम्मीद नहीं करनी चाहिए बताता है के लिए एक #define है, लेकिन केवल CPU के ढेर पर। हमारे पहले के सम्बन्ध को याद रखें कि system_call अपने पहले तर्क, सिस्टम कॉल नंबर का उपभोग करता है, और वास्तविक सिस्टम कॉल के साथ पारित चार और तर्कों की अनुमति देता है। system_call स्टैक पर अपने अन्य तर्क छोड़कर ( इसे रजिस्टरों में पास कर दिया गया था) छोड़कर इस उपलब्धि को प्राप्त करता है। सभी सिस्टम कॉल को asmlinkage टैग के साथ चिह्नित किया गया है, इसलिए वे सभी तर्कों के लिए ढेर को देखते हैं। बेशक, sys_ni_syscall के मामले में, इससे कोई फर्क नहीं पड़ता, क्योंकि sys_ni_syscall कोई तर्क नहीं लेता है, लेकिन यह अधिकांश अन्य सिस्टम कॉल के लिए समस्या है। और, क्योंकि आप कई अन्य कार्यों के सामने asmlinkage देख रहे होंगे, मैंने सोचा था कि आपको पता होना चाहिए कि यह क्या था।

इसका उपयोग असेंबली फ़ाइलों से फ़ंक्शन को कॉल करने की अनुमति देने के लिए भी किया जाता है।

+6

कारण यह है कि किसी भी तरह से कर्नेल को सभी रजिस्टरों को स्टैक पर सहेजने की आवश्यकता होती है (उपयोगकर्ता स्पेस पर लौटने से पहले पर्यावरण को पुनर्स्थापित करने के लिए) उपयोगकर्ता स्पेस से सिस्टम कॉल अनुरोधों को संभालने के दौरान, उसके बाद पैरामीटर स्टैक पर उपलब्ध होते हैं। यानी, इसे अतिरिक्त प्रयास की आवश्यकता नहीं है। स्रोत: http://stackoverflow.com/questions/10060168/is-asmlinkage-required-for-a-c-function-to-be-called-from-assembly – kumar

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