久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Kobject 與 sysfs 文件系統(tong)框架的(de)分(fen)析

Kobject 與 sysfs 文(wen)件(jian)系統框架的(de)分析 時間:2018-05-14      來源:未知

1、設備模型

2.6內核(he)增加了一(yi)(yi)個(ge)引人注目的(de)新(xin)特性(xing)------統一(yi)(yi)設(she)備模型

設備模型(xing)提(ti)供了一(yi)個(ge)獨立的(de)機制(zhi)專門來表示設備,并描述在系統中的(de)拓(tuo)撲結構

(1)代碼重復(fu)最小化(hua)

(2)可(ke)以(yi)列出系統(tong)中所有的(de)設備,觀察(cha)到他(ta)們的(de)狀態,并且查看他(ta)們連接的(de)總線(xian)

(3) 可以將設備和(he)其對應的驅(qu)動聯系起來(lai)

(4) 可(ke)以(yi)按照設備類型進行(xing)分類

2、kobject

設(she)備(bei)模(mo)型的(de)核心部分就是kobject

struct kobject {

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

struct list_head entry;

struct kobject *parent/*指向父kobject 實現層(ceng)次結構*/

struct kset *kset;

struct kobj_type *ktype;

struct sysfs_dirent *sd;/*指向sysfs_dirent結構(gou)體 這個結構(gou)體就表示kobject對象的(de)層次結構(gou)*/

struct kref kref;/*提供(gong)引(yin)用計數 其核(he)心成員是一(yi)原子型變量,用來表示內(nei)(nei)核(he)對象的引(yin)用計數 內(nei)(nei)核(he)通過(guo)該成員追(zhui)蹤內(nei)(nei)核(he)對象生命周期*/

unsigned int state_initialized:1;

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

unsigned int state_add_uevent_sent:1;

unsigned int state_remove_uevent_sent:1;

};

3、ktype

kobject對象被關聯到一種特殊的類型 即ktype(kernel object type的縮寫) ktype由kobj_type結構體來表示,定義于頭文件

struct kobj_type {

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

struct sysfs_ops *sysfs_ops;

struct attribute **default_attrs;

};

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

2)release指(zhi)針(zhen)指(zhi)向(xiang)在kobject引用計數減至零時調(diao)用析構函數,該函數負(fu)責釋放所有kobject使用的(de)內存和其他相關的(de)清理工作

3)defaults_attrars 結(jie)構體數組定義了所有具有相同類型的kobject對象的屬性

4)sysfs文(wen)件系統根(gen)據(ju)對應的kobject屬性來(lai)創建文(wen)件

4、kset

1)kset是kobject對象(xiang)的集合體(ti),將相關的kobject集合到一(yi)起

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

5、管理和操作kobject

kobject一般都被嵌入到設備結構體中

(1)kobject的(de)初始化一個kobject對象

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

(2)定(ding)義并初始化

struct kobject *kobject_create(void)

6、引用計數

1)kobject通過(guo)引用計數控制對象的有(you)效生命周期

(1)初始化(hua)后kobject的引用計數置為1

(2)當(dang)引用計數(shu)為0時,則表示設備(bei)已經卸載,不能(neng)在操作對應的設備(bei)

2)操作引用計(ji)數的接口

(1)增加一個引(yin)用計數

struct kobject *kobject_get(struct kobject *kobj)

(2)減(jian)少一(yi)個引(yin)用計數

void kobject_put(struct kobject *kobj)

3)描述引用計數(shu)的(de)結構kref

kobject計數是通過(guo)kref實現

struct kref{

atomic_t refcount

}

(1)初(chu)始化

void kref_init(struct kref *kref)

(2)增加一個(ge)計數

void kref_get(struct kref *kref)

(3)減一個計數

void kref_put(struct kref *kref)

代碼:

(1)創建(jian)一個kobject對象(xiang)并(bing)初始化

(2) 定制自己的kobject對象(xiang)創建與釋放函數(shu)

7、sysfs

sysfs文(wen)件系(xi)統是一個處于內存中的(de)(de)虛擬(ni)文(wen)件系(xi)統,用文(wen)件系(xi)統的(de)(de)方式提供kobject對象(xiang)層次結構的(de)(de)視圖

bus:提(ti)供一個系統總線視圖

dev:提供已經(jing)注冊設備節(jie)點的視圖

device:系統中設備(bei)結構(gou)體視圖

class:給用(yong)戶的視(shi)圖(tu) 通(tong)過對device實際設備目錄的符號(hao)鏈(lian)接

