uevent 驅動 uevent分析

2021-10-17 02:00:01 字數 1877 閱讀 2993

1.kobject, ktype, kset

kobject代表sysfs中的目錄。

ktype代表kobject的型別,主要包含release函式和attr的讀寫函式。比如,所有的bus都有同乙個bus_type;所有的class都有同乙個class_type。

kset包含了subsystem概念,kset本身也是乙個kobject,所以裡面包含了乙個kobject物件。另外,kset中包含kset_uevent_ops,裡面主要定義了三個函式

int (*filter)(struct kset *kset, struct kobject *kobj);

const char *(*name)(struct kset *kset, struct kobject *kobj);

int (*uevent)(struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env);

這三個函式都與uevent相關。filter用於判斷uevent是否要發出去。name用於得到subsystem的名字。uevent用於填充env變數。

2.uevent核心部分

uevent是sysfs向使用者空間發出的訊息。比如,device_add函式中,會呼叫kobject_uevent(&dev->kobj, kobj_add); 這裡kobj是發訊息的kobj,kobj_add是發出的事件。uevent的事件在kobject_action中定義:

enum kobject_action =="?*", run+="/sbin/modprobe $env"

所以,當收到uevent的add事件後,shell能自動載入在modalias中定義的模組。

mdev的模組自動載入過程與之類似,它的配置檔案在/etc/mdev.conf中。例如:

$modalias=.* 0:0 660 @modprobe "$modalias"

這條規則指的是:當收到的環境變數中含有modalias,那麼載入modalias代表的模組。

mdev的詳細說明在busybox的docs/mdev.txt中。

4.uevent在裝置驅動模型中的應用

在sys目錄下有乙個子目錄devices,代表乙個kset。

建立裝置時,呼叫的device_initialize函式中,缺省會把kset設定成devices_kset,即devices子目錄代表的kset。

devices_kset中設定了uevent操作集device_uevent_ops。

static struct kset_uevent_ops device_uevent_ops = {

.filter =    dev_uevent_filter,

.name =   dev_uevent_name,

.uevent = dev_uevent,

dev_uevent_filter中,主要是規定了要想傳送uevent,dev必須有class或者bus。

dev_uevent_name中,返回dev的class或者bus的名字。

dev_uevent函式:

如果dev有裝置號,新增環境變數major與minor。

如果dev->type有值,設定devtype=type->name>。

如果dev->driver,設定driver=driver->name>。

如果有bus,呼叫bus的uevent函式。

如果有class,呼叫class的uevent函式。

如果有dev->type,呼叫dev->type->uevent函式。

一般在bus的uevent函式中,都會新增modalias環境變數,設定成dev的名字。這樣,uevent傳到使用者空間後,就可以通過對modalias的匹配自動載入模組。這樣的bus例子有platform和i2c等等。

uevent 使用示例

1.核心端 struct device dev null char s c 2 static ssize t send struct device dev,struct device attribute attr,const char buf,size t count static device a...

安卓系統之uevent 機制

uevnet 介紹 uevent是android核心空間與使用者空間進行通訊的一種方式,其本質是通過netlink 通過socket 傳送訊息給使用者程序,使用場景 熱插拔 一uevent 程序的啟動流程 1.system core init init.cpp main if strcmp base...

Linux裝置模型分析之(五) uevent

linux裝置模型分析之 一 裝置模型核心 linux裝置模型分析之 二 裝置模型的基石 linux裝置模型分析之 三 sysfs linux裝置模型分析之 四 class linux裝置模型分析之 五 uevent uevent是kobject的一部分,用於在kobject狀態發生改變時,例如增加...