我正在编写一个带有接口字符设备的PCI驱动程序(Linux 4.9.13)。这是困扰我的场景:
touch /dev/foo0
,在/dev
目录中创建一个普通文件。加载驱动程序模块。这是一个伪代码,代表那里发生的事情(相当标准的字符设备注册):
// When the module is initialized:
alloc_chrdev_region(&dev, 0, 256, "foo");
class = class_create(THIS_MODULE, "foo");
// Later, when a suitable PCI device is connected the probe function
// calls the following functions:
cdev_init(dev->md_cdev, &fops);
dev->md_devnum = MKDEV(major, 0 + index);
res = cdev_add(dev->md_cdev, dev->md_devnum, 1);
dev->md_sysfsdev = device_create(class, 0, dev->md_devnum, 0, "foo%d", index);
详细说明:
index
只是另一个免费索引对我来说似乎很奇怪的是,没有任何错误表明已经有/dev/foo0
文件不是字符设备。我确实检查了所有的错误(我想是这样),但为了简洁起见,我省略了相关的代码。如果我不运行touch /dev/foo0
,一切都按预期工作。否则,我既不能读取也不能写入设备。
为什么会这样?我不应该device_create
返回错误或者至少创建/dev/foo1
吗?