我正在为自定义设备编写一个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事件。当调用.remove函数时,有几个进程使用驱动程序打开句柄并执行多个ioctl。
那么,什么是正确的方式来处理删除一个设备?如何安全地等待当前运行的ioctl完成,然后正确地从我的驱动程序中删除设备?
发布于 2009-06-25 15:24:56
这是一个非常广泛的问题。您需要以支持设备删除的方式来设计代码。您可以从任何usb驱动程序/usr/src/linux/驱动器/usb/.它是可以自然移动的。
评论答复:
不,不是,USB子系统不负责驱动程序中的同步。有很多方法来同步参考计数,您可以使用互锁操作或使用自旋锁或.
在Windows上有一个很好的描述同步原语的文档,术语有点不同,但概念是相同的,所以我推荐。
发布于 2009-11-09 09:04:57
因为硬件被移除并不意味着您的驱动程序被移除。所以你需要知道你的硬件是否在那里。
然后,您应该结束所有正在运行的事务。这意味着无论您在文件操作中做什么操作,它应该在某个点结束并返回一个错误代码,您可以返回到用户代码。对于USB设备,有一个功能为您这样做。
用户空间代码能够在设备被删除后进行读写/ioctl操作。这些系统调用知道硬件已经不在了,所以它们应该返回一个错误代码。
任何正常的应用程序都会退出或关闭相应的文件描述符。因此,应在开放/释放的方法中进行重新计算。无论您已经分配了什么资源,在您的设备被移除之后,它们仍然可以存在。
https://stackoverflow.com/questions/1042911
复制相似问题