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

/**
 * kobject_create_and_add - 动态创建一个kobject结构并注册到sysfs
 *
 * @name: kobject的名称
 * @parent: kobject的parent kobject of this kobject, 如果有的话
 *
 * 该方法动态创建一个kobject结构并注册到sysfs。当你完成该结构
 * 之后. 调用kobject_put(),这样该结构在不再使用时将会动态的释放。
 *
 * 如果该kobject无法被创建,将会返回NULL。
 */
struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
{
        struct kobject *kobj;
        int retval;

kobj = kobject_create();
        if (!kobj)
                return NULL;

retval = kobject_add(kobj, parent, "%s", name);
        if (retval) {
                printk(KERN_WARNING "%s: kobject_add error: %d\n",  __func__, retval);
                kobject_put(kobj);
                kobj = NULL;
        }
        return kobj;
}

/**
 * kobject_create - 动态创建一个kobject结构
 *
 * 动态创建一个kobject结构,并将其设置为一个带默认释放方法的
 * 动态的kobject。
 *
 * 如果无法创建kobject,将会返回NULL。从这里返回的kobject 结构释放
 * 必须调用kobject_put() 方法而不是kfree(),因为kobject_init()已经被调用
 * 过了。
 */
struct kobject *kobject_create(void)
{
        struct kobject *kobj;

kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
        if (!kobj)
                return NULL;

kobject_init(kobj, &dynamic_kobj_ktype);
        return kobj;
}

/**
 * kobject_init - 初始化一个kobject结构
 * @kobj: 指向要初始化的kobject的指针
 * @ktype: 指向该kobject 的ktype的指针
 *
 * 该方法会正确的初始化一个kobject来保证它可以被传递给kobject_add()
 * 调用.
 *
 * 该功能被调用后,kobject必须通过调用kobject_put()来清理,而不是直接
 * 调用kfree,来保证所有的内存都可以被正确的清理。
 */
void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
{
        char *err_str;

if (!kobj) {
                err_str = "invalid kobject pointer!";
                goto error;
        }
        if (!ktype) {
                err_str = "must have a ktype to be initialized properly!\n";
                goto error;
        }
        if (kobj->state_initialized) {
                /* do not error out as sometimes we can recover */
                printk(KERN_ERR "kobject (%p): tried to init an initialized object, something is seriously wrong.\n", kobj);
                dump_stack();
}

kobject_init_internal(kobj);
        kobj->ktype = ktype;
        return;

error:
        printk(KERN_ERR "kobject (%p): %s\n", kobj, err_str);
        dump_stack();
}

static void kobject_init_internal(struct kobject *kobj)
{
        if (!kobj)
                return;
        kref_init(&kobj->kref);
        INIT_LIST_HEAD(&kobj->entry);
        kobj->state_in_sysfs = 0;
        kobj->state_add_uevent_sent = 0;
        kobj->state_remove_uevent_sent = 0;
        kobj->state_initialized = 1;
}

/**
 * kobject_add - kobject添加主方法
 * @kobj: 要添加的kobject
 * @parent: 指向父kobject的指针
 * @fmt: kobject带的名称格式
 *
 * 本方法中会设置kobject名称并添加到kobject阶层。
 *
 * 如果设置了@parent, 那么@kobj的parent将会被设置为它.
 * 如果 @parent为空, 那么该@kobj的 parent会被设置为与该kobject
 * 相关联的.  如果没有kset分配给这个kobject,那么该kobject会放在
 * sysfs的根目录。
 *
 * 如果该方法返回错误,必须调用 kobject_put()来正确的清理该object
 * 相关联的内存。
 * 在任何情况下都不要直接通过调用to kfree()来直接释放传递给该方法
 * 的kobject,那样会导致内存泄露。
 *
 * 注意,该调用不会创建"add" uevent, 调用方需要为该object设置好所有
 * 必要的sysfs文件,然后再调用带UEVENT_ADD 参数的kobject_uevent() 
 * 来保证用户控件可以正确的收到该kobject创建的通知。
 */
int kobject_add(struct kobject *kobj, struct kobject *parent,
const char *fmt, ...)
{
        va_list args;
        int retval;

if (!kobj)
                return -EINVAL;

if (!kobj->state_initialized) {
                printk(KERN_ERR "kobject '%s' (%p): tried to add an "
                      "uninitialized object, something is seriously wrong.\n",
                kobject_name(kobj), kobj);
                dump_stack();
                return -EINVAL;
        }
        va_start(args, fmt);
        retval = kobject_add_varg(kobj, parent, fmt, args);
        va_end(args);

return retval;
}

