एक कर्नेल मॉड्यूल एक उपकरण चालक नहीं हो सकता है।
"कर्नेल ड्राइवर" एक अच्छी तरह से परिभाषित शब्द नहीं है, लेकिन चलो इसे एक शॉट दें।
यह एक कर्नेल मॉड्यूल है जो किसी भी हार्डवेयर को ड्राइव नहीं करता है, और इस तरह इसे "डिवाइस ड्राइवर" के रूप में नहीं माना जा सकता है:
#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 मेमोरी मैपिंग
- पीसीआई और यूएसबी जैसे लोकप्रिय प्रोटोकॉल के लिए उच्च स्तर का इंटरफेस