कर्नेल ड्राइवर और कर्नेल मॉड्यूल के बीच अंतर क्या है?


66

जब मैं lspci -k3.2.0-29-जेनेरिक कर्नेल के साथ अपने कुबंटू पर करता हूं तो मैं कुछ इस तरह देख सकता हूं:

01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1)
    Subsystem: NVIDIA Corporation Device 0492
    Kernel driver in use: nvidia
    Kernel modules: nvidia_current, nouveau, nvidiafb

वहाँ एक कर्नेल ड्राइवर है nvidiaऔर कर्नेल मॉड्यूल nvidia_current, nouveau, nvidiafb

अब मैंने सोचा कि कर्नेल ड्राइवर और कर्नेल मॉड्यूल के बीच क्या अंतर हो सकता है?

जवाबों:


78

एक कर्नेल मॉड्यूल थोड़ा संकलित कोड है जिसे रन-टाइम में कर्नेल में डाला जा सकता है, जैसे कि insmodया modprobe

ड्राइवर एक बिट कोड है जो कर्नेल में कुछ हार्डवेयर डिवाइस से बात करने के लिए चलता है। यह हार्डवेयर को "ड्राइव" करता है। आपके कंप्यूटर के अधिकांश हर हार्डवेयर में एक संबंधित ड्राइवर होता है। एक चलने वाले कर्नेल का एक बड़ा हिस्सा ड्राइवर कोड होता है ।²

ड्राइवर को डिस्क पर कर्नेल फ़ाइल में सांख्यिकीय रूप से बनाया जा सकता है। ड्राइवर को कर्नेल मॉड्यूल के रूप में भी बनाया जा सकता है ताकि बाद में इसे गतिशील रूप से लोड किया जा सके। (और फिर शायद उतार दिया।)

मानक अभ्यास ड्राइवरों को कर्नेल मॉड्यूल के रूप में निर्माण करना है, जहां संभव हो, बल्कि उन्हें कर्नेल से सांख्यिकीय रूप से जोड़ना, क्योंकि यह अधिक लचीलापन देता है। हालांकि इसके कुछ अच्छे कारण नहीं हैं:

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

  • वैधानिक रूप से निर्मित ड्राइवर वही हो सकते हैं जो आप एक ऐसी प्रणाली में चाहते हैं, जो कि वैधानिक रूप से स्कोप की गई हो, जैसे कि एक एम्बेडेड सिस्टम । यह कहना है, अगर आप पहले से जानते हैं कि कौन से ड्राइवरों की हमेशा जरूरत होगी और यह कभी नहीं बदलेगा, तो आपके पास एक अच्छा कारण है कि आप गतिशील कर्नेल मॉड्यूल के साथ परेशान न हों।

  • यदि आप अपने कर्नेल को सांख्यिकीय रूप से बनाते हैं और लिनक्स के डायनामिक मॉड्यूल लोडिंग सुविधा को अक्षम करते हैं, तो आप कर्नेल कोड के रन-टाइम संशोधन को रोकते हैं। यह लचीलेपन की कीमत पर अतिरिक्त सुरक्षा और स्थिरता प्रदान करता है।

सभी कर्नेल मॉड्यूल ड्राइवर नहीं हैं। उदाहरण के लिए, लिनक्स कर्नेल में एक अपेक्षाकृत हालिया विशेषता यह है कि आप एक अलग प्रक्रिया अनुसूचक को लोड कर सकते हैं । एक अन्य उदाहरण यह है कि अधिक जटिल प्रकार के हार्डवेयर में अक्सर कई सामान्य परतें होती हैं, जो निम्न-स्तरीय हार्डवेयर ड्राइवर और उपयोगकर्ता के बीच में बैठती हैं, जैसे कि USB HID ड्राइवर , जो USB स्टैक के एक विशेष तत्व को अंतर्निहित हार्डवेयर से स्वतंत्र रूप से लागू करता है।


Asides:

  1. इस विस्तृत कथन का एक अपवाद सीपीयू चिप है, जिसमें कोई "ड्राइवर" नहीं है । आपके कंप्यूटर में हार्डवेयर भी हो सकता है जिसके लिए आपके पास कोई ड्राइवर नहीं है।

  2. OS कर्नेल में शेष कोड मेमोरी प्रबंधन , IPC , शेड्यूलिंग आदि जैसी सामान्य सेवाएं प्रदान करता है । ये सेवाएँ मुख्य रूप से उपयोगकर्ता-योग्य एप्लिकेशनों की सेवा कर सकती हैं , जैसा कि पहले से जुड़े उदाहरणों के साथ, या वे ड्राइवर या अन्य इंट्रा द्वारा उपयोग की जाने वाली आंतरिक सेवाएँ हो सकती हैं- कर्नेल अवसंरचना।

  3. में एक /boot, द्वारा बूट समय पर रैम में लोड बूट लोडर के शुरू में बूट प्रक्रिया


