我正在为接口(Linux 4.9.13)编写带有字符设备的 PCI 驱动程序。这是困扰我的场景:
- 运行
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
而不是?