static int kobject_add_varg(struct kobject *kobj, struct kobject *parent,
   const char *fmt, va_list vargs)
{
        int retval;

retval = kobject_set_name_vargs(kobj, fmt, vargs);
        if (retval) {
                printk(KERN_ERR "kobject: can not set name properly!\n");
                return retval;
}
        kobj->parent = parent;
        return kobject_add_internal(kobj);
}

/**
 * kobject_set_name_vargs - 设置一个kobject的名称
 * @kobj: 要设置名称的kobject
 * @fmt: 用来构建名称的字符串格式
 * @vargs: 构建字符串的参数
 */
int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
 va_list vargs)
{
        const char *old_name = kobj->name;
        char *s;

if (kobj->name && !fmt)
                return 0;

kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
        if (!kobj->name) {
                kobj->name = old_name;
                return -ENOMEM;
        }

/* ewww... some of these buggers have '/' in the name ... */
        while ((s = strchr(kobj->name, '/')))
                s[0] = '!';

kfree(old_name);
        return 0;
}

kobject_add_internal源码前面已经粘贴过了,这里就不再继续粘贴了

kobject_create_and_add相关推荐

  1. kobject_create_and_add解析

    本文源码均来自linux 3.14.3版本/lib/kobject.c文件 /**  * kobject_create_and_add - 动态创建一个kobject结构并注册到sysfs  *  * ...

  2. 由kobject_create_and_add全面了解kobject

    由kobject_create_and_add全面了解kobject 一.引言 二.kobject相关数据结构 2.1 ktype 2.2 kset 2.3 kref 三.kobject_create ...

  3. /sys目录下其他几个目录的生成

    目前暂时先找到了调用生成这几个目录的方法,至于什么时候调用的,还不知道 文件/fs/namespace.c void __init mnt_init(void) { fs_kobj = kobject ...

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

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

  5. linux设备:初始化

    本文转载自 http://blog.china unix.net/uid-24631445-id-3419097.html 不过本人在此将源码修改为3.14.3的源码了 当按下开机键后,电脑经过自检, ...

  6. I.MX6 ar1020 SPI device driver hacking

    /************************************************************************************* I.MX6 ar1020 ...

  7. Kobject结构体分析

    kobject是组成设备device.驱动driver.总线bus.class的基本结构.如果把前者看成基类,则后者均为它的派生产物.device.driver.bus.class构成了设备模型,而k ...

  8. Linux-2.6设备模型与sysfs文件系统

    kobject对象: 它是设备模型的基本结构,对应于sysfs文件系统中的一个目录,它是一个结构体,不过在Linux中引入了面向对象的思想,从某些角度,也可以看成是一个类.kobject对象通常被嵌入 ...

  9. 内存文件系统——sysfs

    sysfs是一个内存虚拟文件系统,提供了一个kobject层次结构的视图.sysfs根目录下包含至少10个目录: l  block:该目录包含了系统中注册的每个块设备对应的目录.这些目录中包含了块设备 ...

最新文章

  1. C++实现队列queue(附完整源码)
  2. 看动画学算法之:二叉堆Binary Heap
  3. 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
  4. WinCE BSP的BIB文件介绍
  5. mysql 参数配置优化
  6. jmeter经验---java 追加写入代码一例
  7. 1047. 编程团体赛(20)-PAT乙级真题
  8. 函数式编程会取代GoF设计模式吗?
  9. 安装IIS服务 找不到staxmem.dll文件的解决方法
  10. 最长回文子串-----Manacher算法
  11. spring的依赖注入的方式(待更新)
  12. matlab对信号加噪代码,Matlab给信号加噪声
  13. cdr软件百度百科_cdr软件是什么?cdr是什么软件?
  14. 如何做好新媒体软文营销推广
  15. BZOJ2144: 跳跳棋
  16. 安卓GB28181跨网段语音对讲
  17. tpc-c 测试结果 tpc-c
  18. android obb在哪,在Android中使用加密的OBB文件
  19. element card样式无边框
  20. 时间片轮转算法(c++)

热门文章

  1. java.lang.ArithmeticException: divide by zero
  2. INSTALL_FAILED_USER_RESTRICTED
  3. 解决虚拟器device support x86 but apk only supports armeabi-v7
  4. okhttp面试: Socket
  5. 20172329 2017-2018-2 《程序设计与数据结构》实验五报告
  6. 腾讯应用研究一面 武汉
  7. 2022-2028年中国服装电商行业发展战略规划及投资方向研究报告
  8. 【Intellij IDEA】eclipse项目导入
  9. MySQL 基础内容
  10. 十一月第三周学习进度条