Sysfs文件系统
- 基于RAM
- 将内核的数据结构、数据结构的属性和它们之间的关系展现给用户空间。
- sysfs把连接在系统上的设备和总线组织成分级的文件,使其可以从用户空间直接访问。
- Sysfs文件系统挂载于/sys/目录下,它的子目录包括Block,Bus,devices和drivers等。
Kobject的作用:
- 创建sys目录下的文件夹
- 实现了基本的面向对象管理机制
- 与Sysfs文件系统紧密相连,在内核中注册的每一个Kobject对象对应/sys/下的一个子目录
Kobject结构体内容不需要一一了解
Kobject操作
void kobject_init(struct kobject *kobj);
int kobject_add(struct kobject *kobj);
- 初始化kobject结构,并将其注册到linux系统中
int kobject_init_and_add(struct kobject *kobj,struct kobj_type *ktype,struct kobject *parent,const char *fmt,...);
void kobject_del(struct kobject *kobj);
- 将kobject对象的引用计数加一,同时返回该对象指针
struct kobject *kobject_get(struct kobject *kobj);
- 将kobject对象的引用计数减一,如果引用计数降为0,则调用release方法释放该kobject对象
void kobject_put(struct kobject *kobj);
Struct kobj_type
struct kobj_type{
void (*release)(struct kobject *kobj);
struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
};
Struct attribute
struct attribute{
char *name;
struct module *owner;
mode_t mode;
};
Struct sysfs_ops
struct sysfs_ops{
ssize_t (*show)(struct kobject *,struct attribute *,char *);
ssize_t (*store)(struct kobject *,struct attribute *,const char *,size_t);
};
运行步骤
- 编译源码 make
- 安装memdev_kobj模块
sudo insmod memdev_kobj.ko
- 到/sys/目录下查看是否有"kobject_test"文件夹
-
这里的文件夹的名字是根据
- 进入kobject_test文件夹,查看是否有"kobj_test_attr"文件
-
这里的文件名是根据
- 查看文件"kobj_test_attr"
cat kobj_test_attr
-
这里打印的信息是根据
- 查看dmesg信息
-
这里显示的信息根据上图
成功运行!!!!!
memdev_kobject源码!!!
#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>
struct kobject kobj;
void Kobj_test_release(struct kobject *kobj){
printk("Kobj_test_release\n");
}
ssize_t kobj_test_show(struct kobject *kobj,struct attribute *attr,char *buf){
printk("kobj_test_show\n");
printk("attr_name: %s\n",attr->name);
sprintf(buf,"buf is %s",attr->name);
return strlen(attr->name)+2;
}
ssize_t kobj_test_store(struct kobject *kobj,struct attribute *attr,const char *buf,size_t count){
printk("kobj_test_store\n");
printk("write : %s\n",buf);
return count;
}
struct sysfs_ops Kobj_test_sysfs_ops = {
.show = kobj_test_show,
.store = kobj_test_store
};
struct attribute kobj_test_attr = {
.name = "kobj_test_attr",
.mode = S_IRWXUGO
};
static struct attribute *def_attrs[] = {
&kobj_test_attr,
NULL
};
struct kobj_type ktype = {
.release = Kobj_test_release,
.sysfs_ops = &Kobj_test_sysfs_ops,
.default_attrs = def_attrs
};
static int __init kobj_test_init(void){
printk("kobject test init!!\n");
kobject_init_and_add(&kobj,&ktype,NULL,"kobject_test");
return 0;
}
static void __exit kobj_test_exit(void){
printk("kobject test exit!!\n");
kobject_del(&kobj);
}
MODULE_LICENSE("GPL");
module_init(kobj_test_init);
module_exit(kobj_test_exit);