cdev及其相关文件操作如何工作? [英] How do cdev and its associated file operation work?
问题描述
实际上在PCI驱动程序上工作. 我有两张具有相同设备ID和供应商ID的PCIe卡. 因此,要有所作为,我为这两张卡分配了两个不同的MINOR号.
Actually working on a PCI driver. I have two PCIe cards with same device ID and vendor ID. So to make a difference, I assign these two cards with two different MINOR numbers.
//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号.
I'm doing this because all docs I found on internet suggests that one MINOR number for one device.
但是我不知道在做fops_open时,操作系统如何知道目标卡是什么,因为fops捆绑到了所有设备上.
But I can't understand how could OS know which card is targeted when I do a fops_open, since the fops is bundled to all devices.
需要您的帮助,谢谢大家.
Need your help, Thx everyone.
PS:fops =文件操作
PS: fops = file operations
推荐答案
.open
操作的签名是
int open(struct inode* inode, struct file* file)
可以通过以下方式获取打开的设备的次要数量
Minor number of device opened can be obtained via
iminor(inode)
其他文件操作也可以使用file->f_inode
作为inode来获取设备编号.
Other file operations also may obtain device number using file->f_inode
as inode.
或者,.open
可能会将某些特定于设备的数据存储在file->f_private
中,而其他操作可能会以此方式访问它们.
Alternatively, .open
may store some device-specific data in file->f_private
, and other operations may access them that way.
这篇关于cdev及其相关文件操作如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!