1. sysfs文件系統---首先爲應用程序提供了文件接口,其次將設備和驅動鏈接起來;
sysfs文件系統在 sysfs_init( )初始化
---主要的函數sysfs_init_inode( )
2 kobject 和 kset
----概述:如果將linux設備驅動模型比喻成一座大廈,那麼kobject和kset就是構成這座大廈內部的鋼筋和構架結構;
----由kobject和kset構成的設備驅動模型中的bus, driver, device爲程序員提供了一個窗口;
2.1 關於kobject(內核對象)
/*linux內核用kobject 來表示內核的一個對象
name 表示一個內核對象的名字;
如果加入系統中,那麼它的name將會出現在sysfs系統中,表現得是一個新的目錄
*/
----struct kobject {
const char *name;
struct list_head entry; //用鏈表將內核對象鏈接起來
struct kobject *parent; //指向內核對象的上層節點,構建內核對象之間的層次關係
struct kset *kset; //當前內核對象所屬的kset對象指針, 其容納了一系列同類型的kobject
struct kobj_type *ktype; //定義了內核對象一組sysfs文件系統相關的操作函數和屬性。
struct sysfs_dirent *sd; //表示內核對象在sysfs文件系統中對應的目錄項的實例
struct kref kref; //原子類型, 表示內核對象的引用計數,可以追蹤內核對象的生命週期
unsigned int state_initialized:1; //表示內核對象初始化的狀態, 1表示對象被初始化,0表示尚未初始化
unsigned int state_in_sysfs:1; //表示內核對象是否在sysfs文件中建立一個入口
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1; //kobject變化-->kset變化-->kset對象向用戶空間發送event消息;
//1表示不讓發送
----};
/*註釋:內核通過ktype成員將kobject對象的sysfs文件操作與其屬性文件關聯起來;*/
----kobject常用函數 /*設備驅動程序都不會和其打交道, 通過上層函數調用就屏蔽掉了--cdev_add()*/
kobject常用的用法是嵌入在表示某一對象的數據結構中,比如字符設備對象--struct cdev;
/*設置kobject->name成員*/
----int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
/*指定kobject->ktype成員和初始化kobject其他成員*/
----void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
/*1建立kobject對象間的層次關係; 2在sysyfs文件系統中建立一個目錄*/
----int kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...)
/*該函數等價於 kobject_init && kobject_add*/
----int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, struct kobject *parent, const char *fmt, ...)
/*該函數先調用kobject_create,然後在調用kobject_add*/
----struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
/*刪除kobject--首先在文件樹中刪除kobj對應的目錄,然後再將kset中相對應的kobject刪除,
在將kobject從層次關係中刪除*/
----void kobject_del(struct kobject *kobj)
----/*總結:將一個kobject對象添加到系統中或者從系統中刪除,主要是圍繞sysfs文件系統展開的,
----對應的結果反映到/sys目錄中就是一個新目錄的誕生或者是一個已經存在的目錄的消亡*/
****************(知道就好)**************
用戶程序可以通過文件系統sysfs接口來配置內核kobject對象的某些屬性----主要是通過ktype的操作方法來配置
/*下面爲kobject對象創建一個屬性文件*/
----/*sysfs_create_file - create an attribute file for an object.*/
----int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
****************************************
2.2 關於kset---(一組kobjcet的集合)
---kset可以認爲是kobject的容器,kset本身也是一個內核對象,所以要內嵌一個kobject對象*/
/*
* ksets are used to define the attribute callbacks(struct kset_uevent_ops) and other common events that happen to a kobject. /**kset主要的作用**/
* @list: the list of all kobjects for this kset
* @list_lock: a lock for iterating over the kobjects
* @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
* @uevent_ops: the set of uevent operations for this kset. These are
* called whenever a kobject has something happen to it so that the kset
* can add new environment variables, or filter out the uevents if so
* desired.
*/
---struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uevent_ops *uevent_ops;
----};