1、Sysfs文件系統(tǒng)
"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內(nèi)核引入了sysfs文件系統(tǒng)。sysfs被看成是與proc同種別的文件系統(tǒng)。sysfs把連接在系統(tǒng)上的裝備和總線組織成份級(jí)的文件,使其從用戶(hù)空間可以訪問(wèn)到。
Sysfs被加載在 /sys/目錄下,它的子目錄包括:
1)Block:在系統(tǒng)中發(fā)現(xiàn)的每一個(gè)塊裝備在該目錄下對(duì)應(yīng)1個(gè)子目錄。每一個(gè)子目錄中
又包括1些屬性文件,它們描寫(xiě)了這個(gè)塊裝備的各方面屬性,如:裝備大小。(loop塊裝備是使用文件來(lái)摹擬的)
2)Bus:在內(nèi)核中注冊(cè)的每條總線在該目錄下對(duì)應(yīng)1個(gè)子目錄,如: ide pci scsi usbpcmcia 其中每一個(gè)總線目錄內(nèi)又包括兩個(gè)子目錄:devices和drivers ,devices目錄包括了在全部系統(tǒng)中發(fā)現(xiàn)的屬于該總線類(lèi)型的裝備,drivers目錄包括了注冊(cè)到該總線的所有驅(qū)動(dòng)。
3)Class:將裝備依照功能進(jìn)行的分類(lèi),如/sys/class/net目錄下包括了所有網(wǎng)絡(luò)接口。
4)Devices:包括系統(tǒng)所有的裝備。
5)Kernel:內(nèi)核中的配置參數(shù)
6)Module:系統(tǒng)中所有模塊的信息
7)Firmware:系統(tǒng)中的固件
8)Fs:描寫(xiě)系統(tǒng)中的文件系統(tǒng)
9)Power:系統(tǒng)中電源選項(xiàng)
2、K object
實(shí)現(xiàn)了基本的面向?qū)ο蠊芾頇C(jī)制,是構(gòu)成Linux2.6裝備模型的核心結(jié)構(gòu)。它與sysfs文件系統(tǒng)緊密相連,在內(nèi)核中注冊(cè)的每一個(gè)kobject對(duì)象對(duì)應(yīng)sysfs文件系統(tǒng)中的1個(gè)目錄。類(lèi)似于C++中的基類(lèi),Kobject常被嵌入于其他類(lèi)型(即:容器)中。如bus,devices,drivers都是典型的容器。這些容器通過(guò)kobject連接起來(lái),構(gòu)成了1個(gè)樹(shù)狀結(jié)構(gòu)。
structk object {
constchar
*name;
structlist_head
entry;
structkobject
*parent;//指向父對(duì)象
structkset
*kset;
structkobj_type
*ktype;
structsysfs_dirent *sd;
structkref
kref;//對(duì)象援用計(jì)數(shù)
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結(jié)構(gòu)
2)intkobject_add(struct kobject * kobj)將kobject對(duì)象注冊(cè)到Linux系統(tǒng)
3)intkobject_init_and_add(struct kobject *kobj, struct kobj_type*ktype,struct kobject *parent, const char *fmt, ...)初始化kobject,并將其注冊(cè)到linux系統(tǒng)
4)voidkobject_del(struct kobject * kobj)從Linux系統(tǒng)中刪除kobject對(duì)象
5)structkobject *kobject_get(struct kobject*kobj)將kobject對(duì)象的援用計(jì)數(shù)加1,同時(shí)返回該對(duì)象指針。
6)voidkobject_put(struct kobject *kobj)將kobject對(duì)象的援用計(jì)數(shù)減1,如果援用計(jì)數(shù)降為0,則調(diào)用release方法釋放該kobject對(duì)象。
4、 Struct kobj_type
Kobject的ktype成員是1個(gè)指向kobj_type結(jié)構(gòu)的指針, 該結(jié)構(gòu)中記錄了kobject對(duì)象的1些屬性。
structkobj_type {
void(*release)(struct kobject *kobj);
structsysfs_ops *sysfs_ops;
structattribute **default_attrs;
};
release:用于釋放kobject占用的資源,當(dāng)kobject的援用計(jì)數(shù)為0時(shí)被調(diào)用。
5、Struct attribute
structattribute {
char *name; /*屬性文件名*/
structmodule * owner;
mode_tmode; /*屬性的保護(hù)位*/
};
struct attribute (屬性):對(duì)應(yīng)于kobject的目錄下的1個(gè)文件,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:當(dāng)用戶(hù)讀屬性文件時(shí),該函數(shù)被調(diào)用,該函數(shù)將屬性值存入buffer中返回給用戶(hù)態(tài);
2)Store:當(dāng)用戶(hù)寫(xiě)屬性文件時(shí),該函數(shù)被調(diào)用,用于存儲(chǔ)用戶(hù)傳入的屬性值。
7、 kobject實(shí)例分析
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函數(shù)*/
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);
/*對(duì)應(yīng)于kobject的目錄下的1個(gè)文件,Name成員就是文件名*/
struct attribute test_attr = {
.name = "kobj_config",
.mode = S_IRWXUGO,
};
static struct attribute *def_attrs[] = {
&test_attr,
NULL,
};
/kobject對(duì)象的操作
struct sysfs_ops obj_test_sysops =
{
.show = kobj_test_show,
.store = kobj_test_store,
};
/*定義kobject對(duì)象的1些屬性及對(duì)應(yīng)的操作*/
struct kobj_type ktype =
{
.release = obj_test_release,
.sysfs_ops=&obj_test_sysops,
.default_attrs=def_attrs,
};
/*release方法釋放該kobject對(duì)象*/
void obj_test_release(struct kobject *kobject)
{
printk("eric_test: release .
");
}
/*當(dāng)讀文件時(shí)履行的操作*/
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;
}
/*當(dāng)寫(xiě)文件時(shí)履行的操作*/
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對(duì)象
static int kobj_test_init(void)
{
printk("kboject test init.
");
kobject_init_and_add(&kobj,&ktype,NULL,"kobject_test");//初始化kobject對(duì)象kobj,并將其注冊(cè)到linux系統(tǒng)
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);
上一篇 java的深拷貝和淺拷貝
下一篇 【Android界面實(shí)現(xiàn)】使用ActionBar和DrawerLayout純?cè)丶瑢?shí)現(xiàn)側(cè)滑欄和滑動(dòng)Tab界面