still_waters_rp 发表于 2013-08-10 11:48

关于device_add中父设备的确定过程

在int device_add(struct device *dev)函数中调用get_device_parent(dev, parent);来具体确定该device的父设备,在get_device_parent的执行的部分代码如下:
static struct kobject *get_device_parent(struct device *dev,
                                       struct device *parent)
{
      if (dev->class) {
                ...........

                /*
               * 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)//如果在device_add中没有指定父设备时则parent=NULL
                        parent_kobj = virtual_device_parent(dev);//当parent=NULL则创建一个kobject
                else if (parent->class && !dev->class->ns_type)
                        return &parent->kobj;
                else
                        parent_kobj = &parent->kobj;
               ...........
}
然后问题就来了,在virtual_device_parent的实现如下;
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;
}
对这个函数我看的很费解,首先是他传进来的形参dev就根本没有用到,其次在该函数中定义了一个指针为virtual_dir并初始化为NULL,那么接下来的条件判断就恒成立,每次都会调用kobject_create_and_add在devices目录下创建一个个"virtual",那如果是内核第一次调用这个函数当然没有问题,但是第二次调用不就冲突了吗,他怎么处理的?他的条件判断就压根是摆设,我感觉调用kobject_create_and_add的条件应该是判断在devices目录下是不是已经有"virtual"这个目录,如果没有在创建?另外,linux内核的代码一向都是相当简洁,这个函数确写得十分累赘,如果他这样写函数直接实现成return kobject_create_and_add("virtual", &devices_kset->kobj);不就完了吗??
这个问题困扰了我一个上午了,查了好多东西都找不到原因求各位大神解答。。。

heyangya 发表于 2013-08-10 22:23

这个问题其实很简单,你要看到那个关键字static,说明它只赋值为NULL一次

still_waters_rp 发表于 2013-08-16 20:39

回复 2# heyangya


    额 。。。一语惊醒梦中人啊。。瞬间感觉自己傻逼了。。谢谢大神。。
页: [1]
查看完整版本: 关于device_add中父设备的确定过程