如何理解USB检测的流程?
我想了解从内核空间到用户空间的USB事件的流程(仅仅是出于好奇心,知道如何实现)。
为了更清楚,我想知道当我将USB驱动器插入我的系统时,弹出窗口是如何进入我的桌面的,以及驱动器是如何安装的。
我还想知道它是如何发现我的USB中是否有一些图像,如果“是”,它是如何询问我是否需要在GIMP或其他软件中打开它?
我知道这是一个非常大的问题,但请指导我如何理解它背后的整个想法。
我还没有做过大量的代码浏览,但我向你保证,如果能够正确引导我就没有问题。
- 设备已插入,管理该设备的硬件总线的软件接收中断(或硬件级别的其他通知),总线驱动程序枚举连接的设备,或执行其他特定于总线的硬件操作以识别设备。
- 内核通过使用硬件的总线/设备/ etc标识符调用/ sbin / modprobe来请求为新硬件加载驱动程序。
- 在用户空间中, 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*
。 - 一旦加载了设备驱动程序(或者已经初始化了驱动程序的新设备),内核中的驱动程序就会将加载设备的通知发送到用户空间中的
udev
。 -
udev
将通知与/lib/udev/rules.d/
和/etc/udev/rules.d
中的规则列表进行/etc/udev/rules.d
。 从这里开始,基于规则,行为非常专业。 - 对于USB磁盘,
80-udisks.rules
文件可能是最好的工作场所。 这些规则将使用blkid和其他帮助程序来探测磁盘的类型和内容,填充所有类型的配置值,包括ENV{UDISKS_PRESENTATION_HIDE}="1"
以便出于某种原因忽略磁盘。 有关详细信息,请参阅“man 7 udisks”。 - udisks-daemon监视设备是否出现在udev数据库中,并将它们作为可发现的设备列表显示在DBus上。 (参见“udisks –enumerate”。)
- 在udisks中配置了各种操作,并且可以在策略文件
/usr/share/polkit-1/actions/org.freedesktop.udisks.policy
查看允许这些操作的策略。 (谁可以装载,卸载等) - 对设备感兴趣的服务将监听来自udisks的DBus事件,并在看到某些条件时采取措施。 例如,GNOME的Nautilus(通过gvfs volume-monitor)将请求设备的自动挂载(通过udisks ,它将检查其策略,如上所述)。
- 一旦安装了文件系统,那些相同的侦听服务将采取更多操作。 例如,当在文件系统上找到公共照片存储目录
DCIM
时,Nautilus将询问您是否要打开F-Spot 。