本文中的源码均来自linux内核3.14.3版本/lib/kobject.c文件

/**
 * kset_register - 初始化并添加一个kset
 * @k: kset.
 */
int kset_register(struct kset *k)
{
        int err;

if (!k)
                return -EINVAL;

kset_init(k);
        err = kobject_add_internal(&k->kobj);
        if (err)
                return err;
        kobject_uevent(&k->kobj, KOBJ_ADD);
        return 0;
}

/**
 * kset_init - 初始化一个kset
 * @k: kset
 */
void kset_init(struct kset *k)
{
        kobject_init_internal(&k->kobj);
        INIT_LIST_HEAD(&k->list);
        spin_lock_init(&k->list_lock);
}

static void kobject_init_internal(struct kobject *kobj)
{
        if (!kobj)
                return;
        kref_init(&kobj->kref);//kref是引用计数,该struct仅有一个成员,就是atomic_t refcount,这里把他初始化为1
        INIT_LIST_HEAD(&kobj->entry);//entry是一个struct list_head,这里把entry的next和prev均指向entry
        kobj->state_in_sysfs = 0; //不在sysfs中显示
        kobj->state_add_uevent_sent = 0;
        kobj->state_remove_uevent_sent = 0;
        kobj->state_initialized = 1;
}

static int kobject_add_internal(struct kobject *kobj)
{
        int error = 0;
        struct kobject *parent;

if (!kobj)
                return -ENOENT;

if (!kobj->name || !kobj->name[0]) {
                WARN(1, "kobject: (%p): attempted to be registered with empty name!\n", kobj);
                return -EINVAL;
        }

parent = kobject_get(kobj->parent);//parent的引用计数加一

/* join kset if set, use it as parent if we do not already have one */
/* 把kobject加入kset, 如果没有parent的话,就把它作为parent*/
        if (kobj->kset) {
                if (!parent)
                        parent = kobject_get(&kobj->kset->kobj);
                kobj_kset_join(kobj);
                kobj->parent = parent;
        }

pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n", kobject_name(kobj), kobj, __func__, parent ? kobject_name(parent) : "<NULL>", kobj->kset ?                                                               kobject_name(&kobj->kset->kobj) : "<NULL>");

error = create_dir(kobj);
        if (error) {
                kobj_kset_leave(kobj);
                kobject_put(parent);
                kobj->parent = NULL;

/* be noisy on error issues */
                if (error == -EEXIST)
                        WARN(1, "%s failed for %s with -EEXIST, don't try to register things with "
            "the same name in the same directory.\n",__func__, kobject_name(kobj));
                else
                        WARN(1, "%s failed for %s (error: %d parent: %s)\n", __func__, kobject_name(kobj), error,
    parent ? kobject_name(parent) : "'none'");
        } else
                kobj->state_in_sysfs = 1;

return error;
}

/**
 * kobject_get - object增加计数
 * @kobj: object.
 */
struct kobject *kobject_get(struct kobject *kobj)
{
        if (kobj)
                kref_get(&kobj->kref);
        return kobj;
}

我很想在这死磕一下,因为后面是继续调用原子操作来增加该计数,而我对原子操作只有概念上的认识,没有清晰的理解,不够看起来原子操作还挺麻烦的,这里就先放下了

static int create_dir(struct kobject *kobj)
{
        const struct kobj_ns_type_operations *ops;
        int error;

error = sysfs_create_dir_ns(kobj, kobject_namespace(kobj));
        if (error)
                return error;

error = populate_dir(kobj);
        if (error) {
                sysfs_remove_dir(kobj);
                return error;
        }

/*
        * @kobj->sd 可能会被一个原始对象删除,保留一个备份索引
        * 保证它可以持续到@kobj 释放。
        */
        sysfs_get(kobj->sd);

/*
        * 如果@kobj有ns_ops, 它的子对象需要用命名空间tags过滤,在@kobj->sd
        * 中使能命名空间支持。
        */
        ops = kobj_child_ns_ops(kobj);
        if (ops) {
                BUG_ON(ops->type <= KOBJ_NS_TYPE_NONE);
                BUG_ON(ops->type >= KOBJ_NS_TYPES);
                BUG_ON(!kobj_ns_type_registered(ops->type));

kernfs_enable_ns(kobj->sd);
        }

return 0;
}

