【发布时间】:2023-03-28 05:30:03
【问题描述】:
你已经做了一千次了:你拔掉了一些 USB 设备,与该 USB 设备关联的任何设备都被驱动程序删除了。任何使用以前打开的文件句柄的程序都会出错。不知何故,大多数 Linux 驱动程序都会处理这个问题。
我目前正在努力在一个简单的驱动程序中实现相同的功能。我的驱动程序创建了一个字符设备。打开设备时,我将struct file的private_data成员设置为每个字符设备存在一次的一些管理数据的地址。该管理数据还包括一个互斥体,我用它来同步read、write 和ioctl 等操作。
现在拔下 USB 设备时会出现问题。我不能释放管理数据所在的内存。首先,任何当前运行的read、write 或ioctl 都应该完成。任何此类正在运行的调用也可能会持有互斥锁并尝试解锁它。所以会访问互斥体所在的内存。
拔出设备后的任何read、write 或ioctl 调用都应该失败,因此每次这样的调用都必须读取一些变量来告知USB 设备是否仍然插入。同样,该变量必须存在于某个地方,并且只要存在打开的文件句柄,它所在的内存就必须保持分配状态。
长话短说,在我看来,我必须进行某种引用计数:管理数据必须保持分配状态,直到所有文件句柄都已关闭。我可以自己实现,但我觉得我会重新发明轮子。这种东西肯定已经存在了,我不是第一个遇到这个问题的。
Linux 是否在内部跟踪打开文件句柄的数量?我可以定义一个在所有文件句柄都关闭时调用的回调吗?这甚至是可行的吗?从系统中删除字符设备的正确方法是什么?
不应避免使用全局变量,因为可以连接任意数量的 USB 设备。
【问题讨论】:
-
你需要做一些引用计数。一是防止驱动程序在使用时消失。另一个是防止设备在打开时消失。也许你需要更多,但没有代码就很难说。
-
对于 USB,如果设备在文件操作处理程序中断开连接,您可能只需检查(锁定互斥锁),并在断开连接处理程序中杀死运行中的 URB,如通过“drivers/usb/usb-skeleton.c”中的原型“usb-skeleton”驱动程序代码。
标签: linux-kernel usb linux-device-driver