下载后可任意编辑linux 下 request_mem_region 的粗略理解Linux 把基于 I/O 映射方式的 I/O 端口和基于内存映射方式的 I/O 端口资源统称为“I/O 区域”(I/O Region)。I/O Region 仍然是一种 I/O 资源,因此它仍然可以用 resource 结构类型来描述。 Linux 是以一种倒置的树形结构来管理每一类 I/O 资源(如:I/O 端口、外设内存、DMA 和 IRQ)的。每一类 I/O 资源都对应有一颗倒置的资源树,树中的每一个节点都是一个 resource 结构,而树的根结点 root 则描述了该类资源的整个资源空间。1.结构体 1.1>struct resource iomem_resource = { "PCI mem", 0x00000000, 0xffffffff, IORESOURCE_MEM }; 1.2>struct resource { const char *name; unsigned long start, end; unsigned long flags; struct resource *parent, *sibling, *child; };2.调用函数 request_mem_region(S1D_PHYSICAL_REG_ADDR,S1D_PHYSICAL_REG_SIZE, "EpsonFB_RG")#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))__request_region 检查是否可以安全占用起始物理地址 S1D_PHYSICAL_REG_ADDR 之后的连续S1D_PHYSICAL_REG_SIZE 字节大小空间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); //sibling parent 下的所有单元,检测申请部分是否存在交叠冲突 if (!conflict) //conflict=0;申请成功,正常安置了[start,end]到相应位置下载后可任意编辑 break; if (conflict != parent) { parent = conflict; if (!(conflict->flags & IORESOURCE_BUSY)) continue; } kfree(res); //检测到了资源交叠冲突,kfree 归还 kmalloc 申请的内存 res = NULL; break; } write_unlock(&resource_lock); } return res;}static struct resource * __request_resource(st...