- 论坛徽章:
- 0
|
在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);不就完了吗??
这个问题困扰了我一个上午了,查了好多东西都找不到原因求各位大神解答。。。 |
|