原创 Linux Notice

2009-2-26 18:13 1304 0 分类: MCU/ 嵌入式

 


相关文件:
 /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)
总之,孩子节点的资源范围一定在父节点的范围之内,兄弟节点的资源范围一定比自己的范围大。
*************************************************************************************


 


 


 


 



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /1 下一条