kernel:包含內核配(pei)置項和狀(zhuang)態信息

fs:已經注冊文件系統(tong)的視圖

class與devices 一個是高(gao)層概(gai)念 給用戶(hu)的(de)視圖 一個底層物(wu)理設備 給內核的(de)視圖

8、sysfs添(tian)加和刪除kobject

將kobject對象(xiang)映(ying)射(she)到sysfs文件(jian)(jian)系(xi)統中,產生對應的文件(jian)(jian)

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

const char *fmt, ...)

從sysfs文(wen)件系統(tong)中刪除一個kobject對應文(wen)件目錄,需要使用(yong)函(han)數kobject_decl()

void kobject_del(struct kobject *kobj)

int kobject_set_name(struct kobject *kobj, const char *fmt, ...)//設(she)置(zhi)kobject對(dui)象在sysfs中的名字

int sysfs_create_dir(struct kobject * kobj)//在sysfs文件(jian)系統中創(chuang)建目錄(lu)

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

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

代(dai)碼3:將(jiang)對應的kobject映射到對應sysfs文件系統(tong)中,增加(jia)my_kobject_add()函(han)數my_kobject_del()函(han)數

代(dai)碼4:將當前的kobject對象(xiang)增(zeng)加(jia)parent節點 增(zeng)加(jia)my_kobject_create_and_add()函數(shu)

9、向sysfs添(tian)加(jia)文(wen)件

1)默認的文件集合通過kobject和kset中(zhong)的ktype字(zi)段提供(gong)

2)具有(you)相(xiang)同屬性的kobject導入到sysfs文(wen)件系統(tong)中的文(wen)件也具有(you)相(xiang)同的屬性

3)默(mo)認(ren)文件屬性(xing)由kobj_type結構來描述(shu)

struct kobj_type {

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

struct sysfs_ops *sysfs_ops;

struct attribute **default_attrs;

};

4)kobj_type結(jie)構中包含(han)默認文件集(ji)合中所有文件的屬(shu)性(xing),

default_attrs 默認文件屬性結構體(ti)數組

struct attribute {

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

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

mode_t mode;權限

};

sysfs 文(wen)件(jian)系統根(gen)據默(mo)認文(wen)件(jian)屬性建立對應的文(wen)件(jian)

5)增加新的文(wen)件

(1)根據(ju)新(xin)文(wen)件(jian)屬性在sysfs文(wen)件(jian)系(xi)統創建(jian)文(wen)件(jian)

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)對(dui)sysfs文件系統中的文件進(jin)行讀(du)寫

struct sysfs_ops {

在讀sysfs文件時該方法(fa)會調用

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

在(zai)寫sysfs文(wen)件時該(gai)方法被調用

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)//創(chuang)建(jian)一(yi)個kset集合

10、創(chuang)建新屬性

sysfs_create_link():增加新的鏈接

sysfs_remove_file():刪除新(xin)的(de)文件

sysfs_remove_link() 刪除鏈接文件

代碼5:在(zai)sysfs文件系(xi)統中增加文件

 代(dai)碼6:在sysfs文件(jian)系統中增(zeng)加多個文件(jian),并設置新(xin)文件(jian)的屬性

代(dai)碼(ma)7: 在sysfs文(wen)件系統(tong)中針對每個文(wen)件設置相(xiang)應(ying)的的操作方法show()與(yu)store()

代碼8:底層實現led驅動并關(guan)聯到kobject對象中(zhong)

11、uevent

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

struct kset { struct list_head list;

spinlock_t list_lock;

struct kobject kobj;

const struct kset_uevent_ops *uevent_ops;

};

kset_uevent_ops : 當kset中(zhong)的kobject對象(xiang)發(fa)生(sheng)狀態(tai)變(bian)化需要通知用(yong)戶空間(jian)

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相關的(de)API

void kset_init(struct kset *k)

初(chu)始化kset對象(xiang)

int kset_register(struct kset *k)

初始(shi)化并向系(xi)統注冊一個kset對象

static void kobject_init_internal(struct kobject *kobj)

注冊kset對象(xiang)

notes:

.kset對象本(ben)身也(ye)是一(yi)個kobject內核對象,在sysfs文件系統中生成(cheng)一(yi)個新的目錄

.注冊(ce)kset對象(xiang),內核編譯啟用(yong)了CONFIG_HOTPLUG,則需要就這一(yi)事件通知(zhi)用(yong)戶空(kong)間(內核配置文件中可(ke)以(yi)查(cha)詢)

