- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
iomem—IO映射方式的IO端口和內存映射方式的IO端口
iomem—I/O映射方式的I/O端口和内存映射方式的I/O端口
Linux将基于I/O映射方式的I/O端口和基于内存映射方式的I/O端口资源统称为“I/O区域”(I/O Region)。I/O Region仍然是一种I/O资源,因此它仍然可以用resource结构类型来描述。下面我们就来看看Linux是如何管理I/O Region的。
3.3.1 I/O Region的分配
在函数__request_resource()的基础上,Linux实现了用于分配I/O区域的函数__request_region(),如下:
1 struct resource * __request_region(struct resource *parent,
2 unsigned long start, unsigned long n, const char *name)
3 {
4 struct resource *res = kmalloc(sizeof(*res), GFP_KERNEL);
5
6 if (res) {
7 memset(res, 0, sizeof(*res));
8 res-name = name;
9 res-start = start;
10 res-end = start + n - 1;
11 res-flags = IORESOURCE_BUSY;
12
13 write_lock(resource_lock);
14
15 for (;;) {
16 struct resource *conflict;
17
18 conflict = __request_resource(parent, res);
19 if (!conflict)
20 break;
21
22 if (conflict != parent) {
23 parent = conflict;
24 if (!(conflict-flags IORESOURCE_BUSY))
25 continue;
26 }
27
28 /* Uhhuh, that didnt work out.. */
29 kfree(res);
30 res = NULL;
31 break;
32 }
33 write_unlock(resource_lock);
34 }
35 return res;
36 }
37
NOTE:
①首先,调用kmalloc()函数在SLAB分配器缓存中分配一个resource结构。
②然后,相应的根据参数来填充resource结构。注意!flags成员被初始化为IORESOURCE_BUSY。
③接下来,用一个for循环开始进行资源分配,循环体的步骤如下:
l 首先,调用__request_resource()函数进行资源分配。如果返回NULL,说明分配成功,因此就执行break语句推出for循环,返回所分配的resource结构的指针,函数成功地结束。
l 如果__request_resource()函数分配不成功,则进一步判断所返回的冲突资源节点是否就是父资源节点parent。如果不是,则将分配行为下降一个层次,即试图在当前冲突的资源节点中进行分配(只有在冲突的资源节点没有设置IORESOURCE_BUSY的情况下才可以),于是让 parent指针等于conflict,并在conflict-flagsIORESOURCE_BUSY为0的情况下执行 continue语句继续for循环。
l 否则如果相冲突的资源节点就是父节点parent,或者相冲突资源节点设置了IORESOURCE_BUSY标志位,则宣告分配失败。于是调用kfree ()函数释放所分配的resource结构,并将res指针置为NULL,最后用break语句推出for循环。
④最后,返回所分配的resource结构的指针。
3.3.2 I/O Region的释放
函数__release_region()实现在一个父资源节点parent中释放给定范围的I/O Region。实际上该函数的实现思想与__release_resource()相类似。其源代码如下:
1 void __release_region(struct resource *parent,
2 unsigned long start, unsigned long n)
3 {
4 struct resource **
您可能关注的文档
- CSharp_深入淺出全接触.doc
- CP帶您认知海洋生物——全身都是刺的海胆.doc
- C與C++常见错误中英文对照表.doc
- c語言内存分配的原理.doc
- CV太陽雨资源整理.doc
- C語言常见错误中英文对照表.doc
- C語言知识点总结【完美版】.doc
- D316家園卡D31条款.doc
- D060國寿安泰团体定期寿险D80条款.doc
- Daplen PP EF341AE 北歐化工 PP EF341AE 上海.doc
- 歌华有线-市场前景及投资研究报告:电视主业结构性机遇,发力通信业务,奋楫迎新.pdf
- 九方智投控股-市场前景及投资研究报告:投教内容流量风口,战略RWA国际市场.pdf
- 高频因子分析报告:GPT-5发布,金融文本分析推理评测.pdf
- 中烟香港-市场前景及投资研究报告-烟草上市平台,内生外延.pdf
- SAF行业市场前景及投资研究报告:可持续航空燃料 SAF,呼之欲出.pdf
- 利率择时策略研究分析报告:“条件概率”视角下的期限利差.pdf
- 汽车零部件行业市场前景及投资研究报告:豪华车,传统燃油向新能源过渡,关注品牌溢价,设计溢价主线.pdf
- 同力股份-市场前景及投资研究报告-非公路宽体自卸车,大型化+电动化+无人化,矿卡更换需求.pdf
- 小菜园-市场前景及投资研究报告-高性价比中餐龙头,门店进行时.pdf
- 晶苑国际-市场前景及投资研究报告-服装代工领先,客户产业链成长.pdf
最近下载
- 智能网联汽车底盘线控系统与控制技术.pdf VIP
- 2025年江苏省常州市初一新生入学分班数学考试真题及答案.docx VIP
- 民航安检 中级题库.docx VIP
- 耳鼻咽喉头颈外科学,下颌下腺肿瘤病例分析.docx VIP
- 部编版九年级上册第四单元 单元整合教学设计.pdf VIP
- 外研版(2019)选择性必修 第二册Unit 5 A delicate world Developing ideas 语言点 课件(共53张).pptx VIP
- 九年级上册月考物理.doc VIP
- 康复医学科诊疗指南--技术操作规范.docx VIP
- 小森印刷机s40操作说明.pdf VIP
- 部编版语文九下-第四单元整合教学.ppt VIP
文档评论(0)