2

実際にPCIドライバーに取り組んでいます。同じデバイス ID とベンダー ID を持つ 2 つの PCIe カードがあります。違いを生むために、これら 2 枚のカードに 2 つの異なる 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);
        }   
    }   
}   `

私がこれを行っているのは、インターネットで見つけたすべてのドキュメントが、1 つのデバイスに対して 1 つの MINOR 番号を示唆しているためです。

しかし、fops はすべてのデバイスにバンドルされているため、fops_open を実行したときに OS がどのカードがターゲットになっているかを知る方法がわかりません。

あなたの助けが必要です、皆さん、Thx。

PS: fops = ファイル操作

4

1 に答える 1

4

.open操作の署名は

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

開いているデバイスのマイナー番号は、次の方法で取得できます

iminor(inode)

他のファイル操作でもfile->f_inode、inode として使用してデバイス番号を取得できます。

または、.openデバイス固有のデータを に保存しfile->f_private、他の操作でそれらにアクセスすることもできます。

于 2016-03-17T17:18:34.640 に答える