Linux 环境中的设备管理器是什么?也就是说,设备管理器实际上是做什么的?
https://en.wikipedia.org/wiki/Udev说
乌德夫(userspace /dev) 是 Linux 内核的设备管理器。
这意味着什么?
维基百科继续:
udev 是 devfsd 和 hotplug 的后继者,主要管理
/dev
目录中的设备节点,同时处理硬件设备在系统中添加或移除时引发的所有用户空间事件,包括某些设备需要的固件加载。
这句话对我来说没有任何意义。首先,“管理目录中的设备节点 /dev
”是什么意思?
它是一个自动启用或禁用设备驱动程序的软件。 “自动”部分通常是通过检测新设备已连接到机器来完成的。除了激活设备驱动程序之外,它还会自动配置设备(例如,它在检测到 USB 驱动器时自动挂载该驱动器,而无需打开磁盘管理器或运行命令来挂载驱动器)。
“自动启用或禁用设备驱动程序”的目的是什么?那么内核可以与设备或程序对话吗?那么设备可以在用户空间或内核空间运行吗?
答案1
Udev 处理所有新检测到的设备的设置(包括系统启动后的“热插拔”设备以及系统启动时永久连接的“冷插拔”设备):
每当内核通知它新检测到的设备时,它将按需加载内核模块(驱动程序)。
它将更新
/dev
这些设备的设备节点:设置它们的所有权、组、权限;它还创建符号链接,例如/dev/disk/by-uuid
.过去,udev 也用来创造/dev 中的所有设备节点(使用“mknod”),以及在设备断开连接时删除它们。这在当前的 Linux 中不再是必要的——相反,内核有“devtmpfs”,设备会自动出现——但 udev 仍然负责更改权限和创建符号链接。
它将处理自定义规则,例如可以运行帮助程序来初始化设备(例如重新映射键盘扫描代码,或将固件上传到打印机,或只是戳/sys旋钮),或者可以为用户空间程序增强设备的元数据(例如 libinput 的触摸板尺寸;另请参阅 systemd-hwdb)。
一般流程是:
内核检测到设备(例如,USB 总线上的低级“USB 设备 VID:PID”)并通过 Netlink 发出 uevent。
Udev 处理在
/{etc,lib,usr/lib}/udev/rules.d/
.模块加载是那里发现的一个特殊规则,实际上 udev 所做的所有其他事情也是如此。Udev 通过 Netlink 发出增强的 uevent,供用户空间做出反应。
大多数程序故意忽略初始内核事件,但等待来自 udev 的增强事件;这样他们只会在设备的规则完成他们需要做的事情后才开始使用该设备。
Udev 并不是严格强制的——您可以拥有一个内核,其中包含所有必需的驱动程序,这些驱动程序可以编译或使用手动加载modprobe
,并且大多数事情都可以工作。 (只要加载了驱动程序,它就会自动连接到已识别的设备 - 这不是由 udev 处理的。)
依赖 udev 来宣布新检测到的设备或提供附加元数据的软件是行不通的,例如,当您插入新的显示器或鼠标时,X11 不会注意到。