Linux設備驅動模型探究--1(kobject)



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;
----};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章