代码之家  ›  专栏  ›  技术社区  ›  Cong Li

cdev及其相关文件操作如何工作?

  •  2
  • Cong Li  · 技术社区  · 9 年前

    实际上正在使用PCI驱动程序。 我有两个具有相同设备ID和供应商ID的PCIe卡。 所以为了区别,我给这两张卡片分配了两个不同的MINOR编号。

    //request for device numbers
    error = alloc_chrdev_region(&devt, 0, cards_found, DEVICE_NAME);
    if (error == 0)
    {   
        major = MAJOR(devt);
        printk(KERN_INFO "(drv_init): MAJOR number is %d\n", major);
        printk(KERN_INFO "(drv_init): MINOR number range from 0 to %d\n", cards_found-1);
    
        cdevs = cdev_alloc();
        cdevs->owner = THIS_MODULE;
        cdev_init(cdevs, fops);
    
        for(i=0;i<cards_found,i++)
        {   
            devt = MKDEV(major, i); 
            error = cdev_add(cdevs, devt, 1); 
            if (error == 0)
            {   
                printk(KERN_INFO "(drv_init): cdev_add success for minor number: %d", i); 
            }   
            else
            {   
                printk(KERN_ALERT "(drv_init): cdev_add failed for minor number: %d,error code: %d, exit driver\n", i, error);
                devt = MKDEV(major, 0); 
                unregister_chrdev_region(devt, cards_found);
                pci_unregister_driver(&my_pci_driver);
                return(error);
            }   
        }   
    }   `
    

    我这么做是因为我在网上找到的所有文档都建议一台设备只有一个MINOR号码。

    但我无法理解,当我打开fops_open时,操作系统如何知道目标是哪张卡,因为fops绑定到所有设备。

    需要你的帮助,谢谢大家。

    PS:fops=文件操作

    1 回复  |  直到 9 年前
        1
  •  4
  •   Tsyvarev    9 年前

    签字人: .open 操作是

    int open(struct inode* inode, struct file* file)
    

    可以通过以下方式获取打开的设备的次要数量

    iminor(inode)
    

    其他文件操作也可以使用 file->f_inode 作为inode。

    或者, 打开 可以将某些特定于设备的数据存储在 file->f_private ,其他操作可以通过这种方式访问它们。