linux设备模型之内核对象kobject

本文深入探讨了Linux内核中的kobject机制,包括kobject结构体、相关操作函数及其实例应用,详细解析了如何在Linux环境中创建、初始化、添加kobject对象,并在sys目录下展示其目录结构。

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

linux中一切皆文件
1.内核对象kobject

struct kobject {
    const char      *name; //对象的名字
    struct list_head    entry;
    struct kobject      *parent;//对象的上层
    struct kset     *kset; //当前对象属于的kset指针 
    struct kobj_type    *ktype;//文件操作集
    struct sysfs_dirent *sd;
    struct kref     kref;
    unsigned int state_initialized:1;
    unsigned int state_in_sysfs:1;
    unsigned int state_add_uevent_sent:1;
    unsigned int state_remove_uevent_sent:1;
    unsigned int uevent_suppress:1;
};
相关操作函数:
//初始化一个kobject
void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
//添加一个kobject
int
kobject_add(struct kobject *kobj, struct kobject *parent,const char *fmt, ...)
     kobject_add_varg(kobj, parent, fmt, args);
        kobject_set_name_vargs(kobj, fmt, vargs);
        kobject_add_internal(struct kobject *kobj)
            if (kobj->kset) {
                if (!parent)
                        parent = kobject_get(&kobj->kset->kobj);
                kobj_kset_join(kobj);
                kobj->parent = parent;
            }
        error = create_dir(kobj);//创建目录
            error = sysfs_create_dir(kobj);
            create_diif (kobj->parent)
                parent_sd = kobj->parent->sd;
            else
                parent_sd = &sysfs_root;
                create_dir(kobj, parent_sd, type, ns, kobject_name(kobj), &sd);
//初始化与添加
int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,struct kobject *parent, const char *fmt, ...)
//创建并添加
struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
        kobj = kobject_create();
            kobject_init(kobj, &dynamic_kobj_ktype);
        retval = kobject_add(kobj, parent, "%s", name);
extern void kobject_del(struct kobject *kobj);

例子:
#include <linux/module.h>
#include <linux/kobject.h>

static struct kobject * parent = NULL;
static struct kobject * child = NULL;

static int __init kobject_test_init(void)
{
    printk(KERN_INFO "%s\n",__FUNCTION__);
    parent = kobject_create_and_add("father_obj",NULL);
    child = kobject_create_and_add("child_obj",parent);
    return 0;
}
static void __exit kobject_test_exit(void)
{
    printk(KERN_INFO "%s\n",__FUNCTION__);
    kobject_del(child);
    kobject_del(parent);
}

module_init(kobject_test_init); 
module_exit(kobject_test_exit);

MODULE_AUTHOR("derrick email: kjfure@163.com");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("Kobject test Module");
MODULE_ALIAS("Kobject test Module");
//在sys目录下有:
//sys/father_obj/child_obj目录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值