色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置:IT培訓(xùn) > 華清遠(yuǎn)見教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > Kobject 與 sysfs 文件系統(tǒng)框架的分析
Kobject 與 sysfs 文件系統(tǒng)框架的分析
時(shí)間:2018-05-14作者:華清遠(yuǎn)見

1、設(shè)備模型

2.6內(nèi)核增加了一個(gè)引人注目的新特性------統(tǒng)一設(shè)備模型

設(shè)備模型提供了一個(gè)獨(dú)立的機(jī)制專門來表示設(shè)備,并描述在系統(tǒng)中的拓?fù)浣Y(jié)構(gòu)

(1)代碼重復(fù)最小化

(2)可以列出系統(tǒng)中所有的設(shè)備,觀察到他們的狀態(tài),并且查看他們連接的總線

(3) 可以將設(shè)備和其對(duì)應(yīng)的驅(qū)動(dòng)聯(lián)系起來

(4) 可以按照設(shè)備類型進(jìn)行分類

2、kobject

設(shè)備模型的核心部分就是kobject

struct kobject {

const char *name; /*指向kobject的名字*/

struct list_head entry;

struct kobject *parent/*指向父kobject 實(shí)現(xiàn)層次結(jié)構(gòu)*/

struct kset *kset;

struct kobj_type *ktype;

struct sysfs_dirent *sd;/*指向sysfs_dirent結(jié)構(gòu)體 這個(gè)結(jié)構(gòu)體就表示kobject對(duì)象的層次結(jié)構(gòu)*/

struct kref kref;/*提供引用計(jì)數(shù) 其核心成員是一原子型變量,用來表示內(nèi)核對(duì)象的引用計(jì)數(shù) 內(nèi)核通過該成員追蹤內(nèi)核對(duì)象生命周期*/

unsigned int state_initialized:1;

unsigned int state_in_sysfs:1;/*是否已經(jīng)加入sysfs*/

unsigned int state_add_uevent_sent:1;

unsigned int state_remove_uevent_sent:1;

};

3、ktype

kobject對(duì)象被關(guān)聯(lián)到一種特殊的類型 即ktype(kernel object type的縮寫) ktype由kobj_type結(jié)構(gòu)體來表示,定義于頭文件

struct kobj_type {

void (*release)(struct kobject *kobj);

struct sysfs_ops *sysfs_ops;

struct attribute **default_attrs;

};

1)ktype的存在是為了描述一族kobject所具有的普遍特性,實(shí)現(xiàn)同類的kobject都能共享相同的特性

2)release指針指向在kobject引用計(jì)數(shù)減至零時(shí)調(diào)用析構(gòu)函數(shù),該函數(shù)負(fù)責(zé)釋放所有kobject使用的內(nèi)存和其他相關(guān)的清理工作

3)defaults_attrars 結(jié)構(gòu)體數(shù)組定義了所有具有相同類型的kobject對(duì)象的屬性

4)sysfs文件系統(tǒng)根據(jù)對(duì)應(yīng)的kobject屬性來創(chuàng)建文件

4、kset

1)kset是kobject對(duì)象的集合體,將相關(guān)的kobject集合到一起

2)具有相同ktype的kobject可以被分組到不同的kset

5、管理和操作kobject

kobject一般都被嵌入到設(shè)備結(jié)構(gòu)體中

(1)kobject的初始化一個(gè)kobject對(duì)象

void kobject_init(struct kobject *kobj,struct kobj_type *ktype)

(2)定義并初始化

struct kobject *kobject_create(void)

6、引用計(jì)數(shù)

1)kobject通過引用計(jì)數(shù)控制對(duì)象的有效生命周期

(1)初始化后kobject的引用計(jì)數(shù)置為1

(2)當(dāng)引用計(jì)數(shù)為0時(shí),則表示設(shè)備已經(jīng)卸載,不能在操作對(duì)應(yīng)的設(shè)備

2)操作引用計(jì)數(shù)的接口

(1)增加一個(gè)引用計(jì)數(shù)

struct kobject *kobject_get(struct kobject *kobj)

(2)減少一個(gè)引用計(jì)數(shù)

void kobject_put(struct kobject *kobj)

3)描述引用計(jì)數(shù)的結(jié)構(gòu)kref

kobject計(jì)數(shù)是通過kref實(shí)現(xiàn)

struct kref{

atomic_t refcount

}

(1)初始化

void kref_init(struct kref *kref)

(2)增加一個(gè)計(jì)數(shù)

