linux-kernel - cdev 及其关联的文件操作如何工作?

标签 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);
        }   
    }   
}   `

我这样做是因为我在互联网上找到的所有文档都建议一台设备使用一个次号。

但是我不明白当我执行 fops_open 时操作系统如何知道哪张卡是目标,因为 fops 绑定(bind)到所有设备。

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

PS:fops = 文件操作

最佳答案

.open操作的签名是

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

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

iminor(inode)

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

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

关于linux-kernel - cdev 及其关联的文件操作如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066635/

相关文章:

linux-kernel - Cygwin:Linux 内核 make clean 不工作

c - 奇怪的 printk 对 linux 堆栈大小测试的影响

linux - libusb接口(interface)已经声明

windows - 我可以将 WinUSB 与内置 HID 驱动程序一起使用吗?

linux - i2c 驱动程序是否需要像任何其他字符设备驱动程序一样实现?

c - 使用 gdb 调试 Linux 内核模块

c - 如何捕获tcp/ip数据包

linux - 如何在ARM Linux上查看网卡的寄存器值?

linux-kernel - 执行读取硬件寄存器的函数时内核 oops

c - switch_dev_register的使用场景是什么