linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset
Linux內(nèi)核之設(shè)備驅(qū)動-底層數(shù)據(jù)結(jié)構(gòu)kobject/kset
kobject
kobject是組成device、driver、bus、class的基本結(jié)構(gòu)。如果把前者看成基類,則后者均為它的派生產(chǎn)物。device、driver、bus、class構(gòu)成了設(shè)備模型,而kobject內(nèi)嵌于其中,將這些設(shè)備模型的部件組織起來,并形成了sysfs文件系統(tǒng)。kobject就是device、driver、bus、class在文件系統(tǒng)中的代表。在sysfs操作設(shè)備時,也必須通過kobject這個中間人來完成。
kobject的主要功能如下:
對象的引用計數(shù)
通常一個內(nèi)核對象被創(chuàng)建時,不可能知道該對象存活的時間。跟蹤此對象生命周期的一個方法是使用引用計數(shù)。當(dāng)內(nèi)核中沒有代碼持有該對象的引用時,該對象將結(jié)束自己的有效生命周期,并且可以被刪除。
sysfs表述
在sysfs中顯示的每一個對象,都對應(yīng)一個kobject,它被用來與內(nèi)核交互并創(chuàng)建它的可見表述。
數(shù)據(jù)結(jié)構(gòu)關(guān)聯(lián)
從整體上看,設(shè)備模型是一個友好而復(fù)雜的數(shù)據(jù)結(jié)構(gòu),通過在其間的大量連接而構(gòu)成一個多層次的體系結(jié)構(gòu)。Kobject實現(xiàn)了該結(jié)構(gòu)并把它們聚合在一起。
uevent事件處理
當(dāng)系統(tǒng)中的硬件被熱插拔時,在kobject子系統(tǒng)控制下,將產(chǎn)生事件以通知用戶空間。
下面以2.6.29版本(本文涉及代碼均為此版本)內(nèi)核源碼一一介紹kobject的功能。在kernel/include/linux/kobject.h中,kobject結(jié)構(gòu)定義如下:
struct kobject
{
const
char?*name;
struct
list_head?entry;
struct
kobject?*parent;
struct
kset?*kset;
struct
kobj_type?*ktype;
struct
sysfs_dirent?*sd;
struct
kref?kref;
unsigned
int state_initialized:1;
unsigned
int state_in_sysfs:1;
unsigned
int state_add_uevent_sent:1;
unsigned
int state_remove_uevent_sent:1;
};
*name
kobject的名字,每個kobject都對應(yīng)著sysfs下的一個文件夾,該名字也是對應(yīng)的文件夾的名字。
entry
雙向鏈表指針,用于將同一kset集合中的kobject鏈接到一起,便于訪問。
*parent
kobject對應(yīng)的父kobject節(jié)點,在sysfs表現(xiàn)為上一級目錄。
*kset
kobject所在的集合的指針,kset概念將在kset一節(jié)中描述。
*ktype
kobject對象類型指針,隨后將會介紹。
*sd
sd用于表示VFS文件系統(tǒng)的目錄項,由此可見它是設(shè)備與文件之間的橋梁。在sysfs節(jié)會對此結(jié)構(gòu)進行分析。
kref
對象引用計數(shù)器。引用計數(shù)器的作用前面已經(jīng)講過。
state_initialized
初始化標(biāo)志位,在對象初始化時被置位。
state_in_sysfs
kobject對象在sysfs中的狀態(tài),創(chuàng)建則置1,否則為0。亦即kobject對應(yīng)的目錄在sysfs中是否被創(chuàng)建。
state_add_uevent_sent
添加設(shè)備的uevent事件是否發(fā)送標(biāo)志,添加設(shè)備時會向用戶空間發(fā)送uevent事件,請求新增設(shè)備。
state_remove_uevent_sent
刪除設(shè)備的uevent事件是否發(fā)送標(biāo)志,刪除設(shè)備時會向用戶空間發(fā)送uevent事件,請求卸載設(shè)備。
kset是嵌入相同類型結(jié)構(gòu)的kobject集合。我們可以認為它是kobject的頂層容器類。kset也是基于sysfs的,維系著設(shè)備、驅(qū)動等等分類與鏈接關(guān)系。圖1-1(來自LDD3,但稍作修改)可清晰表示kset與kobject的關(guān)系。
圖1-1:kset與kobject關(guān)系
下面我們來看一下kset的結(jié)構(gòu):
struct kset
{
struct
list_head list;
spinlock_t
list_lock;
struct
kobject kobj;
struct
kset_uevent_ops *uevent_ops;
};
從結(jié)構(gòu)體中我們可以看到kset與kobject最大的不同就是多了kset_uevent_ops類型的成員。因此,我們可理解kset就是為了讓一組kobject使用相同的uevent處理函數(shù)。
uevent知識請參考uevent和udev一章。
前面說過kobject對應(yīng)sysfs中的文件夾,但作為一個文件系統(tǒng),不可能沒有文件。下面將要講到的屬性即對應(yīng)這里的文件。我們先來看kobject中的一個重要成員*ktype,類型如下:
struct kobj_type
{
void
(*release)(struct kobject *kobj);
struct
sysfs_ops *sysfs_ops;
struct
attribute **default_attrs;
};
*release
意如其名,即當(dāng)kobject引用計數(shù)器為0時,用來釋放kobject對象。
*sysfs_ops
根據(jù)default_attrs中的mode要求,提供方法操作指定屬性文件。一般只有讀寫兩個函數(shù),如下:
struct sysfs_ops
{
ssize_t?(*show)(struct
kobject *, struct attribute *,char *);
ssize_t?(*store)(struct
kobject *,struct attribute *,const char *,
size_t);
};
**default_attrs
保存了屬性列表,用于創(chuàng)建該類型的每一個kobject文件。結(jié)構(gòu)如下:
struct attribute
{
const
char?*name;
struct
module?*owner;
mode_t?mode;
};
*name
屬性名,對應(yīng)于kobject的sysfs目錄中的一個文件。
*owner
指向模塊的指針,該模塊負責(zé)實現(xiàn)這些屬性。源碼注釋已明確指出該字段已不在使用,目前存在的原因就是為了保持向上兼容。
mode
指明該屬性文件是只讀只寫還是可讀可寫,誰可寫等等。
除了在初始化時指定屬性外,我們還可以根據(jù)需要使用函數(shù)對屬性進行增刪,如下:
int
sysfs_create_file(struct kobject * kobj, const struct attribute *
attr);
void
sysfs_remove_file(struct kobject * kobj, const struct attribute *
attr);
請注意,屬性可以任意增刪,但方法sysfs_ops確是唯一的不可改變,所以必須確保該方法可以處理新的屬性。
總結(jié)
以上是生活随笔為你收集整理的linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国民航法规体系的主要构架是什么?
- 下一篇: linux 内存 段,Linux内存储器