void kref_get(struct kref *kref)

(3)減一個(gè)計(jì)數(shù)

void kref_put(struct kref *kref)

代碼:

(1)創(chuàng)建一個(gè)kobject對(duì)象并初始化

(2) 定制自己的kobject對(duì)象創(chuàng)建與釋放函數(shù)

7、sysfs

sysfs文件系統(tǒng)是一個(gè)處于內(nèi)存中的虛擬文件系統(tǒng),用文件系統(tǒng)的方式提供kobject對(duì)象層次結(jié)構(gòu)的視圖

bus:提供一個(gè)系統(tǒng)總線視圖

dev:提供已經(jīng)注冊(cè)設(shè)備節(jié)點(diǎn)的視圖

device:系統(tǒng)中設(shè)備結(jié)構(gòu)體視圖

class:給用戶的視圖 通過對(duì)device實(shí)際設(shè)備目錄的符號(hào)鏈接

kernel:包含內(nèi)核配置項(xiàng)和狀態(tài)信息

fs:已經(jīng)注冊(cè)文件系統(tǒng)的視圖

class與devices 一個(gè)是高層概念 給用戶的視圖 一個(gè)底層物理設(shè)備 給內(nèi)核的視圖

8、sysfs添加和刪除kobject

將kobject對(duì)象映射到sysfs文件系統(tǒng)中,產(chǎn)生對(duì)應(yīng)的文件

int kobject_add(struct kobject *kobj, struct kobject *parent,

const char *fmt, ...)

從sysfs文件系統(tǒng)中刪除一個(gè)kobject對(duì)應(yīng)文件目錄,需要使用函數(shù)kobject_decl()

void kobject_del(struct kobject *kobj)

int kobject_set_name(struct kobject *kobj, const char *fmt, ...)//設(shè)置kobject對(duì)象在sysfs中的名字

int sysfs_create_dir(struct kobject * kobj)//在sysfs文件系統(tǒng)中創(chuàng)建目錄

void sysfs_remove_dir(struct kobject * kobj)//在sysfs文件系統(tǒng)中刪除目錄

struct kobject *kobject_get(struct kobject *kobj)//可以用來獲取kobj-parent

代碼3:將對(duì)應(yīng)的kobject映射到對(duì)應(yīng)sysfs文件系統(tǒng)中,增加my_kobject_add()函數(shù)my_kobject_del()函數(shù)

代碼4:將當(dāng)前的kobject對(duì)象增加parent節(jié)點(diǎn) 增加my_kobject_create_and_add()函數(shù)

9、向sysfs添加文件

1)默認(rèn)的文件集合通過kobject和kset中的ktype字段提供

2)具有相同屬性的kobject導(dǎo)入到sysfs文件系統(tǒng)中的文件也具有相同的屬性

3)默認(rèn)文件屬性由kobj_type結(jié)構(gòu)來描述

struct kobj_type {

void (*release)(struct kobject *kobj);

struct sysfs_ops *sysfs_ops;

struct attribute **default_attrs;

};

4)kobj_type結(jié)構(gòu)中包含默認(rèn)文件集合中所有文件的屬性,

default_attrs 默認(rèn)文件屬性結(jié)構(gòu)體數(shù)組

struct attribute {

const char *name; 屬性名稱,在sysfs文件系統(tǒng)中顯示的名字

struct module *owner;所屬模塊 如果存在

mode_t mode;權(quán)限

};

sysfs 文件系統(tǒng)根據(jù)默認(rèn)文件屬性建立對(duì)應(yīng)的文件

5)增加新的文件

(1)根據(jù)新文件屬性在sysfs文件系統(tǒng)創(chuàng)建文件

int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)

{

BUG_ON(!kobj || !kobj->sd || !attr);

return sysfs_add_file(kobj->sd, attr, SYSFS_KOBJ_ATTR);

}

6)對(duì)sysfs文件系統(tǒng)中的文件進(jìn)行讀寫

struct sysfs_ops {

在讀sysfs文件時(shí)該方法會(huì)調(diào)用

ssize_t (*show)(struct kobject *, struct attribute *,char *);

在寫sysfs文件時(shí)該方法被調(diào)用

ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);

};

struct kset *kset_create_and_add(const char *name,struct kset_uevent_ops *uevent_ops,struct kobject *parent_kobj)//創(chuàng)建一個(gè)kset集合

10、創(chuàng)建新屬性

sysfs_create_link():增加新的鏈接

sysfs_remove_file():刪除新的文件