1
मॉड्यूल फाइल सिस्टम, नेटवर्क प्रोटोकॉल, फ़ायरवॉल फ़ंक्शंस और बहुत कुछ हो सकता है। कुछ हार्डवेयर (जैसे वाईफाई कार्ड) को मॉड्यूल के ढेर की आवश्यकता होती है, कुछ सामान्य बुनियादी ढांचे की पेशकश करते हैं जबकि अन्य हार्डवेयर को संभालते हैं।
वॉनब्रांड

1
यह एक अच्छी सामान्य रूपरेखा है, लेकिन मेरे पास ओपी के समान ही सवाल था, फिर इस जवाब में आया और अभी भी यह नहीं जानता था कि "ड्राइवर का उपयोग" "मॉड्यूल" से अलग क्यों है। इसके विपरीत, @Jim Paris का उत्तर सही है। प्रेषक man lspci: "-k कर्नेल ड्राइवर को प्रत्येक डिवाइस को संभालने के साथ -साथ कर्नेल मॉड्यूल को भी दिखाने में सक्षम ।" आप इसे पढ़ सकते हैं: "ड्राइवर को वर्तमान में दिखाओ / वास्तव में डिवाइस को हैंडल कर रहा है और सभी मॉड्यूल जो इसे संभालने के लिए उपयोग किए जा सकते हैं"।
बिनरूस

यदि आप खिड़कियां जानते हैं: एक मॉड्यूल एक DLL के समान है। यूनिक्स पर, एक मॉड्यूल एक साझा वस्तु के समान है, लेकिन एक मॉड्यूल सिर्फ कर्नेल के लिए है। गतिशील रूप से लिंक किए गए मॉड्यूल में ड्राइवर हो सकते हैं। एक कर्नेल में सांख्यिकीय रूप से जुड़े ड्राइवर हो सकते हैं। एक मॉड्यूल DLL (या .so) से भिन्न होता है क्योंकि कर्नेल की विशिष्ट आवश्यकताएं होती हैं कि कैसे चीजें गतिशील रूप से लोड होती हैं।
रोबोकट

18

lspciआउटपुट के बारे में आपके विशिष्ट प्रश्न का उत्तर देने के लिए , "कर्नेल ड्राइवर" लाइन संदर्भित करता है कि ड्राइवर वर्तमान में कार्ड के लिए बाध्य है, इस मामले में मालिकाना nvidiaचालक। "कर्नेल मॉड्यूल" लाइन उन सभी ड्राइवरों को सूचीबद्ध करती है जिन्हें इस कार्ड के लिए बाध्य करने में सक्षम माना जाता है । यहाँ, मालिकाना चालक इसे एक अलग नाम दिखाता है, शायद इस वजह से कि lspciचालक और उसके नाम के बीच का नाम कैसे मिला और इसका नाम चालक में ही रखा गया।


धन्यवाद - जिसने मदद की। अगर मैंने केवल जारी किया था man lspci- तो यह वही कहता है जो आपने लिखा था।
बिनरूस

5

इस अच्छे ट्यूटोरियल के अनुसार :

... एक प्रकार का मॉड्यूल डिवाइस ड्राइवर है, जो कर्नेल को सिस्टम से जुड़े हार्डवेयर तक पहुंचने की अनुमति देता है।

इसलिए, यदि हम एक पेड़ को आकर्षित करने की कोशिश करते हैं, तो हमारे पास "डिवाइस ड्राइवर" होगा जो कि (विस्तार) मॉड्यूल से विरासत में मिला है, और जिसमें अधिक विशिष्ट विशेषताएं हैं, जिसके बीच हम "हार्डवेयर तक पहुंच" पाते हैं ...


यह केवल आंशिक रूप से सही है। ड्राइवर पदानुक्रम में एक वर्ग का एक ऑब्जेक्ट है (हाँ, लिनक्स के आंतरिक डिजाइन, जैसा कि अधिकांश वर्तमान ऑपरेटिंग सिस्टम, ऑब्जेक्ट ओरिएंटेड है)। लेकिन ड्राइवर ने एक मॉड्यूल (रनटाइम पर लोड करने योग्य) या कर्नेल में संकलित किया हो सकता है। विकल्प, कोड वार के बीच कोई (या बहुत कम) अंतर नहीं है।
वॉनब्रांड

4

एक कर्नेल मॉड्यूल एक उपकरण चालक नहीं हो सकता है।

"कर्नेल ड्राइवर" एक अच्छी तरह से परिभाषित शब्द नहीं है, लेकिन चलो इसे एक शॉट दें।

यह एक कर्नेल मॉड्यूल है जो किसी भी हार्डवेयर को ड्राइव नहीं करता है, और इस तरह इसे "डिवाइस ड्राइवर" के रूप में नहीं माना जा सकता है:

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

MODULE_LICENSE("GPL");

static int myinit(void)
{
    printk(KERN_INFO "hello init\n");
    return 0;
}

static void myexit(void)
{
    printk(KERN_INFO "hello exit\n");
}

module_init(myinit)
module_exit(myexit)

निर्माण के बाद, आप इसका उपयोग कर सकते हैं:

insmod hello.ko

और यह प्रिंट hello initकरता है dmesg

