我想了解 USB 事件从内核空间到用户空间的流程(只是出于好奇,想知道事情是如何实现的)。
为了更清楚起见,我想知道当我将 USB 驱动器插入系统时该弹出窗口是如何出现在我的桌面上的以及该驱动器是如何安装的。
我还想知道它如何找出我的 USB 中是否存在某些图像,如果是,它如何询问我是否需要在 GIMP 或其他软件中打开它?
我知道这是一个非常大且广泛的问题,但请指导我如何理解其背后的整个想法。
我没有进行过大规模的代码浏览,但我向你保证,如果我能得到正确的指导,我这样做没有任何问题。
答案1
- 设备插入后,管理该设备硬件总线的软件会收到中断(或硬件级别的其他通知),总线驱动程序会枚举所连接的设备,或执行其他特定于总线的硬件操作来识别设备。
- 内核通过调用以下函数来请求加载新硬件的驱动程序/sbin/modprobe带有硬件的总线/设备/等标识符。
- 在用户空间中,修改探针尝试查找匹配的驱动程序指定别名。(请参阅
/lib/modules/$(uname -r)/modules.alias
了解完整列表。)这些别名将根据硬件接口而有所不同。例如,pci:v0000102Bd00002527sv*sd*bc*sc*i*
对于 PCI 设备供应商 102B、设备 2527 以及子供应商等的任何内容,或 USBusb:v2040p4982d*dc*dsc*dp*ic*isc*ip*
:。 - 一旦设备驱动程序被加载(或者已经有驱动程序的新设备被初始化),内核中的驱动程序就会向
udev
用户空间发送已加载设备的通知。 udev
将通知与/lib/udev/rules.d/
和中的规则列表进行匹配/etc/udev/rules.d
。从这里开始,行为将根据规则变得极其专业化。- 对于 USB 磁盘,
80-udisks.rules
文件可能是最佳工作位置。这些规则将使用以下内容块和其他帮助程序来探测磁盘的类型和内容,填充各种配置值,包括ENV{UDISKS_PRESENTATION_HIDE}="1"
出于某种原因忽略磁盘等。有关详细信息,请参阅“man 7 udisks”。 - 这udisks 守护进程监视设备是否出现在udev数据库,并将它们呈现为 DBus 上可发现的设备列表。(参见“udisks --enumerate”。)
- 各种操作配置在u盘,允许这些操作的策略可以在策略文件中看到
/usr/share/polkit-1/actions/org.freedesktop.udisks.policy
。(谁可以挂载、卸载等) - 对设备感兴趣的服务将监听来自u盘,并在看到某些情况时采取行动。例如,GNOME 的 Nautilus(通过 gvfs volume-monitor)将请求自动挂载设备(通过u盘,它将检查其政策(如上所述)。
- 一旦文件系统被挂载,这些相同的监听服务将采取更多行动。例如,Nautilus 会询问你是否要打开F 点
DCIM
当在文件系统上找到通用的照片存储目录时。