Linux内核开发之Kobject

本文介绍了Linux内核中的Kobject及Sysfs机制,详细解释了Kobject的结构及其操作函数,Sysfs文件系统的实现原理,并通过一个具体的内核模块示例展示了如何使用这些机制来创建、管理和操作内核对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Kobject

        类似于C++中的基类,Kobject常被嵌入于其他类型(即:容器)中。如bus,devices, drivers 都是典型的容器。这些容器通过kobject连接起来,形成了一个树状结构。

  1.   struct kobject {
  2. const char *name;
  3. struct list_head entry;
  4. struct kobject *parent;
  5. struct kset *kset;
  6. struct kobj_type *ktype;
  7. struct sysfs_dirent *sd;
  8. struct kref kref;
  9. unsigned int state_initialized:1;
  10. unsigned int state_in_sysfs:1;
  11. unsigned int state_add_uevent_sent:1;
  12. unsigned int state_remove_uevent_sent:1;
  13. unsigned int uevent_suppress:1;
  14. };

  void kobject_init(struct kobject * kobj)

  初始化kobject结构

  int kobject_add(struct kobject * kobj)

  kobject对象注册到Linux系统

  int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,structkobject *parent, const char

  *name, ...)

初始化kobject,并将其注册到linux系统

void kobject_del(struct kobject * kobj)

Linux系统中删除kobject对象

struct kobject *kobject_get(struct kobject *kobj)

kobject对象的引用计数加1,同时返回该对象指针。

void kobject_put(struct kobject * kobj)

kobject对象的引用计数减1,如果引用计数降为0,则调release方法释放该kobject对象。

二、struct kobj_type

kobjectktype成员是一个指向kobj_type结构的指针,该结构中记录了kobject对象的一些属性。

struct kobj_type {

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

          struct sysfs_ops *sysfs_ops;

          struct attribute **default_attrs;

};

release:用于释放kobject占用的资源,当kobject的引用计数为0时被调用。

三、struct attribute

struct attribute {

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

          structmodule * owner;

          mode_t mode; /*属性的保护位*/

};

struct attribute (属性):对应于kobject的目录下的一个文件,Name成员就是文件名。

四、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);

};

  show:当用户读属性文件时,该函数被调用,该函数将属性值存入buffer中返回给用户态;

  store:当用户写属性文件时,该函数被调用,用于存储用户传入的属性值。

五、实例分析

1、内核模块源代码

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>

struct kobject kobj;

static struct attribute test_attr = {
.name = "kobj_config",
.mode = S_IRWXUGO,
};
 
static struct attribute *def_attrs[] = {
&test_attr,
NULL,
};
 

static void obj_test_release(struct kobject *kobject)
{
    printk("eric_test: release .\n");
}

static ssize_t 
kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf)
{
printk("have show.\n");
printk("attrname:%s.\n", attr->name);
sprintf(buf,"%s\n",attr->name);
return strlen(attr->name)+2;
}
 
static ssize_t 
kobj_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count)
{
printk("havestore\n");
printk("write: %s\n",buf);
return count;
}

static const struct sysfs_ops obj_test_sysops ={
.show = kobj_test_show,
.store = kobj_test_store,
};

struct kobj_type ktype = {
.release = obj_test_release,
.sysfs_ops=&obj_test_sysops,
.default_attrs=def_attrs,
};


static __init int kobj_test_init(void)
{
printk("kboject test init.\n");
kobject_init(&kobj, &ktype);// 初始化kobject
kobject_add(&kobj, NULL, "kobject_test");// 添加kobject到内核


return 0;
}


static __exit void kobj_test_exit(void)
{
    printk("kobject test exit.\n");
    kobject_del(&kobj); // 删除kobject
}

module_init(kobj_test_init);
module_exit(kobj_test_exit);

MODULE_LICENSE("Dual BSD/GPL");

2、Makefile

ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:                               
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:                                             
        $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
else
    obj-m := kobj_test.o

endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值