如何理解USB检测的流程?

Sen*_*Sen 14 user-space usb automount

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

更清楚地说,我想知道当我将 USB 驱动器插入我的系统时,该弹出窗口是如何出现在我的桌面上的,以及该驱动器是如何安装的。

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

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

我没有做过大的代码浏览,但我向你保证,如果我能得到正确的指导,我这样做是没有问题的。

Kee*_*ook 16

  1. 插入设备,管理该设备硬件总线的软件接收中断(或硬件级别的其他通知),总线驱动程序枚举连接的设备,或执行其他特定于总线的硬件操作来识别设备。
  2. 内核通过使用硬件的总线/设备/等标识符调用/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。从这里开始,基于规则的行为非常专业。
  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。(谁可以mount、umount等)
  9. 对设备感兴趣的服务将侦听来自udisks 的 DBus事件,并在看到特定条件时采取行动。例如,GNOME 的 Nautilus(通过 gvfs volume-monitor)将请求自动挂载设备(通过udisks,它将检查其策略,如上所述)。
  10. 一旦文件系统被挂载,那些相同的监听服务就会采取更多的行动。例如,当在文件系统上找到公共照片存储目录时,Nautilus 会询问您是否要打开F-SpotDCIM