linux驱动结构pci之resource

     Linux设计了一个通用的数据结构resource来描述各种I/O资源(如:I/O端口、外设内存、DMA和IRQ等)。

    该结构定义在include/linux/ioport.h头文件中:

    struct resource {

         const char *name; 

         unsigned long start, end;  //表示资源的起始物理地址和终止物理地址。它们确定了资源的范围,也即是一个闭区间[start,end]


         unsigned long flags;    //描述资源的标志

         struct resource *parent, *sibling, *child;  //分别指向父、兄弟、子资源的指针

};

 Linux是以一种倒置的树形结构来管理每一类I/O资源(如:I/O端口、外设内存、DMA和IRQ)的。每一类I/O资源都对应有一颗倒置的资源树,树中的每一个节点都是一个resource结构,而树的根结点root则描述了该类资源的整个资源空间。为什么使用树?例如,考虑一下IDE硬盘接口所使用的I/O端口地址-比如说从0xf000 到 0xf00f。那么,start字段为0xf000 且end 字段为0xf00f的这样一个资源包含在树中,控制器的常规名字存放在name字段中。但是,IDE设备驱动程序需要记住另外的信息,也就是IDE链主盘使用0xf000 到 0xf007的子范围,从盘使用0xf008 到 0xf00f的子范围。为了做到这点,设备驱动程序把两个子范围对应的孩子插入到从0xf000 到 0xf00f的整个范围对应的资源下。一般来说,树中的每个节点肯定相当于父节点对应范围的一个子范围。I/O端口资源树(ioport_resource)的根节点跨越了整个I/O地址空间(从端口0到65535,即64K)。

更详细可以参考:


http://www.programfan.com/blog/article.asp?id=25171

你可能感兴趣的:(linux驱动结构pci之resource)