1

我正在为接口(Linux 4.9.13)编写带有字符设备的 PCI 驱动程序。这是困扰我的场景:

  1. 运行touch /dev/foo0在目录中创建一个普通文件/dev
  2. 加载驱动模块。这是一个伪代码,代表那里发生的事情(非常标准的字符设备注册):

    // 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而不是?

4

0 回答 0