linux 设备管理 (四) udev

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 规则文件很有用

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/112741721