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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2024/9/27 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。