android uevent的工作原理
阿新 • • 發佈:2019-02-07
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)