sysfs_remove_link() 刪除鏈接文件

代碼5:在sysfs文件系統(tǒng)中增加文件

代碼6:在sysfs文件系統(tǒng)中增加多個(gè)文件,并設(shè)置新文件的屬性

代碼7: 在sysfs文件系統(tǒng)中針對(duì)每個(gè)文件設(shè)置相應(yīng)的的操作方法show()與store()

代碼8:底層實(shí)現(xiàn)led驅(qū)動(dòng)并關(guān)聯(lián)到kobject對(duì)象中

11、uevent

1)kset是屬于一組kobject的集合

struct kset { struct list_head list;

spinlock_t list_lock;

struct kobject kobj;

const struct kset_uevent_ops *uevent_ops;

};

kset_uevent_ops : 當(dāng)kset中的kobject對(duì)象發(fā)生狀態(tài)變化需要通知用戶空間

struct kset_uevent_ops {

int (* const filter)(struct kset *kset, struct kobject *kobj);

const char *(* const name)(struct kset *kset, struct kobject *kobj);

int (* const uevent)(struct kset *kset, struct kobject *kobj,

struct kobj_uevent_env *env);

};

2)kset相關(guān)的API

void kset_init(struct kset *k)

初始化kset對(duì)象

int kset_register(struct kset *k)

初始化并向系統(tǒng)注冊(cè)一個(gè)kset對(duì)象

static void kobject_init_internal(struct kobject *kobj)

注冊(cè)kset對(duì)象

notes:

.kset對(duì)象本身也是一個(gè)kobject內(nèi)核對(duì)象,在sysfs文件系統(tǒng)中生成一個(gè)新的目錄

.注冊(cè)kset對(duì)象,內(nèi)核編譯啟用了CONFIG_HOTPLUG,則需要就這一事件通知用戶空間(內(nèi)核配置文件中可以查詢)

.事件通知由kobject_uevent完成

.不屬于kset的kobject對(duì)象不能完成事件通知

.kobject之間通過parent成員實(shí)現(xiàn)層次關(guān)系,當(dāng)kobject的parent為NULL時(shí),就會(huì)把kobj->kset->kobj作為kobj的parent

struct kset *kset_create_and_add(const char *name, const struct kset_uevent_ops *uevent_ops,

struct kobject *parent_kobj)

創(chuàng)建一個(gè)kset對(duì)象并添加到sysfs文件系統(tǒng)中

3)hotplug(熱插拔)

當(dāng)一個(gè)設(shè)備動(dòng)態(tài)加入系統(tǒng)時(shí),設(shè)備驅(qū)動(dòng)程序可以檢查到設(shè)備,并通過通知的方式告知用戶空間

通知用戶空間的方式一般有兩種:udev 與 /sbin/hotplug,現(xiàn)在使用更多的是udev

udev 的實(shí)現(xiàn)基于內(nèi)核中的網(wǎng)絡(luò)機(jī)制,通過標(biāo)準(zhǔn)的socket接口來監(jiān)聽來自內(nèi)核的網(wǎng)絡(luò)廣播包,并對(duì)接收的包進(jìn)行分析處理

4)hotplug相關(guān)的API

int kobject_uevent(struct kobject *kobj, enum kobject_action action)

發(fā)送一個(gè) event給用戶空間,以網(wǎng)絡(luò)數(shù)據(jù)包的形式發(fā)送給用戶空間應(yīng)用程序

@action : 發(fā)送event類型

enum kobject_action {

KOBJ_ADD,

KOBJ_REMOVE,

KOBJ_CHANGE,

KOBJ_MOVE,

KOBJ_ONLINE,

KOBJ_OFFLINE,

KOBJ_MAX

};

kobject_uevent_env()

sprintf(scratch, "%s@%s", action_string, devpath); @273L

傳遞給用戶空間event數(shù)據(jù)的內(nèi)容

"事件類型@設(shè)備路徑"

example:

"add@/kset-test/kobject-test/"

uevent一般與應(yīng)用程序結(jié)合起來使用,一般可以接收并處理uevent的應(yīng)用程序有udev or mdev

udev工具通過netlink獲取內(nèi)核發(fā)出的uevent消息,并且處理,加載相應(yīng)的驅(qū)動(dòng)或者在/dev/目錄下生成對(duì)應(yīng)的設(shè)備結(jié)點(diǎn)

udev服務(wù)啟動(dòng)后,會(huì)掃描/sys目錄下所有具有uevent屬性文件,在進(jìn)行相應(yīng)的處理