kset_register相关推荐

  1. 通过打印学习Linux内核之sysfs(1)

    先研究 /lib/kobject.c 吧 先打开该文件把所有的pr_info或者pr_err全部改为printk,能多打印就多打印了 哦,如果要修改代码,我们可以选择用vim,如果你喜欢的话,不过我们 ...

  2. Linux那些事儿之我是Sysfs(4)举例一lddbus

    对了,你得把ldd3的examples代码下下来.不然没法继续了. 接下来我们从例子着手, localhost:/home/XX/examples/lddbus#insmod lddbus.ko 此时 ...

  3. Linux那些事儿之我是Sysfs(2)linux设备底层模型

    关于linux设备模型网上有一些论述,有些东西我就用了拿来主义,进行了修改和整理. §1 Kobject Kobject 是Linux 2.6引入的新的设备管理机制,在内核中由struct kobje ...

  4. 设备初始化缩水篇(一)

    之前的都是直接复制,稍微翻译了一下,不过代码太乱,没有头绪,这里简化一下看看能否有一点头绪 int __init devices_init(void) {         devices_kset = ...

  5. kset_create_and_add

    我也是初学,做一些学习笔记,总结到哪里算哪里吧 本文中所有代码都是来自linux内核源文件/lib/kobject.c /**  * kset_create_and_add - 创建一个动态的kset ...

  6. input core input.c (1)

    drivers/input/input.c 就是所谓的input的核心程序. 分析这个文件,先从input_init开始. 1: static int __init input_init(void) ...

  7. linux下bus、devices和platform的基础模型

    转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义: kobject是Linux2.6引入的设备管理机制,在内 ...

  8. 初入android驱动开发之字符设备(一)

    大学毕业,初入公司,招进去的是android驱动开发工程师的岗位,那时候刚进去,首先学到的就是如何搭建kernel.android的编译环境,然后就是了解如何刷设备以及一些最基本的工具.如adb.fa ...

  9. linux lddbus设备,Linux那些事儿之我是Sysfs(4)举例一lddbus | 技术部落

    接下来我们从例子着手 localhost:/home/XX/examples/lddbus#insmod lddbus.ko 此时再看/sys/bus/ 这时就多了一个文件夹ldd.里面的文件构成是这 ...

最新文章

  1. 为什么2100万个BTC发行总量少了0.0231?
  2. 马化腾首谈腾讯开源时,鹅厂已在Github上放出82个项目,标星24万+ | 附AI项目链接...
  3. websphere 内存溢出处理
  4. 制度化规范化标准化精细化_精细化管理ORTCC模型在管理中的运用(下)
  5. Vue之条件渲染v-if和v-show
  6. UVA254 Towers of Hanoi【DFS】
  7. 《实施Cisco统一通信管理器(CIPT1)》一1.3 总结
  8. 用DOSBox运行老游戏
  9. viper4android fx原理,ViPer4android. FX顶级音效!
  10. WRF学习笔记二:WRF-chem简单入门运行指南
  11. Vue2基础-el与data的两种写法(HTML版)
  12. 第二天学习笔记:(MDN HTML学习、web安全策略与常见攻击、语义化)
  13. 中山大学生科院骆观正教授课题组诚聘博士后及副研究员
  14. Warshall算法(C++代码实现)
  15. 阿里云服务器怎么样?详细介绍
  16. mapbox样式规范(style)
  17. 1471_TC275的内核种类以及ID判断
  18. Pangu and Stones (hihocoder 1636)
  19. <笔试> 回转寿司题解 动态规划
  20. 【Nexus】通过Nexus搭建Npm私库

热门文章

  1. error: Can not locate config makefile for product “xx“.
  2. Error: Gradle project sync failed. Please fix your project and try again.
  3. Android 购物车图片上面添加数字
  4. Android 串口通讯 获取卡号
  5. 一个http的Post请求问题,unable to resolve host 我的域名:no address associated with hostnam...
  6. SQL概念及DDL语句
  7. COLLATE 函数
  8. 201621123068 作业08-集合
  9. Redis 高级特性(5)— 集群模式(主从模式、哨兵模式、cluster 集群模式)
  10. Windows Python3.6 安装 IPython(Jupyter) qtconsole