5

वर्तमान में, मैं लिनक्स डिवाइस ड्राइवर सीख रहा हूं। और एक डिवाइस फ़ाइल कैसे खोलता है पर अटक गया?सामान्य फ़ाइल और डिवाइस ड्राइवरों के लिए खुले काम कैसे करता है

अब तक मैं क्या हो गया ... एक सरल कोड सामान्य फाइल खुलती है पर विचार करें .. उपरोक्त कार्यक्रम में

#incldue<stdio.h> 
int main() { 
    FILE fp; 
    char buffer[20]; 
    fp = fopen(/home/yoggi/foo.txt, "r"); 
    fread(buffer, 5, 1, fp); 
} 

, fopen(), ग-पुस्तकालय समारोह, एक आवरण समारोह है सिस्टम कॉल खुला(), जो इंटर्न VFS परत फ़ंक्शन में sys_open() या file_open() को कॉल करता है। चूंकि लिनक्स कई फाइल सिस्टम का समर्थन करता है, वर्चुअल फाइल सिस्टम तब फ़ाइल को खोलने के लिए नियंत्रण को वास्तविक फ़ाइल सिस्टम हैंडलर में स्थानांतरित करता है।

1) How does virtual file system(VFS) get to know on which file system the 
    underline file resides? 
2) How does it then calls the file_open or open function of that particular 
    filesystem to open file. 

डिवाइस ड्राइवरों के मामले में समान चीजें होती हैं। मान लीजिए एक साधारण डिवाइस चालक।

#include <linux/module.h> 
// othher includes... 
static dev_t first; // Global variable for the first device number 
static struct cdev c_dev; // Global variable for the character device structure 
static struct class *cl; // Global variable for the device class 
static int my_open(struct inode *i, struct file *f) 
{ 
    printk(KERN_INFO "Driver: open()\n"); 
    return 0; 
} 
static ssize_t my_read(struct file *f, char __user *buf, size_t len, loff_t *off) 
{ 
    printk(KERN_INFO "Driver: read()\n"); 
    return 0; 
} 
struct file_operations pugs_fops = 
{ 
.owner = THIS_MODULE, 
.open = my_open, 
.read = my_read, 
}; 

static int __init ofcd_init(void) /* Constructor */ 
{ 
    printk(KERN_INFO "Namaskar: ofcd registered"); 
    if (alloc_chrdev_region(&first, 0, 1, "Shweta") < 0) 
    { 
    return -1; 
    } 
    if ((cl = class_create(THIS_MODULE, "chardrv")) == NULL) 
    { 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
if (device_create(cl, NULL, first, NULL, "mynull") == NULL) 
{ 
    class_destroy(cl); 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
    cdev_init(&c_dev, &pugs_fops); 
if (cdev_add(&c_dev, first, 1) == -1) 
{ 
    device_destroy(cl, first); 
    class_destroy(cl); 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
    return 0; 
} 

static void __exit ofcd_exit(void) /* Destructor */ 
{ 
cdev_del(&c_dev); 
device_destroy(cl, first); 
class_destroy(cl); 
unregister_chrdev_region(first, 1); 
printk(KERN_INFO "Alvida: ofcd unregistered"); 
} 
module_init(ofcd_init); 
module_exit(ofcd_exit); 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>"); 
MODULE_DESCRIPTION("Our First Character Driver"); 

सबसे पहले हम डिवाइस के लिए प्रमुख मामूली संख्या आवंटित करते हैं। डिवाइस फ़ाइलों की श्रेणी के लिए पंजीकरण करें और डिवाइस ड्राइवर कार्यों को डिवाइस ड्राइवर कार्यों में लिंक करना।

अवधि मैं कर रहे हैं नहीं मिला से कुछ ..

1) What does actually cdev_add() do? in terms of registering a device to the 
    kernel. 
2) Registering a device to the kernel means? 
3) How does a open(/dev/mynull, O_RONLY); called on a device file actually calls 
    the open function of driver which is mapped while initializing the device 
    by calling routine cdev_init(&c_dev, &pugs_fops); ? 

उत्तर

7

1) कैसे आभासी फाइल सिस्टम (वीएफएस) पर जो फाइल सिस्टम रेखांकन फ़ाइल रहता है पता करने के लिए मिलता है?

