认识Linux设备驱动模型和Kobject
2.6內核增加了一個引人注目的新特性——統一設備模型(device model)。設備模型提供了一個獨立的機制專門來表示設備,并描述其在系統中的拓撲結構;
Linux設備模型的核心是使用Bus、Class、Device、Driver四個核心數據結構,將大量的、不同功能的硬件設備(以及驅動該硬件設備的方法),以樹狀結構的形式,進行歸納、抽象,從而方便Kernel的統一管理;
而硬件設備的數量、種類是非常多的,這就決定了Kernel中將會有大量的有關設備模型的數據結構。這些數據結構一定有一些共同的功能,需要抽象出來統一實現,否則就會不可避免的產生冗余代碼。這就是Kobject誕生的背景;
通過parent指針,可以將所有Kobject以層次結構的形式組合起來;
使用一個引用計數(reference count),來記錄Kobject被引用的次數,并在引用次數變為0時把它釋放(這是Kobject誕生時的唯一功能);
和sysfs虛擬文件系統配合,將每一個Kobject及其特性,以文件的形式,開放到用戶空間(有關sysfs,會在其它文章中專門描述,本文不會涉及太多內容);
Kobject是Linux設備模型的基礎;
回想文件系統中的核心對象“索引節點(indoe)”和目錄項“dentry”:
? ? inode—與文件系統中的一個文件相對應(而實際上,只有文件被訪問時,才在內存創建索引節點);
? ? dentry—每個路徑中的一個分量,例如路徑/bin/ls,其中/、bin和ls三個都是目錄項,只是前兩個是目錄,而最后一個是普通文件;也就是說,目錄項或者是一子目錄,或者是一個文件;
既然,kobject要形成一顆樹,那么其中的字段就要有parent,以表示樹的層次關系;另外,kobject得有name字段,按說,目錄或文件名并不會很長,但是,sysfs文件系統為了表示對象之間復雜的關系,需要通過軟鏈接達到,而軟鏈接常常有較長的名字,通過以上的分析,目前可以得知kobject對象包含的字段有:
struct kobject {
? ? char ? ? ? *k_name; ?/*長名字*/
? ? char ? ? ? name[kOBJ_NAME_LEN]; /* 短名字*/
? ? struct kobject ? ?*parent; /* 表示對象的層次關系*/
? ? struct dentry *dentry; /*表示sysfs中的一個目錄項 */
};
查看kobject.h頭文件,看到它還包含以下字段:
struct kobject {
? ? struct kref ? ? ? ? ?kref;
? ? struct list_head ?entry;
? ? struct kset ? ? ? ? ?*kset;
? ? struct kobj_type ?*ktype;
};
這四個字段,每一個都是結構體,其中structlist_head是內核中形成雙向鏈表的基本結點結構;
增加一個引用計數可通過koject_get()函數完成:
? ? struct kobject* kobject_get(struct kobject *kobj);
該函數正常情況下將返回一個指向kobject的指針,如果失敗則返回NULL指針;
減少引用計數通過kobject_put()完成:
? ? void kobject_put(struct kobject *kobj);
如果對應的kobject的引用計數減少到零,則與該kobject關聯的ktype中的析構函數將被調用;
深入到引用計數系統的內部去看,會發現kobject的引用計數是通過kref結構體實現的,該結構體定義在頭文件<linux/kref.h>中:
struct kref {atomic_t refcount;};
其中唯一的字段是用來存放引用計數的原子變量。那為什么采用結構體?這是為了便于進行類型檢測;
上述的所有函數定義與聲明分別在在文件lib/kref.c和文件<linux/kref.h>中。
共同特性的ktype
? ? kobject是一個抽象而基本的對象。對于一族具有共同特性的kobject,就是用定義在頭文件<linux/kobject.h>中的ktype來描述:
struct kobj_type { ? ?
? ? void (*release)(structkobject *);
? ? struct sysfs_ops ?*sysfs_ops;
? ? struct attribute ?**default_attrs;
};
release指針指向在kobject引用計數減至零時要被調用的析構函數,該函數負責釋放所有kobject使用的內存和其它相關清理工作;
sysfs_ops變量指向sysfs_ops結構體,其中包含兩個函數,也就是對屬性進行操作的讀寫函數show()和store();
最后,default_attrs指向一個attribute結構體數組。這些結構體定義了kobject相關的默認屬性;屬性描述了給定對象的特征,其實,屬性就是對應/sys樹形結構中的葉子結點,也就是文件;
?
總結
以上是生活随笔為你收集整理的认识Linux设备驱动模型和Kobject的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB删除数据
- 下一篇: Silverlight 开发入门1