linux下request-mem-region的粗略理解_第1页
linux下request-mem-region的粗略理解_第2页
linux下request-mem-region的粗略理解_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

linux下request_mem_region的粗略理解Linux把基于I/O映射方式的I/O端口和基于内存映射方式的I/O端口资源统称为“I/O区域”(I/ORegion)。I/ORegion仍然是一种I/O资源,因此它仍然可以用resource结构类型来描述。

Linux是以一种倒置的树形结构来管理每一类I/O资源(如:I/O端口、外设内存、DMA和IRQ)的。每一类I/O资源都对应有一颗倒置的资源树,树中的每一个节点都是一个resource结构,而树的根结点root则描述了该类资源的整个资源空间。1.结构体

1.1>structresourceiomem_resource={"PCImem",0x00000000,0xffffffff,IORESOURCE_MEM};

1.2>structresource{

constchar*name;

unsignedlongstart,end;

unsignedlongflags;

structresource*parent,*sibling,*child;

};2.调用函数

request_mem_region(S1D_PHYSICAL_REG_ADDR,S1D_PHYSICAL_REG_SIZE,"EpsonFB_RG")#definerequest_mem_region(start,n,name)__request_region(&iomem_resource,(start),(n),(name))__request_region检查是否可以安全占用起始物理地址S1D_PHYSICAL_REG_ADDR之后的连续S1D_PHYSICAL_REG_SIZE字节大小空间structresource*__request_region(structresource*parent,unsignedlongstart,unsignedlongn,constchar*name){

structresource*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(;;){

structresource*conflict;

conflict=__request_resource(parent,res);

//siblingparent下的所有单元,检测申请部分是否存在交叠冲突

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);

}

returnres;}staticstructresource*__request_resource(structresource*root,structresource*new){

unsignedlongstart=new->start;

unsignedlongend=new->end;

structresource*tmp,**p;

if(end<start)

returnroot;

if(start<root->start)

returnroot;

if(end>root->end)

returnroot;

p=&root->child;

//root下的第一个链表元素*p.[child链表是以I/O资源物理地址从低到高的顺序排列的]

for(;;){

tmp=*p;

if(!tmp||tmp->start>end){

new->sibling=tmp;

*p=new;//可以从root->child=null开始我们的分析考虑,此时tmp=null,那么第一个申请将以!tmp条件满足而进入//这时root->child的值为new指针,new->sibling=tmp=null;当第二次申请发生时:如果tmp->start>end成立,//那么,root->child的值为new指针,new->sibling=tmp;这样就链接上了,空间分布图如://child=[start,end]-->[tmp->start,tmp->end](1);如果条件tmp->start>end不成立,那么只能是!tmp条件进入//那么,root->child的值不变,tmp->sibling=new;new->sibling=tmp=null这样就链接上了,空间分布图如://child=[child->start,child->end]-->[start,end](2);//当第三次申请发生时:如果start在(2)中的[child->end,end]之间,那么tmp->end<start将成立,继而continue,//此时tmp=(2)中的[start,end],因为tmp->start<end,所以继续执行p=&tmp->slibing=null,//因为tmp->end>start,所以资源冲突,返回(2)中的[start,end]域//综上的两个边界值情况和一个中间值情况的分析,可以知道代码实现了一个从地地址到高地址的顺序链表//模型图:childe=[a,b]-->[c,d]-->[e,f],此时有一个[x,y]需要插入进去,tmp作为sibling指针游动//tmp指向child=[a,b],//tmp指向[a,b],当tmp->start>y时,插入后的链接图为:child=[x,y]-->[a,b]-->[c,d]-->[e,f]-->null;当tmp->end>=x时,冲突返回tmp//tmp指向[c,d],当tmp->start>y时,插入后的链接图为:child=[a,b]-->[x,y]-->[c,d]-->[e,f]-->null;当tmp->end>=x时,冲突返回tmp//tmp指向[e,f],当tmp->start>y时,插入后的链接图为:child=[a,b]-->[c,d]-->[x,y]-->[e,f]-->null;当tmp->end>=x时,冲突返回tmp//tmp指向null

,插入后的链接图为:child=[a,b]-->[c,d]-->[e,f]-->[x,y]-->null;//顺利的达到了检测冲突,顺序链接的目的

new->parent=root;

returnNULL;

}

p=&tmp->sibling;

if(tmp->end<start)

continue;

returntmp;

}}

5771001803090012095579036822859633082577100180309001238657613739973576069657710018030900135945780775799025155125771001803090012387577164982601818051577100180309001213857213119215891832657710018030900123595790368223610760535771001803090012356576135286143791742577100180309001235557508786970469327917088100343355274101229944325833379170881003433552751018667329388320081708810034335610710158115250150052217088100343356108101000180059871732170881003433542951010741941426870171708810034335618410187866086962880217088100343356185101775831

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论