多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Linux設備驅動:kobject原理與實例分析

Linux設備驅動:kobject原理與實例分析

來源:程序員人生   發布時間:2014-11-09 08:47:29 閱讀次數:3113次

1、Sysfs文件系統

"sysfsis a ram-based filesystem initially based on ramfs. It provides ameans to export kernel data structures, their attributes, and thelinkages between them to userspace.”

Linux2.6內核引入了sysfs文件系統。sysfs被看成是與proc同種別的文件系統。sysfs把連接在系統上的裝備和總線組織成份級的文件,使其從用戶空間可以訪問到。

Sysfs被加載在 /sys/目錄下,它的子目錄包括:

1)Block:在系統中發現的每一個塊裝備在該目錄下對應1個子目錄。每一個子目錄中

又包括1些屬性文件,它們描寫了這個塊裝備的各方面屬性,如:裝備大小。(loop塊裝備是使用文件來摹擬的)

2)Bus:在內核中注冊的每條總線在該目錄下對應1個子目錄,如: ide pci scsi usbpcmcia 其中每一個總線目錄內又包括兩個子目錄:devices和drivers ,devices目錄包括了在全部系統中發現的屬于該總線類型的裝備,drivers目錄包括了注冊到該總線的所有驅動。

3)Class:將裝備依照功能進行的分類,如/sys/class/net目錄下包括了所有網絡接口。

4)Devices:包括系統所有的裝備。

5)Kernel:內核中的配置參數

6)Module:系統中所有模塊的信息

7)Firmware:系統中的固件

8)Fs:描寫系統中的文件系統

9)Power:系統中電源選項

2、K object

實現了基本的面向對象管理機制,是構成Linux2.6裝備模型的核心結構。它與sysfs文件系統緊密相連,在內核中注冊的每一個kobject對象對應sysfs文件系統中的1個目錄。類似于C++中的基類,Kobject常被嵌入于其他類型(即:容器)中。如bus,devices,drivers都是典型的容器。這些容器通過kobject連接起來,構成了1個樹狀結構。

structk object {

constchar

*name;

structlist_head

entry;

structkobject

*parent;//指向父對象

structkset

*kset;

structkobj_type

*ktype;

structsysfs_dirent *sd;

structkref

kref;//對象援用計數

unsignedint state_initialized:1;

unsignedint state_in_sysfs:1;

unsignedint state_add_uevent_sent:1;

unsignedint state_remove_uevent_sent:1;

};

3、Kobject操作

         1)voidkobject_init(struct kobject * kobj)初始化kobject結構

         2)intkobject_add(struct kobject * kobj)將kobject對象注冊到Linux系統

         3)intkobject_init_and_add(struct kobject *kobj, struct kobj_type*ktype,struct kobject *parent, const char *fmt, ...)初始化kobject,并將其注冊到linux系統


           4)voidkobject_del(struct kobject * kobj)從Linux系統中刪除kobject對象

           5)structkobject *kobject_get(struct kobject*kobj)將kobject對象的援用計數加1,同時返回該對象指針。

           6)voidkobject_put(struct kobject *kobj)將kobject對象的援用計數減1,如果援用計數降為0,則調用release方法釋放該kobject對象。

4、  Struct kobj_type


Kobject的ktype成員是1個指向kobj_type結構的指針, 該結構中記錄了kobject對象的1些屬性。

structkobj_type {

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

structsysfs_ops *sysfs_ops;

structattribute **default_attrs;

};

release:用于釋放kobject占用的資源,當kobject的援用計數為0時被調用。

5、Struct attribute

structattribute {

char *name; /*屬性文件名*/

structmodule * owner;

mode_tmode; /*屬性的保護位*/

};

struct attribute (屬性):對應于kobject的目錄下的1個文件,Name成員就是文件名。

6、Struct sysfs_ops

structsysfs_ops

{

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

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

size_t);

};

           1)Show:當用戶讀屬性文件時,該函數被調用,該函數將屬性值存入buffer中返回給用戶態;

           2)Store:當用戶寫屬性文件時,該函數被調用,用于存儲用戶傳入的屬性值。

7、 kobject實例分析

       kobject.c源碼

#include <linux/device.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/string.h> 
#include <linux/sysfs.h> 
#include <linux/stat.h> 
  
MODULE_AUTHOR("David Xie"); 
MODULE_LICENSE("Dual BSD/GPL");

 

/*聲明release、show、store函數*/


void obj_test_release(struct kobject *kobject); 
ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf);
ssize_t kobj_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count);

/*對應于kobject的目錄下的1個文件,Name成員就是文件名*/  
struct attribute test_attr = { 
        .name = "kobj_config", 
        .mode = S_IRWXUGO, 
}; 
  
static struct attribute *def_attrs[] = { 
        &test_attr, 
        NULL, 
}; 
  
/kobject對象的操作 
struct sysfs_ops obj_test_sysops = 

        .show = kobj_test_show, 
        .store = kobj_test_store, 
}; 
 
/*定義kobject對象的1些屬性及對應的操作*/ 
struct kobj_type ktype =  

        .release = obj_test_release, 
        .sysfs_ops=&obj_test_sysops, 
        .default_attrs=def_attrs, 
};

/*release方法釋放該kobject對象*/  
void obj_test_release(struct kobject *kobject) 

        printk("eric_test: release . "); 
}

/*當讀文件時履行的操作*/ 
ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf)

        printk("have show. "); 
        printk("attrname:%s. ", attr->name); 
        sprintf(buf,"%s ",attr->name); 
        return strlen(attr->name)+2; 
}

/*當寫文件時履行的操作*/  
ssize_t kobj_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count)

        printk("havestore "); 
        printk("write: %s ",buf); 
        return count; 

  
struct kobject kobj;//聲明kobject對象
 
static int kobj_test_init(void) 

        printk("kboject test init. "); 
        kobject_init_and_add(&kobj,&ktype,NULL,"kobject_test");//初始化kobject對象kobj,并將其注冊到linux系統
        return 0; 

  
static void kobj_test_exit(void) 

        printk("kobject test exit. "); 
        kobject_del(&kobj); 

  
module_init(kobj_test_init);

module_exit(kobj_test_exit);


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 女人的天堂网 | 国产91久久精品一区二区 | 成人自拍偷拍 | 成人亚洲精品一区二区 | 欧美一级在线观看视频 | 日本成人在线网站 | 性欧美videos俄罗斯 | 最近中文字幕无吗高清视频 | 午夜精品久久久久久91 | 中文字幕一区视频 | 精品一区二区三区在线视频 | 国产精品欧美亚洲韩国日本不卡 | 一二三四在线观看免费中文在线观看 | 亚洲精品中文字幕字幕 | 美国毛片网 | 国产精品1区2区3区 国产精品1页 | 交在线观看网站视频 | 韩国在线观看免费观看影院 | 亚洲毛片免费视频 | 操操操操网| 成人国产精品视频频 | 黄色ab| 久久www免费人成看国产片 | 在线不卡国产 | 欧美性受xxxx喷水性欧洲 | 97欧美在线看欧美视频免费 | 看日本黄色大片 | 国产精品合集一区二区三区 | 午夜爽爽爽男女免费观看hd | 欧美日韩在线播放成人 | 日韩男人的天堂 | 日本不卡一区二区三区 最新 | 一区二区三区在线播放视频 | 中文字幕一区二区三区久久网站 | 伊人久久大香线焦综合四虎 | 中文字幕第9页 | 在线免费看网站 | 日韩日韩日韩 | 99久久这里只精品麻豆 | 在线视频一区二区三区 | 免费观看性欧美特黄 |