相关文件:
/include/linux/ioport.h
**************************基本数据结构**********************************************
系统已经预先定义好了一些资源的根节点。
struct resource ioport_resource = { "PCI IO", 0x0000, IO_SPACE_LIMIT, IORESOURCE_IO };
#pci I/O地址范围是0x0000---0xffff,
//这是所有的ioport的地址范围,所有的io资源分配都在这个范围内,他是所有io资源的父资源
struct resource iomem_resource = { "PCI mem", 0x00000000, 0xffffffff, IORESOURCE_MEM }
//同上
************************************************************************************
***********************************基本函数*****************************************
(1):int __check_region(struct resource *parent, unsigned long start, unsigned long n)
#res = __request_region(parent, start, n, "check-region");
调用request_region先申请一个区域,返回0成功,否则失败。
# release_resource(res);
kfree(res); //将申请成功的resource删除,并释放内存,
#return 0;
(3):struct resource * __request_region(struct resource *parent, unsigned long start,
unsigned long n, const char *name)
#申请一个资源区域,如果成功,返回一个新的资源节点,否则返回null。
#struct resource *res = kmalloc(sizeof(*res), GFP_KERNEL);//首先生成一个节点。
#对节点的内容进行填充。
#进入一个无限循环
#conflict = __request_resource(parent, res);
#如果不冲突的画,申请成功。返回res.
#如果冲突,但conflict不是父节点的话,继续进行下一轮申请。
#否则申请失败。
(2):static struct resource * __request_resource(struct resource *root, struct resource *new)
#进行检查,如果new的start和end不再root的资源范围之内,返回root。
#取得root的child节点的指针。
#进入一个死循环。
如果new的资源范围比child的还小,将new链入到树状结构中去。返回null。
否则循环检查child的sibling节点。如果资源范围有重叠,把重叠的节点作为conflit返回。
************************************************************************************
********************************资源图***********************************************
在linux中,资源(包括端口,内存等)都使用一个树状结构进行表示的。进行端口请求等工作的时候首先要进行资源的请求。资源数如下所示:
resource(0)
child
|
|
resouce(A)
sibling-------------->resource(B)
start----end sibling------------------>resource(C)
parent start----end sibling----------->
child parent start----end
| child parent
|
resource(D)
sibling------------->resource(E)
start----end sibling------------->resource (G)
parent start----end
child parent
child
|
|
resource(F)
资源分配的顺序如下
例如资源的范围是0----10,则可能的非配情况如下
0(0-----10)总资源
A(0-----5) B(6---7) C(8---9)
D(0-----2) E(2---4) G(4---5)
F(2---3)
总之,孩子节点的资源范围一定在父节点的范围之内,兄弟节点的资源范围一定比自己的范围大。
*************************************************************************************
文章评论(0条评论)
登录后参与讨论