8

मैं कुछ लिनक्स ड्राइवरों को पोर्ट करने की कोशिश कर रहा हूं और महसूस किया कि लिनक्स के कर्नेल संस्करण 2.4 और 2.6 के बीच काफी अंतर है।लिनक्स कर्नेल मॉड्यूल में module_init और init_module के बीच क्या अंतर है?

गिरी का 2.4 संस्करण में, मॉड्यूल प्रोग्रामिंग के रूप में नीचे था - कर्नेल का 2.6 संस्करण के साथ

#define MODULE 
#include <linux/module.h> 
#include <linux/kernel.h> 

int init_module(void)  
{ 
printk(KERN_INFO "Hi \n"); 
return 0; 
} 

void cleanup_module(void) 
{ 
printk(KERN_INFO "Bye \n"); 
} 

लेकिन,, निम्नलिखित मॉड्यूल के लिए किया जा सकता है -

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 

static int hi_init(void) 
{ 
    printk(KERN_ALERT "Hi \n"); 
    return 0; 
} 

static void hi_exit(void) 
{ 
    printk(KERN_ALERT "Bye \n"); 
} 

module_init(hi_init); 
module_exit(hi_exit); 

कर्नेल 2.6 में ऐसे परिवर्तनों का क्या फायदा है और लिनक्स के कर्नेल 2.6 में यह परिवर्तन क्यों आवश्यक था?

+0

2.4 घोषणाओं का अर्थ है कि आप सिस्टम में मॉड्यूल का निर्माण कभी नहीं कर सकते (क्योंकि घोषणाएं स्थैतिक नहीं हैं)। – stsquad

+1

मॉड्यूल_इनिट के लिए यहां एक बहुत अच्छी व्याख्या है: http://stackoverflow.com/questions/18605653/linux-module-init-vs-core-initcall-vs-early-initcall – user2311046

उत्तर

6

आप नए कार्यों की परिभाषा को देखें, तो:

/* Each module must use one module_init(). */ 
#define module_init(initfn)     \ 
static inline initcall_t __inittest(void)  \ 
{ return initfn; }     \ 
int init_module(void) __attribute__((alias(#initfn))); 

/* This is only required if you want to be unloadable. */ 
#define module_exit(exitfn)     \ 
static inline exitcall_t __exittest(void)  \ 
{ return exitfn; }     \ 
void cleanup_module(void) __attribute__((alias(#exitfn))); 

आप इसे सही बॉयलरप्लेट इसलिए शामिल किया गया है इन विशेष कार्य सही ढंग से संकलक द्वारा इलाज सकता है देखेंगे। लिनक्स का आंतरिक एपीआई यही करता है, अगर समस्या को हल करने के बेहतर तरीके हैं तो यह विकसित होता है।

+0

हाँ, लेकिन यह बेहतर कैसे है मार्ग? निर्देश केवल उपयोगकर्ता को फ़ंक्शन नाम को te init_module() फ़ंक्शन – Chethan

+0

पढ़ने के लिए उपनाम के रूप में बनाए जाने के लिए हैं, एपीआई की पठनीयता, स्थिरता, सम्मेलन लागू करना। आम तौर पर आप एपीआई अनुरूपता के बॉयलर प्लेट बिट्स को पेंच करने के लिए कठिन बनाना चाहते हैं और डेवलपर को उन वास्तविक समस्याओं पर ध्यान केंद्रित करने के लिए छोड़ दें जिन्हें उन्हें हल करने की आवश्यकता है। – stsquad

1

एक फायदा पठनीयता है। cdrom_init() तुरंत आपको बताता है कि यह cdrom ड्राइवर के लिए init() कॉल है।

5

क्या कर्नेल 2,6

module_init में [module_init] का लाभ है भी, 2.4 में से बाहर निकल गया मन आप।

यह मॉड्यूल को आरंभ करने के लिए आवश्यक बॉयलरप्लेट जोड़ता है और मॉड्यूल फ़ाइल को मॉड्यूल के बजाय कर्नेल में संकलित करते समय प्रविष्टि फ़ंक्शन चलाता है।

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