在看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实例。
记录下,以后自己遇到了类似的问题,印象也深刻点。

浙公网安备 33010602011771号