1. 程式人生 > >android uevent的工作原理

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)

簡單畫了個流程圖:

這裡寫圖片描述

這部分網上總結的人也很多,可參看下面幾個連線:

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)