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狀態發生改變時,例如增加...