आप फ़ाइल आप अपनी पूर्ण पथ नाम (या वर्तमान कार्यशील निर्देशिका) द्वारा खोलने की कोशिश कर रहे हैं निर्दिष्ट करना होगा।
तो इस निर्देशिका पथ को पीछे की तरफ घुमाकर, माउंट पॉइंट पर पहला मैच (गहरा पथ) घुड़सवार फाइल सिस्टम, फाइल सिस्टम और डिवाइस का प्रकार प्रदान करेगा।

प्रत्येक फाइल सिस्टम यह जानकारी प्रदान करता है जब इसे घुमाया जाता है और माउंट टेबल में सहेजा जाता है।
आप mount कमांड का उपयोग कर इस (वर्तमान स्थिति) जानकारी को देख सकते हैं।

2) फिर फ़ाइल को खोलने के लिए फ़ाइल_ओपेन या उस विशेष फाइल सिस्टम के खुले फ़ंक्शन को कैसे कॉल किया जाता है।

एक बार फाइल सिस्टम में जाना जाता है, उस के लिए ops संरचना FS लिया गया है, और open() entrypoint कहा जा सकता है।

1) वास्तव में cdev_add() क्या करता है? डिवाइस को कर्नेल में पंजीकृत करने के संदर्भ में।

ड्राइवर पंजीकरण (उदाहरण, एक चार डिवाइस के लिए cdev_init()) ड्राइवर का ops संरचना जो कार्यों कि चालक प्रदर्शन कर सकते हैं की entrypoints सूचीबद्ध करता है स्थापित करता है।
cdev_add() कर्नेल को सूचित करता है कि ड्राइवर उस चार डिवाइस प्रकार के विशिष्ट उदाहरण को नियंत्रित कर सकता है।उस डिवाइस इंस्टेंस को एक मामूली संख्या असाइन की जाती है जो डिवाइस नाम को ड्राइवर में राज्य जानकारी के लिए /dev में जोड़ती है।
ध्यान दें कि चार (जैसे नेटवर्क या प्लेटफार्म (बस) डिवाइस) के अलावा डिवाइस प्रकार एक अलग उपप्रणाली से संबंधित हैं, और विभिन्न पंजीकरण प्रक्रियाओं का उपयोग करते हैं।

2) कर्नेल को डिवाइस पंजीकृत करना मतलब है?

उस डिवाइस तक पहुंच अब सक्षम है।

3) एक खुला (/ dev/mynull, O_RONLY) कैसे होता है; डिवाइस फ़ाइल पर कॉल किया जाता है, वास्तव में को ड्राइवर के खुले फ़ंक्शन को कॉल करता है जिसे डिवाइस को नियमित cdev_init (c_dev, & pugs_fops) कॉल करके डिवाइस मैप किया जाता है। ?

ड्राइवर का init() दिनचर्या केवल लोड होने पर ही कॉल किया जाना चाहिए। इस दिनचर्या को डिवाइस के सभी उदाहरणों के अस्तित्व और परिचालन स्थिति की जांच करनी चाहिए। इंटरप्ट लाइन, डीएमए चैनल और आई/ओ पोर्ट और/या मेमोरी स्पेस जैसे संसाधनों को अधिग्रहित किया जाना चाहिए। ड्राइवर कर्नेल के साथ ops संरचना पंजीकृत करता है। ड्राइवर कर्नेल के साथ डिवाइस के प्रत्येक उदाहरण को पंजीकृत करता है।

open() उपयोगकर्ता स्पेस में कॉल सी लाइब्रेरी द्वारा संभाला जाता है। /dev डिवाइस का नाम डिवाइस प्रमुख संख्या में अनुवाद किया जाता है (जो कि डिवाइस डिवाइस उपप्रणाली या कक्षा, उदाहरण के लिए tty या ऑडियो, अनुरोध को संसाधित करना है) और मामूली संख्या (जो पहचानता है कि कौन से डिवाइस ड्राइवर का उपयोग करना है और कौन सा उदाहरण डिवाइस का उपयोग किया जाता है)। प्रोसेसर पर्यवेक्षक मोड में स्विच किया जाता है ताकि कर्नेल ड्राइवर का open() दिनचर्या कहा जा सके, जिसे ड्राइवर के ops संरचना से पुनर्प्राप्त किया जाता है। ops संरचना पर थोड़ा और अधिक देखने के लिए यह other answer देखें।

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

  • कोई संबंधित समस्या नहीं^_^