На самом деле работает над драйвером PCI. У меня две карты PCIe с одинаковым идентификатором устройства и идентификатором поставщика. Чтобы изменить ситуацию, я назначаю эти две карты двумя разными номерами MINOR.Как работает cdev и связанная с ним операция с файлом?
//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 для одного устройства.
Но я не могу понять, как OS могла узнать, какая карта нацелена, когда я делаю fops_open, поскольку fops привязан ко всем устройствам.
Нужна ваша помощь, всем.
PS: пижоны = файловые операции
если устройство имеет несколько второстепенных номеров, какой из них используется при открытии? – ransh
@ransh: Любой * специальный файл * привязан к ** одиночной ** паре ''. Таким образом, при открытии файла используется младший номер, к которому привязан файл. –
Tsyvarev