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

时间:2016-03-17 16:37:21

标签: linux-kernel driver linux-device-driver pci pci-bus

实际上在处理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时OS会如何知道哪个卡是目标,因为fops捆绑到所有设备。

需要你的帮助,大家好。

PS:fops =文件操作

1 个答案:

答案 0 :(得分:3)

.open操作的签名是

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

可以通过

获得少量设备打开
iminor(inode)

其他文件操作也可以使用file->f_inode作为inode获取设备编号。

或者,.open可能会在file->f_private中存储一些特定于设备的数据,而其他操作可能会以这种方式访问​​它们。