繁体   English   中英

编写自定义PCIe热插拔Linux 2.6.x驱动程序

[英]Write a custom PCIe hotplug Linux 2.6.x driver

我正在为自定义设备编写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完成,然后从驱动程序中正确删除设备?

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

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

因为硬件被删除并不意味着您的驱动程序已被删除。 因此,您需要知道您的硬件是否存在。

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

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

任何理智的应用程序都将退出或关闭相应的文件描述符。 因此,刷新应以打开/释放方法进行。 无论您分配了什么资源,在删除设备后它们仍然可以存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM