android uevent的工作原理

Uevent是Linux/Android驱动模型的一部分,当设备添加或者删除时通知用户空间的一种统一方式。

Uevent在内核空间如何发送到用户空间

uevent模块使用起来比较简单,就是设备状态改变的时候,调用kobject_uevent系列的api即可,具体实现在可查看源码。

//  kernel_src/lib/kobject_uevent.c
int kobject_uevent(struct kobject *kobj, enum kobject_action action)

简单画了个流程图:

这里写图片描述

这部分网上总结的人也很多,可参看下面几个连接:

  1. Uevent发送(热插拔)事件到用户空间
  2. Linux设备模型(3)_Uevent
  3. 统一设备模型:kobj、kset分析

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的环境变量信息做相应的处理:

  1. 如果是增加/移除设备的话,则在对应的链表中找到匹配项,创建设备节点,修改uid/gid/permission

  2. 如果是设备请求firmware升级的话,需要把firmware文件写到属性文件

具体实现可阅读代码

// system/core/init/ueventd.c
int ueventd_main(int argc, char **argv)

也可参考链接:
1. Android ueventd浅析

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值