.事(shi)件通知由kobject_uevent完成

.不(bu)屬(shu)于(yu)kset的kobject對象(xiang)不(bu)能完成事件通知(zhi)

.kobject之間(jian)通過(guo)parent成員(yuan)實(shi)現(xian)層次關系,當kobject的parent為(wei)NULL時,就會(hui)把(ba)kobj->kset->kobj作為(wei)kobj的parent

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

struct kobject *parent_kobj)

創(chuang)建一個kset對象并(bing)添加到(dao)sysfs文件(jian)系(xi)統中(zhong)

3)hotplug(熱插拔(ba))

當一個設備(bei)動態加入系統時,設備(bei)驅(qu)動程序可(ke)以檢查(cha)到設備(bei),并通過(guo)通知(zhi)的(de)方式(shi)告知(zhi)用戶空間

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

udev 的實現基于內核中的網絡機制,通過標準的socket接(jie)口(kou)來監聽(ting)來自內核的網絡廣播包,并對接(jie)收(shou)的包進行分析處理(li)

4)hotplug相關(guan)的API

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

發(fa)送(song)一個 event給用戶空(kong)間(jian)(jian),以(yi)網絡數(shu)據包的形式發(fa)送(song)給用戶空(kong)間(jian)(jian)應用程(cheng)序

@action : 發送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

傳遞給用(yong)戶空間event數(shu)據的內容

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

example:

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

uevent一(yi)般與(yu)應用程(cheng)序結合起來使用,一(yi)般可以接收并處理uevent的應用程(cheng)序有udev or mdev

udev工具通過netlink獲取(qu)內核發(fa)出的(de)(de)uevent消息(xi),并(bing)且(qie)處理,加載相應(ying)的(de)(de)驅動或者在(zai)/dev/目錄下(xia)生成(cheng)對(dui)應(ying)的(de)(de)設(she)備結點

 udev服務(wu)啟動(dong)后(hou),會掃(sao)描/sys目(mu)錄下所有(you)具有(you)uevent屬性文件,在進行相應的(de)處理

uevent的觸(chu)發被(bei)封裝到設(she)備模型的操作中,當添加設(she)備的時(shi)則會發送一個(ge)uevent(user event)事件,

udev 工具會通過(guo)netlink獲取uevent消(xiao)息 ,然后(hou)進(jin)行加(jia)載(zai)驅動(dong)或者(zhe)在(zai)/dev/目錄下生成對應的設備(bei)結點

int device_add()

{

......

kobject_uevent(&dev->kobj, KOBJ_ADD);

......

}

5)netlink機(ji)制(zhi)

(1)netlink機制(zhi)的特點

.netlink是一(yi)種特殊的(de)socket

.netlink可以(yi)實現(xian)內核與應用程序(xu)進行雙向(xiang)傳輸通訊(xun),并且使用socket()API進行交互

.netlink是一種異步通訊方式(shi),在(zai)內(nei)核與用戶態進行(xing)傳遞(di)的(de)消息(xi)(xi)(xi)保存(cun)在(zai)socket緩沖區數據(ju)隊列中(zhong),發送消息(xi)(xi)(xi)只是把(ba)消息(xi)(xi)(xi)保存(cun)在(zai)接收者的(de)socket的(de)接收隊列中(zhong),而(er)不需要等待接收者收到(dao)消息(xi)(xi)(xi)

(2)使(shi)用socket()創建(jian)netlink套接(jie)字

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

@domain:協議族 AF_NETLINK or PF_NETLINK

@type :socket類型(xing) SOCK_DGRAM or SOCK_RAW

@protocol : 協議類(lei)型 NETLINK_KOBJECT_UEVENT

(3)netlink地址結構

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 協(xie)議族

@nl_pad : 填0

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

(3)使用setsockopt()設(she)置套接字(zi)選項(xiang)

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

@SO_RCVBUFFORCE:設(she)置或(huo)者獲取緩沖區(qu)的大小

(4)使(shi)用bind()綁定地(di)址結(jie)構

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

(5)讀(du)取netlink接收緩沖區的內容

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

上一篇:EPOLL的工作原理及流程

下一篇:Linux下科大訊飛語音識別全面總結

熱(re)點文章推(tui)薦
華清(qing)學(xue)員就(jiu)業榜(bang)單
高(gao)薪學員經驗分享
熱點新(xin)聞推薦
前臺專線:010-82525158 企業培訓洽談專(zhuan)線:010-82525379 院校合(he)作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部