हालाँकि, कर्नेल मॉड्यूल हैं जो डिवाइस ड्राइवर नहीं हैं, लेकिन वास्तव में उपयोगी हैं, उदाहरण के लिए, कर्नेल डीबगिंग / प्रदर्शन जानकारी को उजागर करने वाले मॉड्यूल।

डिवाइस ड्राइवर आमतौर पर कर्नेल मॉड्यूल भी होते हैं।

कुछ का एक उदाहरण जो "डिवाइस ड्राइवर" है, उसे उत्पन्न करने के लिए थोड़ा कठिन है, क्योंकि इसमें ड्राइव करने के लिए एक हार्डवेयर की आवश्यकता होती है, और हार्डवेयर विवरण जटिल होते हैं।

QEMU या अन्य एमुलेटर का उपयोग करते हुए, हम वास्तविक या सरलीकृत हार्डवेयर के सॉफ्टवेयर मॉडल का निर्माण कर सकते हैं, जो कि हार्डवेयर से बात करना सीखने का एक शानदार तरीका है। यहाँ एक न्यूनतम PCI डिवाइस ड्राइवर का एक सरल उदाहरण दिया गया है: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8d3df0806d84dc09f355/kernel_module/hello.c

फिर हम देखते हैं कि x86 में, हार्डवेयर से बात करना नीचे आता है:

उन कार्यों को सामान्य रूप से उपयोगकर्ताभूमि से नहीं किया जा सकता है, जैसा कि समझाया गया है: उपयोगकर्ता स्थान और कर्नेल स्थान के बीच अंतर क्या है? हालाँकि कुछ अपवाद हैं: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space

कर्नेल तब उच्च स्तर के एपीआई की पेशकश करता है ताकि इस तरह की हार्डवेयर इंटरैक्शन को आसान और अधिक पोर्टेबल बनाया जा सके:

  • request_irq बीच में आना
  • ioreadX और IO मेमोरी मैपिंग
  • पीसीआई और यूएसबी जैसे लोकप्रिय प्रोटोकॉल के लिए उच्च स्तर का इंटरफेस

0

मेरा जवाब जिम के साथ जाएगा। एक कर्नेल ड्राइवर एक प्रोग्राम (कर्नेल मॉड्यूल) है जिसे हार्डवेयर के टुकड़े को चलाने के लिए डिज़ाइन किया गया है। Lspci आउटपुट का कहना है कि एनवीडिया कर्नेल ड्राइवर है क्योंकि यह loadedडिवाइस के लिए मॉड्यूल है। इसके साथ अन्य उपलब्ध कर्नेल मॉड्यूल उपलब्ध हैं।

मुझे लगता है कि लिनक्स में आदेशों की सूची और निकालने के ड्राइवरों हैं में जोड़ देंगे lsmodऔर rmmodक्रमशः। जो कहता है कि सूची मॉड्यूल और निकालें मॉड्यूल।


0

सभी ड्राइवर मॉड्यूल हैं। सभी मॉड्यूल ड्राइवर नहीं हैं।

मॉड्यूल रनटाइम पर डाला जा सकता है। मॉड्यूल / ड्राइवर को कर्नेल के साथ-साथ स्टेटिकली संकलित किया जा सकता है।

विशिष्ट मॉड्यूल init है

module_init(init_fn);
init_fn()
{
   /* some code */
}

एक ही मॉड्यूल को ड्राइवर बनाया जा सकता है

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}

8
ड्राइवर हमेशा मॉड्यूल नहीं होते हैं, उन्हें मुख्य कर्नेल छवि में शामिल किया जा सकता है।
गाइल्स

3
@Prabagaran: "सभी ड्राइवर मॉड्यूल हैं। सभी मॉड्यूल ड्राइवर नहीं हैं।" यह विरोधाभासी है। गणितीय शब्दों में, आप जो कह रहे हैं वह D -> M और M ->! D है। यह डी और डी के लिए अनुमति देता है।
फ्रांसेस्को टर्बो

2
मुझे लगता है कि उनका मतलब है "सभी ड्राइवर मॉड्यूल हैं। सभी मॉड्यूल ड्राइवर नहीं हैं"।
रेनैन

4
@ रेनन: यह सही होगा, लेकिन अगर आप इस उत्तर के लिए संपादित इतिहास को देखें तो किसी ने पहले से ही गलती को ठीक करने की कोशिश की और लेखक ने इसे वापस कर दिया। आम तौर पर मैं सिर्फ त्रुटि को ठीक करने और आगे बढ़ने के लिए संपादित करूंगा, लेकिन इस मामले में मैंने -1'एड किया है क्योंकि यह सिर्फ गलत है और इस मुद्दे को भ्रमित कर रहा है।
कालेब

जैसा कि मुझे याद है (थोड़ी देर में चारों ओर बेवकूफ नहीं बनाया गया) कुछ ड्राइवर हैं जिन्हें लोड करने योग्य मॉड्यूल के रूप में नहीं बनाया जा सकता है। मुझे लगता है कि मैं दूसरों को याद कर सकता हूं जिसे केवल मॉड्यूल के रूप में ही संभाला जा सकता है।
वॉनब्रांड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.