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