2015-06-20 8 views
9

एक ड्राइवर मैं कम से हैफ़ंक्शन घोषणा में __devexit का क्या अर्थ है?

static void __devexit rtsx_remove(struct pci_dev *pci) 

क्या __devexit समारोह परिभाषा के संदर्भ में क्या मतलब है देखा? मैंने देखा है कि अन्य कार्यों में, static और एक वापसी प्रकार है।

+0

यह इस प्रश्न पर दो प्रयास है। ऐसा लगता है कि पहला प्रयास इतना विवरण था कि इसे अनुत्तरित किया गया था। मैं सवाल को हटाना चाहता था, लेकिन स्टैक-ओवरफ्लो ने चेतावनी दी थी कि यह डूब गया था, और मुझे लगा कि एक संपादन पिछले उत्तरों को पीछे से अप्रासंगिक रूप से अप्रासंगिक बना देगा। अगर कोई इसके बजाय संपादन/हटाना चुनने की सिफारिश करता है, तो मुझे बताएं। – Kenkron

+7

आप उस '__devexit' प्रतीक पर राइट क्लिक क्यों नहीं करते हैं, इसकी परिभाषा पर जाएं और अपने आप को देखें कि इसका क्या अर्थ है ??? यह संभवतः एक बाहरी उपकरण द्वारा पूर्वनिर्धारित चेतावनियां उत्पन्न करने के लिए उपयोग की जाने वाली एक एनोटेशन है जो कोडिंग शुद्धता या उसके जैसा कुछ कोड करने की जांच करता है। –

+2

यह यूनिक्स कर्नेल में कुछ मैक्रो है: http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/init.h – SomethingSomething

उत्तर

2

लांग-ish कहानी कम:

यह एक ऐसा मैक्रो जीसीसी का एक सेट विशेषताओं के लिए विस्तारित है। वे आपके कोड में विभिन्न सामानों के बारे में विशेष जानकारी के साथ कंपाइलर प्रदान करने का एक तरीका हैं, जैसे, इस मामले में, एक फ़ंक्शन।

इस उद्देश्य के लिए विभिन्न कंप्यूटर्स के अलग-अलग वाक्यविन्यास हैं, यह स्टैंडबाइज्ड नहीं है। उदाहरण के लिए, जीसीसी गुणों का उपयोग करता है, लेकिन अन्य कंपाइलर्स विभिन्न संरचनाओं का उपयोग करते हैं।

लांग-ish कहानी लंबी ish:

तो, मैं कोई लिनक्स कर्नेल विशेषज्ञ हूँ, लेकिन स्रोत कोड द्वारा पहचानने, इस मैक्रो Hotplug के लिए प्रयोग किया जाता है। मेरा मानना ​​है कि यह दर्शाता है कि फ़ंक्शन को एक विशिष्ट डिवाइस से बाहर निकलना चाहिए।

उदाहरण के लिए, आपके द्वारा प्रदान किया गया फ़ंक्शन रीयलटेक पीसीआई-एक्सप्रेस कार्ड रीडर ड्राइवर के साथ काम करने के लिए हॉटप्लग फ़ंक्शंस के सेट से प्रतीत होता है।

वह मैक्रो वास्तव में क्या करता है? ठीक है, मैक्रो की परिभाषा को करीब से नज़र डालें:

#define __devexit  __section(.devexit.text) __exitused __cold 

पहले भाग __section(.devexit.text) है:

# define __section(S) __attribute__ ((__section__(#S))) 

आप देख सकते हैं, इस धारा के नाम से किया जा रहा ".devexit.text" के साथ एक __attribute__(__section__()) पैदा करता है। इसका अर्थ यह है कि जीसीसी संकलित बाइनरी में नामित अनुभाग में .devexit.text (डिफ़ॉल्ट खंड के बजाय) के साथ इस विशेषता के साथ एक समारोह के असेंबली कोड को संकलित करेगा।

दूसरे भाग __exitused (कुछ करने के लिए परिभाषित MODULE मैक्रो परिभाषित किया गया है केवल अगर) है:

#define __exitused __used 

और __used, है जीसीसी संस्करण के आधार पर, परिभाषित या तो इस तरह:

# define __used     __attribute__((__used__)) 

या इस तरह:

# define __used     __attribute__((__unused__)) 

पूर्व यह सुनिश्चित करता है कि इस विशेषता वाले फ़ंक्शन को संकलित किया गया हो, भले ही इसे कहीं भी संदर्भित न किया जाए। उत्तरार्द्ध एक ही मामले में संकलक चेतावनियों को दबाता है, हालांकि यह संकलन को किसी भी तरह से प्रभावित नहीं करता है।

और अंत में, __cold:

#define __cold     __attribute__((__cold__)) 

यह एक विशेषता है जो संकलक कि इस विशेषता के साथ समारोह, अक्सर के नाम से जाना इतना है कि यह उसके अनुसार अनुकूलन कर सकते हैं नहीं जा रहा है आपको सूचित करता है।

Sooo, अंत में हमारे पास क्या है? ऐसा लगता है कि __devexit के साथ चिह्नित फ़ंक्शंस हैं जो केवल (यदि बिल्कुल कहा जाता है) नहीं कहा जाता है, और नामित अनुभाग में भरा हुआ है।

सभी स्रोत कोड here से लिया गया था। ऐसा लगता है कि मैक्रो अब वास्तव में removed from the Linux Kernel रहा है।

+1

बहुत धन्यवाद, आप एक सज्जन और विद्वान हैं। – Kenkron

1

--barak Manos

यूरेका "... यह सबसे अधिक संभावना सिर्फ एक एनोटेशन है ..."! यह पता चला है कि रहस्य तत्व को शायद annotation कहा जाता है, जो किसी फ़ंक्शन के बारे में अतिरिक्त जानकारी जोड़ता है। इस अतिरिक्त जानकारी को कंप्रेसर द्वारा बग को पकड़ने के लिए चेक किया जा सकता है जो अन्यथा अनजान हो सकता है।

संपादित करें: @MattMcNabb का कहना है कि यह एक टिप्पणी नहीं है। अनिश्चितता जोड़ा गया।

+0

यह काफी चीजें हो सकती है, क्योंकि यह संभवतः एक मैक्रो है। – Olaf

+1

यदि यह [लिनक्स कर्नेल __devexit] है (http://lxr.free-electrons.com/ident?v=2.6.33;i=__devexit) तो यह निश्चित रूप से "एनोटेशन" नहीं है। –

+0

ठीक है, यह क्या है? – Kenkron

0

इन विशेषताओं का उपयोग कुछ ड्राइवर कार्यों और डेटा घोषणाओं पर लिनक्स कर्नेल में किया गया था, जिससे उन्हें एक अलग सेक्शन में रखा गया था जिसे कुछ परिस्थितियों में छोड़ दिया जा सकता था।

हालांकि, वे अब 3.10.x से आगे (या परिभाषित) उपयोग नहीं किए जाते हैं। देखें: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=54b956b903607

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