jinxinxin163 发表于 2014-11-24 20:25

用户空间的udevd如何知道ADD的是device还是driver呢

今天研究udev,发现内核其实是通过kobject_uevent来向用户空间的udevd发送netlink信息
于是查看了下内核源码,看看内核在什么时候会发送udev netlink信息,其实也就是想知道哪些内核函数会调用kobject_uevent了
发现主要有以下几处:

1.driver_register -> kobject_uevent
2.device_register -> device_add -> kobject_uevent
3.kset_register -> kobject_uevent

之前本以为内核只是在注册device的时候会发送udev netlink信息,但其实在register driver的时候也会发送udev netlink信息,那么问题来了:

1. 在注册设备的时候,得到设备信息之后,把设备信息通过netlink发给用户空间的udevd,用户空间的udevd通过这些设备信息,加载相应的驱动,这就是驱动的自动加载机制,这个可以理解;
那注册driver的时候,发送udev netlink信息是为了什么呢?
2. 在查看用户空间udevd 的rules规则的时候,也没有看到有对device 或者 driver 做区分,那么,假如是ADD操作,udevd如何区分ADD的是device还是driver呢?

请精通udev的大神门给点提示哇~~感谢

Tinnal 发表于 2014-11-25 00:00

回复 1# jinxinxin163


    1. 在注册设备的时候,得到设备信息之后,把设备信息通过netlink发给用户空间的udevd,用户空间的udevd通过这些设备信息,加载相应的驱动,这就是驱动的自动加载机制,这个可以理解;
那注册driver的时候,发送udev netlink信息是为了什么呢?
驱动加载了,可设备文件还没有创建呀!driver装载后,设备号才确定,这时后再通知udev根据相应的规则去创建设备文件。


2. 在查看用户空间udevd 的rules规则的时候,也没有看到有对device 或者 driver 做区分,那么,假如是ADD操作,udevd如何区分ADD的是device还是driver呢?
你man一下udevd,看看http://linux.die.net/man/8/udevd。

加上以下的选项:
--debug-trace
Run all events completely serialized. This may be useful if udev triggers actions or loads kernel modules which cause problems and a slow but continuous operation is needed, where no events are processed in parallel.
--debug
Print debug messages to stderr.

自已对比一下不就什么都清楚了吗。我没有去看,至少通过SUBSYSTEM还是能区分的。

你对udev的机制太不了解,可以自己先baidu学习一下。
如:http://www.cnblogs.com/sopost/archive/2013/01/09/2853200.html
页: [1]
查看完整版本: 用户空间的udevd如何知道ADD的是device还是driver呢