C 简单字符驱动程序混淆

C 简单字符驱动程序混淆,c,linux-kernel,driver,linux-device-driver,C,Linux Kernel,Driver,Linux Device Driver,因此,我一直在学习linux中的设备驱动程序,并看到了如何创建驱动程序的各种示例。最常见的步骤是 创建文件操作 创建主要和次要数字 创建稍后将与此fops关联的结构cdev 使用mknod或sysfs创建节点,如class_create和device_create 我有一个困惑,如果我不创建cdev,只注册我的驱动程序,然后只在sysfs中创建一个节点,我就可以在任何c程序中使用该节点。在这种情况下,我为什么要创建结构cdev 例如,一个简单的初始化函数 static int\uu init o

因此,我一直在学习linux中的设备驱动程序,并看到了如何创建驱动程序的各种示例。最常见的步骤是

  • 创建文件操作
  • 创建主要和次要数字
  • 创建稍后将与此fops关联的结构cdev
  • 使用mknod或sysfs创建节点,如class_create和device_create
  • 我有一个困惑,如果我不创建cdev,只注册我的驱动程序,然后只在sysfs中创建一个节点,我就可以在任何c程序中使用该节点。在这种情况下,我为什么要创建结构cdev

    例如,一个简单的初始化函数

    static int\uu init of cd\u init(void)/*构造函数*/
    {
    int ret;
    结构设备*dev_ret;
    printk(KERN_INFO“Namaskar:ofcd注册”);
    if((ret=alloc_chrdev_region(&first,0,1,“Shweta”))<0)
    {
    返回ret;
    }
    if(IS_ERR(cl=class_create(这个模块叫chardrv)))
    {
    注销chrdev_地区(第一,1);
    返回PTR_错误(cl);
    }
    if(IS_ERR(dev_ret=device_create(cl,NULL,first,NULL,“mynull”))
    {
    类别(cl);;
    注销chrdev_地区(第一,1);
    返回PTR_ERR(dev_ret);
    }
    cdev_init(&c_dev,&pugs_fops);//我很困惑。为什么要这样做?如果我不这样做会发生什么,因为我仍然可以使用我的驱动程序。
    如果((ret=cdev\u add(&c\u dev,first,1))<0)
    {
    设备销毁(cl,第一);
    类别(cl);;
    注销chrdev_地区(第一,1);
    返回ret;
    }
    返回0;
    }
    
    如果您既不自己创建
    cdev
    ,也不调用
    register\u chrdev()
    (或
    \u register\u chrdev()
    ),系统如何知道调用您的文件操作函数?我不仅仅创建cdev。我只是注册。我已经在使用udev facilty创建节点。因此,我可以调用我的驱动程序函数。如果您可以在没有cdev的情况下创建设备节点,但是如果没有设置fops,那么您在尝试打开设备文件时只会出现
    ENXIO
    错误。如果您既不自己创建
    cdev
    也不调用
    register\u chrdev(),系统如何知道调用您的文件操作函数
    (或
    \u register\u chrdev()
    )?我不仅仅是在创建cdev。我只是注册。我已经在使用udev facilty创建节点。因此,我可以调用我的驱动程序函数,确保您可以在不使用cdev的情况下创建设备节点,但如果没有设置fops,则在尝试打开设备文件时,您只会遇到
    ENXIO
    错误。
    static int __init ofcd_init(void) /* Constructor */
    {
        int ret;
        struct device *dev_ret;
    
        printk(KERN_INFO "Namaskar: ofcd registered");
        if ((ret = alloc_chrdev_region(&first, 0, 1, "Shweta")) < 0)
        {
            return ret;
        }
        if (IS_ERR(cl = class_create(THIS_MODULE, "chardrv")))
        {
            unregister_chrdev_region(first, 1);
            return PTR_ERR(cl);
        }
        if (IS_ERR(dev_ret = device_create(cl, NULL, first, NULL, "mynull")))
        {
            class_destroy(cl);
            unregister_chrdev_region(first, 1);
            return PTR_ERR(dev_ret);
        }
    
        cdev_init(&c_dev, &pugs_fops);//here I am confused. Why do it? what will happen if I don't do this, as I can use my driver still.
        if ((ret = cdev_add(&c_dev, first, 1)) < 0)
        {
            device_destroy(cl, first);
            class_destroy(cl);
            unregister_chrdev_region(first, 1);
            return ret;
        }
        return 0;
    }