如何在/sys系統下面建立檔案和目錄
阿新 • • 發佈:2021-01-02
技術標籤:驅動
驅動需要在/sys增加相關的裝置,驅動等資訊
核心中的kset結構體
struct kset{
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uecent_ops *uevent_ops;
}
/sys下的每個目錄用一個kobject表示,也就是每個目錄是一個kobject;
/sys下面的目錄用一個struct kobject的物件來表示;
struct kset裡面含一個strutc kobject,相當於kset繼承kobject,kset也是一個特殊的kobject,也代表一個/sys下面的目錄;我們一般用kset來做父目錄,裡面放多個kobject;
在kobj1下面建立檔案val,檔案是用屬性來表示,&kobj1_attr_group是一個組的地址,裡面應該封裝屬性,因為檔案是用屬性來表示的。
sysfs_create_group(kobj1,&kobj_attr_group);
程式碼
static struct kobject *kobj1;
static struct kobject *kobj2;
static unsigned int val=0;
//讀
//val->buf
static ssize_t val_show (struct kobject *kobj,struct kobj_attribute *attr,char *buf)
{
//PAGE_SIZE限制長度,為了長度
return snprintf(buf,PAGE_SIZE,"%d\n",val);
}
//寫
static ssize_t val_store(struct kobject *kobj,struct kobj kobj_attribure *attr,const char *buf,size_t count)
{
char *endp;
printk("size=%d\n",count) ;
//把buf轉成10進位制存到val中
val=simpe_strtoul(buf,&endp,10);
return count;
}
//val是一個檔案,自然需要讀寫
//val_show 讀
//val_store 寫
static struct kobj_attribute kobj1_val_attr=__ATTR(val,0666,val_show,val_store);
static struct attribute *kobj1_attrs[]={
&kobj1_val_attr.attr,
NULL,
}
//這是後面給kobj1新增的屬性組,裡面只有一個屬性
static static attribute_group kobj1_attr_group={
.attrs=kobj1_attrs,
}
static int __init module_init(void)
{
//建立了一個kset目錄,由於它無父物件,所以在/sys下面
kset = kset_create_and_and("kset",NULL,NULL);
//建立了kobject目錄,在/sys/kset目錄下
kobject=kobject_create_and_add("kobj1",&kset->kobj);
kobject=kobject_create_and_add("kobj2",&kset->kobj);
// 在/sys/kobj1下面建立檔案val檔案,檔案是用屬性來表示
sysfs_create_group(kobj1,&kobj_attr_group);
sysfs_create_link(k);
}