Uevent是Linux/Android驱动模型的一部分,当设备添加或者删除时通知用户空间的一种统一方式。
Uevent在内核空间如何发送到用户空间
uevent模块使用起来比较简单,就是设备状态改变的时候,调用kobject_uevent系列的api即可,具体实现在可查看源码。
// kernel_src/lib/kobject_uevent.c
int kobject_uevent(struct kobject *kobj, enum kobject_action action)
简单画了个流程图:
这部分网上总结的人也很多,可参看下面几个连接:
Uevent在用户空间的处理
Android没有使用标准linux的udev机制,而是启动了一个ueventd的service, 它首先解析/uevent.rc中的配置,该配置文件包含两种配置,一种是要建立的设备节点及相关权限信息,另外一种是要修改的权限的属性文件信息。然后把这两种配置信息分别解析出来,放在两个单独的链表中。
# CDMA radio interface MUX
# 要创建的设备节点名 权限 用户名 组名
/dev/ts0710mux* 0640 radio radio
/dev/ppp 0660 radio vpn
/dev/tun 0640 vpn vpn
# sysfs properties
# 要修改权限的属性文件路径 属性文件名 权限 用户名 组名
/sys/devices/virtual/input/input* enable 0660 root input
/sys/devices/virtual/input/input* poll_delay 0660 root input
ueventd在用户空间创建了一个netlink socket, 当收到kernel发出的uevent后,根据uevent的环境变量信息做相应的处理:
如果是增加/移除设备的话,则在对应的链表中找到匹配项,创建设备节点,修改uid/gid/permission
如果是设备请求firmware升级的话,需要把firmware文件写到属性文件
具体实现可阅读代码
// system/core/init/ueventd.c
int ueventd_main(int argc, char **argv)
也可参考链接:
1. Android ueventd浅析