如何理解USB检测的流程?

我想了解从内核空间到用户空间的USB事件的流程(仅仅是出于好奇心,知道如何实现)。

为了更清楚,我想知道当我将USB驱动器插入我的系统时,弹出窗口是如何进入我的桌面的,以及驱动器是如何安装的。

我还想知道它是如何发现我的USB中是否有一些图像,如果“是”,它是如何询问我是否需要在GIMP或其他软件中打开它?

我知道这是一个非常大的问题,但请指导我如何理解它背后的整个想法。

我还没有做过大量的代码浏览,但我向你保证,如果能够正确引导我就没有问题。

  1. 设备已插入,管理该设备的硬件总线的软件接收中断(或硬件级别的其他通知),总线驱动程序枚举连接的设备,或执行其他特定于总线的硬件操作以识别设备。
  2. 内核通过使用硬件的总线/设备/ etc标识符调用/ sbin / modprobe来请求为新硬件加载驱动程序。
  3. 在用户空间中, modprobe尝试查找匹配的驱动程序指定的别名。 (有关完整列表,请参见/lib/modules/$(uname -r)/modules.alias 。)根据硬件接口,这些看起来会有所不同。 例如, pci:v0000102Bd00002527sv*sd*bc*sc*i*用于PCI设备供应商102B,设备2527,以及任何用于子供应商等,或USB: usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*
  4. 一旦加载了设备驱动程序(或者已经初始化了驱动程序的新设备),内核中的驱动程序就会将加载设备的通知发送到用户空间中的udev
  5. udev将通知与/lib/udev/rules.d//etc/udev/rules.d中的规则列表进行/etc/udev/rules.d 。 从这里开始,基于规则,行为非常专业。
  6. 对于USB磁盘, 80-udisks.rules文件可能是最好的工作场所。 这些规则将使用blkid和其他帮助程序来探测磁盘的类型和内容,填充所有类型的配置值,包括ENV{UDISKS_PRESENTATION_HIDE}="1"以便出于某种原因忽略磁盘。 有关详细信息,请参阅“man 7 udisks”。
  7. udisks-daemon监视设备是否出现在udev数据库中,并将它们作为可发现的设备列表显示在DBus上。 (参见“udisks –enumerate”。)
  8. udisks中配置了各种操作,并且可以在策略文件/usr/share/polkit-1/actions/org.freedesktop.udisks.policy查看允许这些操作的策略。 (谁可以装载,卸载等)
  9. 对设备感兴趣的服务将监听来自udisks的DBus事件,并在看到某些条件时采取措施。 例如,GNOME的Nautilus(通过gvfs volume-monitor)将请求设备的自动挂载(通过udisks ,它将检查其策略,如上所述)。
  10. 一旦安装了文件系统,那些相同的侦听服务将采取更多操作。 例如,当在文件系统上找到公共照片存储目录DCIM时,Nautilus将询问您是否要打开F-Spot