


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保山2025年云南保山施甸县审计局招聘编外合同制岗位人员笔试历年参考题库附带答案详解
- 科技与环保的完美结合-太阳能技术的未来展望
- 兼职合同范本饭店
- 2025辽宁沈阳地铁三号线招安检员和安保员笔试参考题库附带答案详解
- K-8794-生命科学试剂-MCE
- 中山2025年广东中山市阜沙镇人民政府招聘合同制工作人员笔试历年参考题库附带答案详解
- 东营2025年山东东营市市属事业单位招聘81人笔试历年参考题库附带答案详解
- 现代医疗技术中的石墨烯研究进展及市场预测
- 科技类培训课程实践与成效的全面分析
- 电子商务安全技术在市场应用中的探讨
- cecs31-2017钢制电缆桥架工程设计规范
- 《煤矿地质工作细则》矿安﹝2023﹞192号
- 2024年牧原集团招聘笔试参考题库含答案解析
- 清仓查库工作总结报告
- 肾脏病日宣传活动策划方案
- 模具制造发展前景分析
- 2023音乐厅建筑声学设计标准
- 微纳光学结构制造
- PEP四年级下册英语教案(表格)
- 中职语文教学
- 教培机构财务管理文件范本
评论
0/150
提交评论