Hiện tại, tôi đang học trình điều khiển thiết bị Linux. Và đã bị mắc kẹt về cách mở một tập tin thiết bị hoạt động?cách hoạt động của các trình điều khiển thiết bị và tệp thông thường
Những gì tôi đã cho đến bây giờ ... Hãy xem xét một mã đơn giản mở ra một file bình thường ..
#incldue<stdio.h>
int main() {
FILE fp;
char buffer[20];
fp = fopen(/home/yoggi/foo.txt, "r");
fread(buffer, 5, 1, fp);
}
Trong chương trình trên, The fopen(), chức năng c-thư viện, là một chức năng wrapper vào hệ thống, hãy gọi mở(), thực tập viên gọi sys_open() hoặc file_open() trong lớp VFS. Vì linux hỗ trợ một số hệ thống tệp, hệ thống tệp ảo sau đó chuyển điều khiển sang bộ xử lý tệp thực tế để mở tệp đó.
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.
Trong trường hợp các trình điều khiển thiết bị tương tự xảy ra. Giả sử một trình điều khiển thiết bị đơn giản.
#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");
Trước hết, chúng tôi phân bổ các số nhỏ chính cho thiết bị. Đăng ký cho phạm vi của các tập tin thiết bị và Liên kết các hoạt động tập tin thiết bị với các chức năng của trình điều khiển thiết bị.
Một số thuật ngữ tôi đã không nhận được ..
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); ?