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

Linux对I/O端口资源的管理(1)》摘要: { struct resource *tmp, **p; p = old->parent->child; for (;;) { tmp = *p; if (!tmp) break; if (tmp == old) { *p = tmp->sibling; old->parent = NULL; return 0; } p = tmp->sibling; }…

{

struct resource *tmp, **p;

p = &old->parent->child;

for (;;) {

tmp = *p;

if (!tmp)

break;

if (tmp == old) {

*p = tmp->sibling;

old->parent = NULL;

return 0;

}

p = &tmp->sibling;

}

return -EINVAL;

}

对上述函数代码的NOTE如下:

同函数__request_resource()相类似,该函数也是通过一个for循环来遍历父资源的child链表。为此,它让tmp指针指向当前被扫描的资源,而指针p则指向当前节点的前一个节点的sibling成员(p的初始值为指向父资源的child指针)。循环体的步骤如下:

①首先,让tmp指针指向当前被扫描的节点(tmp=*p)。

②如果tmp指针为空,说明已经遍历完整个child链表,因此执行break语句推出for循环。由于在遍历过程中没有在child链表中找到参数old所指定的资源节点,因此最后返回错误值-EINVAL,表示参数old是一个无效的值。

③接下来,判断当前被扫描节点是否就是参数old所指定的资源节点。如果是,那就将old从child链表中去除,也即让当前结点tmp的前一个兄弟节点的sibling指针指向tmp的下一个节点,然后将old->parent指针设置为NULL。最后返回0值表示执行成功。

④如果当前被扫描节点不是资源old,那就继续扫描child链表中的下一个元素。因此将指针p指向tmp->sibling成员。

3.2.3 检查资源是否已被占用,

函数check_resource()用于实现检查某一段I/O资源是否已被占用。其源代码如下:

int check_resource(struct resource *root, unsigned long start, unsigned long len)

{

struct resource *conflict, tmp;

tmp.start = start;

tmp.end = start + len - 1;

write_lock(&resource_lock);

conflict = __request_resource(root, &tmp);

if (!conflict)

__release_resource(&tmp);

write_unlock(&resource_lock);

return conflict ? -EBUSY : 0;

}

对该函数的NOTE如下:

①构造一个临时资源tmp,表示所要检查的资源[start,start+end-1]。

②调用__request_resource()函数在根节点root申请tmp所表示的资源。如果tmp所描述的资源还被人使用,则该函数返回NULL,否则返回非空指针。因此接下来在conflict为NULL的情况下,调用__release_resource()将刚刚申请的资源释放掉。

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