snail_kernel

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

在看cu的帖子时,看到了这样一个问题:http://bbs.chinaunix.net/thread-4094308-1-1.html。

“在该函数中定义了一个指针为virtual_dir并初始化为NULL,那么接下来的条件判断就恒成立,每次都会调用 kobject_create_and_add在devices目录下创建一个个"virtual",那如果是内核第一次调用这个函数当然没有问题,但是第二次调用不就冲突了吗,他怎么处理的?他的条件判断就压根是摆设,我感觉调用kobject_create_and_add的条件应该是判断在 devices目录下是不是已经有"virtual"这个目录,如果没有在创建?”

涉及到的源码:

static struct kobject *get_device_parent(struct device *dev,                                                                               
                struct device *parent)
{
        ...
                /*
                 * If we have no parent, we live in "virtual".
                 * Class-devices with a non class-device as parent, live
                 * in a "glue" directory to prevent namespace collisions.
                 */
                if (parent == NULL)                                                       
                        parent_kobj = virtual_device_parent(dev);
                else if (parent->class)
        ...
}

 

static struct kobject *virtual_device_parent(struct device *dev)
{
        static struct kobject *virtual_dir = NULL;

        if (!virtual_dir)
                virtual_dir = kobject_create_and_add("virtual",
                                                     &devices_kset->kobj);
        return virtual_dir;
}

先抛开代码的意义,仅仅从语法上分析下:
问题的关键在于virtual_dir被定义为static变量,也即该指针变量只会被初始化一次,
当第一次成功运行函数:kobject_create_and_add()后,该变量便不再是NULL了,而是
指向一个kobject实例。

记录下,以后自己遇到了类似的问题,印象也深刻点。

 

posted on 2013-08-17 20:50  snail_kernel  阅读(235)  评论(0)    收藏  举报