1

我正在为自定义设备编写 PCIe 驱动程序/模块。由于该设备是可热插拔的,它可以随时消失。

这里我如何设置pci_driver结构:

struct pci_driver my_pci_driver = {
  .name = "my_pci_driver",
  .id_table = ids,
  .probe = "my_pci_driver_probe",
  .remove = "my_pci_driver_remove"
};

但我不知道如何正确处理删除事件。当调用.remove函数时,我有几个进程使用驱动程序打开了句柄并执行了几个 ioctl。

那么处理设备移除的正确方法是什么?如何安全地等待当前运行的 ioctl 完成,然后从我的驱动程序中正确删除设备?

4

2 回答 2

0

这是一个非常广泛的问题。您需要以支持设备移除的方式设计代码。您可以从任何 USB 驱动程序 /usr/src/linux/drivers/usb/... 中举一个例子,它本质上是可移动的。

评论回复:
不,不是,USB 子系统不负责驱动程序中的同步。有很多方法可以同步引用计数,您可以使用互锁操作或使用自旋锁或......
有一个很好的文档描述了 Windows 上的同步原语,术语有点不同但概念是相同的,所以我推荐。

于 2009-06-25T15:24:56.700 回答
0

因为硬件被删除并不意味着你的驱动程序被删除。所以你需要知道你的硬件是否存在。

然后你应该结束所有正在运行的事务。这意味着您在文件操作中执行的任何操作都应该在某个时候结束并返回错误代码,您可以返回到用户代码。对于 USB 设备,有一个功能可以为您执行此操作。

移除设备后,用户空间代码可以进行读/写/ioctl。这些系统调用知道硬件不再存在,因此它们应该返回错误代码。

任何理智的应用程序都会退出或关闭相应的文件描述符。所以引用计数应该在 open/release 方法中进行。无论您分配了什么资源,在您的设备被移除后它们仍然可以存在。

于 2009-11-09T09:04:57.947 回答