免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4598 | 回复: 2
打印 上一主题 下一主题

关于device_add中父设备的确定过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-10 11:48 |只看该作者 |倒序浏览
在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);不就完了吗??
这个问题困扰了我一个上午了,查了好多东西都找不到原因求各位大神解答。。。

论坛徽章:
0
2 [报告]
发表于 2013-08-10 22:23 |只看该作者
这个问题其实很简单,你要看到那个关键字static,说明它只赋值为NULL一次

论坛徽章:
0
3 [报告]
发表于 2013-08-16 20:39 |只看该作者
回复 2# heyangya


    额 。。。一语惊醒梦中人啊。。瞬间感觉自己傻逼了。。谢谢大神。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP