udev的依赖
sysfs为udev提供设备入口和uevent通道
tmpfs为udev设备文件提供存放空间。
udev是不是还需要 devtmpfs的支持
udev管理的设备文件创建流程
- 综述
设备文件创建流程分为两种
coldplug : 用于udev刚启动时
hotplug : 用于udev启动后
- coldplug
// 系统运行时没有实际的硬件插拔动作,所以这一过程被称为coldplug
1. udev 遍历 /sys 下的 uevent文件, 写入 "ADD"
2. 如果运行时的uevent的底层实现(可配置为netlink或者kmod)为 netlink,内核就会向 udev发送一条 netlink 消息,协议类型为NETLINK_KOBJECT_UEVENT
3. udev 收到后,会根据以下内容创建设备文件
3.1 信息("ADD"和/sys目录下的具体目录)
3.2 /sys目录下的具体目录下的文件
3.3 规则文件
- hotplug
// 系统运行时有实际的硬件插拔动作,所以这一过程被称为hotplug
// 以 usb 热插拔为例
1. usb驱动 创建device结构体,并调用 内核api 向 device 中的 uevent 写入 add
2. 如果运行时的uevent的底层实现(可配置为netlink或者kmod)为 netlink,内核就会向 udev发送一条 netlink 消息,协议类型为NETLINK_KOBJECT_UEVENT
3. udev 收到后,会根据以下内容创建设备文件
3.1 信息("ADD"和/sys目录下的具体目录)
3.2 /sys目录下的具体目录下的文件
3.3 规则文件
coldplug
1. 在系统启动时(一般为do_init_levels)通过device_register注册了很多device,但是内核(没有devfs和devtmpfs的配置时)并不会自己去创建设备节点,内核与用户空间约定留给用户空间做(创建设备节点).
2. 在 下面打印之后
VFS: Mounted root (ext4 filesystem) on device 254:0.
Freeing unused kernel memory: 444K (8074d000 - 807bc000)
才会用init系统去启动udevd
Populating /dev using udev: udevd[718]: starting version 3.2.9
random: udevd urandom read with 12 bits of entropy available
udevd[719]: starting eudev-3.2.9
done
此时 udevd启动的第一件事就是处理 udevd启动之前内核的请求(创建设备节点)
内核的请求暴露在了用户空间 /sys 目录下的 uevent文件
此时udevd
1.扫描/sys目录里所有的uevent属性文件,向其写入"add”命令,从而触发uevent事件(内核给用户空间通报uevent事件)
2. uevent 监听到uevent事件
3. 根据 各种信息 创建 设备节点
因为这个过程中没有设备进行硬件插(热插).而是 echo "add" > uevent , 相当于做了一次软件插 , 因而将 模拟热插拔 叫做 coldplug
hotplug
1.插入一个U盘
2.产生中断,在中断中 USB hub会检测到U盘设备接入
3.完成设备枚举过程(从设备上读出相应的设备信息),并在内核中创建相应的设备结构体A。
4.将新的设备结构A体注册到内核的时候,会将设备的信息通过netlink发送消息到用户态。
5.用户态udev进程监听到这个信息,根据解析到的结果和用户程序的配置做一些处理(加载驱动程序)
A3.驱动加载时,向内核注册 设备B
A4.将新的设备结构B体注册到内核的时候,会将设备的信息通过netlink发送消息到用户态。
A5.用户态udev进程监听到这个信息,根据解析到的结果和用户程序的配置做一些处理(创建设备文件)
1.拔出一个U盘
2.产生中断,在中断中 USB hub会检测到U盘设备拔出
3.内核会将设备的信息通过netlink发送消息到用户态。
4.用户态udev进程监听到这个信息,根据解析到的结果和用户程序的配置做一些处理(卸载驱动)
A3.驱动卸载时,会将设备的信息(删除)通过netlink发送消息到用户态。
A4.用户态udev进程监听到这个信息,根据解析到的结果和用户程序的配置做一些处理(删除设备文件)
udev 文件系统
实验A前状态:
/dev 没有文件系统挂载
实验A:
mount -t devtmpfs udev /dev
udev on /dev type devtmpfs (rw,relatime,size=255592k,nr_inodes=63898,mode=755)
/dev下有文件,文件数量正常,表示udev已经正常运作
实验B前状态:
/dev 没有文件系统挂载
实验B:
mount -t tmpfs udev /dev
udev on /dev type tmpfs (rw,relatime)
/dev下无文件
udev 规则
重新一遍相关的 udev 规则文件;这个功能对开发人员调试 udev 规则文件很有用
版权声明:本文为u011011827原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。