वर्तमान में, मैं लिनक्स डिवाइस ड्राइवर सीख रहा हूं। और एक डिवाइस फ़ाइल कैसे खोलता है पर अटक गया?सामान्य फ़ाइल और डिवाइस ड्राइवरों के लिए खुले काम कैसे करता है
अब तक मैं क्या हो गया ... एक सरल कोड सामान्य फाइल खुलती है पर विचार करें .. उपरोक्त कार्यक्रम में
#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); ?