日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset

發(fā)布時間:2024/9/27 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。