uevent的觸發(fā)被封裝到設(shè)備模型的操作中,當(dāng)添加設(shè)備的時(shí)則會(huì)發(fā)送一個(gè)uevent(user event)事件,

udev 工具會(huì)通過netlink獲取uevent消息 ,然后進(jìn)行加載驅(qū)動(dòng)或者在/dev/目錄下生成對(duì)應(yīng)的設(shè)備結(jié)點(diǎn)

int device_add()

{

......

kobject_uevent(&dev->kobj, KOBJ_ADD);

......

}

5)netlink機(jī)制

(1)netlink機(jī)制的特點(diǎn)

.netlink是一種特殊的socket

.netlink可以實(shí)現(xiàn)內(nèi)核與應(yīng)用程序進(jìn)行雙向傳輸通訊,并且使用socket()API進(jìn)行交互

.netlink是一種異步通訊方式,在內(nèi)核與用戶態(tài)進(jìn)行傳遞的消息保存在socket緩沖區(qū)數(shù)據(jù)隊(duì)列中,發(fā)送消息只是把消息保存在接收者的socket的接收隊(duì)列中,而不需要等待接收者收到消息

(2)使用socket()創(chuàng)建netlink套接字

int socket(int domain, int type, int protocol);

@domain:協(xié)議族 AF_NETLINK or PF_NETLINK

@type :socket類型 SOCK_DGRAM or SOCK_RAW

@protocol : 協(xié)議類型 NETLINK_KOBJECT_UEVENT

(3)netlink地址結(jié)構(gòu)

struct sockaddr_nl {

__kernel_sa_family_t nl_family; /* AF_NETLINK */

unsigned short nl_pad; /* zero */

__u32 nl_pid; /* port ID */

__u32 nl_groups; /* multicast groups mask */

};

@nl_family : AF_NETLINK 協(xié)議族

@nl_pad : 填0

@nl_pid : 進(jìn)程pid ,可以通過getpid()獲取

(3)使用setsockopt()設(shè)置套接字選項(xiàng)

setsockopt(sd, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));

@SO_RCVBUFFORCE:設(shè)置或者獲取緩沖區(qū)的大小

(4)使用bind()綁定地址結(jié)構(gòu)

retval= bind(sd, (void*)&snl, sizeof(struct sockaddr_nl))

(5)讀取netlink接收緩沖區(qū)的內(nèi)容

read(sd, buf, sizeof(buf));


發(fā)表評(píng)論

全國咨詢電話:400-611-6270,雙休日及節(jié)假日請(qǐng)致電值班手機(jī):15010390966

在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)

企業(yè)培訓(xùn)洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)

Copyright 2004-2018 華清遠(yuǎn)見教育科技集團(tuán) 版權(quán)所有 ,京ICP備16055225號(hào),京公海網(wǎng)安備11010802025203號(hào)

有位老師想和您聊一聊

主站蜘蛛池模板: 欧美精品成人影院 | 野花社区免费观看视频高清 | 欧美日韩一区二区三区视频播放 | 2018天天弄国产大片 | 农村少妇kkkk7777 | 国产区福利 | 午夜不卡无码中文字幕影院 | 成人黄网站片免费视频软件 | chinese白浆高潮videos | 狠狠色丁香婷婷久久综合蜜芽 | 免费看黄在线观看 | 国产精品人妻 | 一本一道波多野结衣av黑人 | 人人看人人澡 | 欧美猛男军警GAY自慰 | 亚洲精品无码专区在线在线播放 | 自拍论坛 | 国产成人免费无码AV在线播放 | 麻豆传媒免费视频 | 四虎影视网址 | 精品国产香蕉伊思人在线 | 亚洲欧洲精品成人久久曰 | 99国产精品无码 | 中国黄色免费看 | 在线观看免费无码专区 | 欧美日韩在线中文 | 97色偷偷色噜噜男人的天堂 | 无码人妻丰满熟妇啪啪网不卡 | 秋霞无码一区二区视频在线观看 | 最近2019年日本中文免费字幕 | 欧美交A欧美精品喷水 | 69精产国品一二三产品价格 | 亚洲国产成人精品无码区宅男 | 欧美精品一区视频 | 欧美精品第一 | 欧美精品VIDEOFREE1080P | 国产在线无码精品无码 | 波多野结衣一区在线观看 | 极品尤物被啪到呻吟喷水 | 丰满气质白嫩少妇呻吟高潮 | 久久精品国产国产精 |