Linux对I/O端口资源的管理(1)

Linux对I/O端口资源的管理(1)》摘要: struct resource * __request_region(struct resource *parent, unsigned long start, unsigned long n, const char *name) { struct resource *res = kmalloc(sizeof(*res), GFP_KERNEL); if …

struct resource * __request_region(struct resource *parent,

unsigned long start, unsigned long n, const char *name)

{

struct resource *res = kmalloc(sizeof(*res), GFP_KERNEL);

if (res) {

memset(res, 0, sizeof(*res));

res->name = name;

res->start = start;

res->end = start + n - 1;

res->flags = IORESOURCE_BUSY;

write_lock(&resource_lock);

for (;;) {

struct resource *conflict;

conflict = __request_resource(parent, res);

if (!conflict)

break;

if (conflict != parent) {

parent = conflict;

if (!(conflict->flags & IORESOURCE_BUSY))

continue;

}

/* Uhhuh, that didn't work out.. */

kfree(res);

res = NULL;

break;

}

write_unlock(&resource_lock);

}

return res;

}

NOTE:

①首先,调用kmalloc()函数在SLAB分配器缓存中分配一个resource结构。

②然后,相应的根据参数值初始化所分配的resource结构。注意!flags成员被初始化为IORESOURCE_BUSY。

③接下来,用一个for循环开始进行资源分配,循环体的步骤如下:

l 首先,调用__request_resource()函数进行资源分配。如果返回NULL,说明分配成功,因此就执行break语句推出for循环,返回所分配的resource结构的指针,函数成功地结束。

l 如果__request_resource()函数分配不成功,则进一步判断所返回的冲突资源节点是否就是父资源节点parent。如果不是,则将分配行为下降一个层次,即试图在当前冲突的资源节点中进行分配(只有在冲突的资源节点没有设置IORESOURCE_BUSY的情况下才可以),于是让parent指针等于conflict,并在conflict->flags&IORESOURCE_BUSY为0的情况下执行continue语句继续for循环。

l 否则如果相冲突的资源节点就是父节点parent,或者相冲突资源节点设置了IORESOURCE_BUSY标志位,则宣告分配失败。于是调用kfree()函数释放所分配的resource结构,并将res指针置为NULL,最后用break语句推出for循环。

你的位置:电脑故障网 >> 操作系统 >> Linux/Unix >> Linux对I/O端口资源的管理(1)