




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 26卷vol126第 2期no12西 华 师 范 大 学 学 报( 自 然 科 学 版)journal of china westnormal university(natural sciences)2005年 6月jun12005文章编号: 100128220(2005)0220175205一种基于vxworks的内存管理封装层的设计与实现何先波(西华师范大学 计算机学院,四川 南充637002)摘 要 :根据特定应用领域对商用嵌入式操作系统进行封装是很有必要的.通信类产品应用程序的内存管理往往对性能与安全有特殊的要求,本文在vxworks提供的内存管理功能的基础上给出了一种封装方案:使
2、用块内存与堆内存两种分配与释放方式提高内存管理性能,增加调试信息;通过“加墙 ” 或“加页 ” 两种方式实现内存保护,使封装后的vxworks更适合通信产品应用领域的软件开发.关键词 :嵌入式操作系统;操作系统封装层;实时操作系统;内存管理;内存保护中图分类号: tp315文献标识码:b1 前 言目前,嵌入式软件在软件业中的比重正逐渐加大,所使用的操作系统一般是嵌入式实时多任务操作系统 . 嵌入式系统的硬件环境多样性、 硬软件紧密耦合性及严格的实时性等特点决定了所使用的操作系统不可能象un ix ,w i ndows等通用操作系统那样具有方方面面较强的功能.这使得针对特定领域的应用对选用的嵌入
3、式操作系统进行再封装成为必要. 所谓嵌入式操作系统的封装是指为了能缩短特定领域的嵌入式系统软件的开发周期,增强嵌入式操作系统功能和实现嵌入式程序的可移植性、 可维护性和代码继承性而对所使用的特定嵌入式操作系统的再“加工 ” . 针对许多商用实时操作系统核心部分源码的不开放性,封装层一般会对内存分配、 进程调度等核心功能进行重新定义和优化,使用户能跟踪到一些比较靠近内核的东西,可提供丰富的调试手段和实时监控功能,提高关键应用的效率,从而增强和丰富嵌入式操作系统功能.图1展示了封装层在嵌入应用软件系统中的位置(图中箭头表示软件设计中的引用方向). 下面基于vxworks 商用嵌入式操作系统以通讯类
4、嵌入式设备应用领域为背景来讨论嵌入操作系统封装层内存管理模块的设计方案与实现 .2vxworks操作系统提供的内存管理功能及不足vxworks内存分配与释放相应功能主要通过其mempartl ib库的 mempartcreate(产生内存新的内存分区 ) 、 mempartaddtopool(给指定内存分区增加内存)、 memparta lloc(从指定内存分区中分配一定大小的内存块 ) 、 mempartfree(释放内存给内存分区) 、 memaddtopool(给整个系统内存分区增加内存)以及malloc、 free收稿日期: 2005 - 02 - 19基金项目:国家863计划项目课题
5、(2002aa1z2306 )作者简介:何先波(1971 - ) ,男,四川苍溪人,西华师范大学计算机学院讲师,四川大学博士研究生,主要研究方向:计算机网络与嵌入式系统.? 1995-2005 tsinghua tongfang optical disc co., ltd. all rights reserved.176西华师范大学学报(自然科学版) 2005年等系统调用实现,其内存保护对硬件提供mmu 支持的可通过虚拟内存管理机制实现. 但是对通信类产品软件设计而言,vxworks存在一些需完善的地方:其一 ,对频繁的固定大小内存的分配与释放可考虑进一步提高性能 ;其二 ,应提供统一的内存保
6、护功能;其三 ,应提供内存资源使用管理情况的各种统计功能;其四 ,应提供更多的调试和维护信息. 针对这些需求,本文给出了对vxworks 内存管理功能封装的一种方式:块内存管理与堆内存管理.3vxworks内存封装设计与实现方案探讨3. 1 块内存管理嵌入式实时操作系统中的内存管理是保障应用实时性和可靠性的重要因素.在通信领域的应用中,内存申请往往呈现各种相同数据结构(即相同大小内存块)的大量申请现象. 为了提高内存管理的实时性能和可维护性 ,一般采用如图2所示的块内存管理方式:每个应用程序模块保留自己所需一块较大的内存区,再将该内存区划分为若干内存池.每个内存池由若干尺寸相同的内存块(u s
7、erblock下面也简称ub )组成 ,分配内存时,以固定大小块的方式分配给申请者,从而提高分配效率.通过 vxworks的系统调用mempartcreate可实现从系统中预留某模块所需的内存区,该区内存大小主要根据进一步需划分的内存池数及每种内存池中内存块大小及数量共同确定的.具体的划分方式主要根据大量特定应用领域程序的内存需求统计情况而定.如笔者所从事的通信产品应用领域的某模块的一种内存池划分为 : ( 64, 1200) , ( 128, 1000) , ( 256, 800) , ( 512, 500) , ( 1024, 20) , (2048, 10) , (4096, 5) ,
8、( 8192, 2) ,( 16384, 1) ,其中括号中前面数字表示以字节为单位的内存块尺寸,后面数字表示该内存池中内存块总数.3. 1. 1块内存管理方案实现所需的数据结构从具体实现的数据结构组织上考虑,为了弥补vxworks内存管理的不足,对于每种内存池及内存块,可分别用一结构类型来描述,分别称为内存池控制结构和内存块控制头(也称 ub 头 ). 当然 ,这样必然会额外占用部分内存,但是对许多通信产品而言,软件的规模不大,性能和安全才是首要问题.内存池控制结构可包含如下一些域:对应的内存块的大小,内存块总量,空闲内存块数,用于互斥操作该结构的信号量,存放用于指向池内所有内存头的指针数组
9、,用于实现内存块分配与释放的单循环队列(用静态链表实现,结点的信息域为指针数组的下标)及指示其队头与队尾的索引域,用于统计该内存池实际使用状况如内存块分配失败的次数、 内存块释放失败的次数、 重复释放内存块的次数、 曾经出现的分配峰值等等.所有的内存池结构实例可用一数组来登记. 同时 ,出于对关键数据保护的目的,管理内存池的结构数组最好与分配的内存块隔开.? 1995-2005 tsinghua tongfang optical disc co., ltd. all rights reserved.第 26卷第2期 何先波 :一种基于vxworks的内存管理封装层的设计与实现177池内每个内存
10、块可用称为内存头的数据结构来控制和描述,可包含如下一些信息:该块的内存地址(虚地址方式为加页保护后的虚拟地址,否则为分配给申请者的实际物理地址) ,避免重复释放用的占用标志,所属程序模块、 内存池(用于提高回收速率)及一些调试信息:如实际申请的内存大小,引发申请/释放该内存块的源程序语句所在文件及行号,申请 、 释放发生时的时间,申请者/释放者所属的进程名等等.3. 1. 2块内存的分配块内存的分配步骤为: 根据所申请的内存大小在对应的模块内存区中搜索到特定的内存池(为了提高查找速度,可建快速索引表). 通过内存池控制块的空闲内存块数的值判定该次操作是否能成功,如果没有空闲内存块,申请操作失败
11、,并记录下相应的调试信息(之所以不考虑向块内存更大的内存池申请,主要是从性能和节省内存的角度考虑) ,分配操作结束. 如果还有空闲内存块则找到该空闲块指针(对内存池控制结构的静态链表队列进行出队列操作,并对块控制头指针数组相应位置内容清空). 根据申请者等信息填写内存块控制头数据结构相应信息,并对池空闲内存块数减1. 将分配到的内存地址返回给申请者(该地址为块控制头内的块地址域值).3. 1. 3块内存的释放块内存释放是根据内存块的控制头将其标记为自由内存块并归还给相应缓冲池的过程.由于分配时构造了内存块控制头,内存释放相对简单和高效. 首先根据要释放的内存块指针找到控制头指针(块内存地址减去
12、内存块控制头字节数,如采取下文所用的保护“ 墙 ” 方式 ,还得减去“ 墙 ” 的“厚度 ” ) ,并检查该控制头中的地址域值和要释放的块地址是否相等,相等则说明是有效的释放指针,否则为无效. 接着修改内存块控制头的占用标志及一些调试信息域,通过该控制头找到内存块所在的内存池,并让该池空闲内存块数加1,最后进行入队列操作(内存池控制结构的静态链表队列进行入队列操作,并对池控制结构中的块控制头指针数组相应位置内容赋该空闲块控制头地址值).3. 1. 4块内存使用状况的统计有了上述的控制数据结构中的调试信息域及相应分配与释放操作,便于为上层提供较完善的调试信息,可输出以下调试信息:池号 ,该池内存
13、块大小,该池内存块总量,当前空闲内存块数量,申请不到该种大小内存块的次数,该种大小内存块已释放后被重复释放的次数,该种大小内存块的最大的消耗量,以及申请/释放时间 ,申请 /释放进程 ,该块的实际占用地址,申请 /释放操作所在的源程序文件及行数等等.3. 2 内存的保护内存保护主要有两种方式,不妨称之为 “ 加墙 ” 方式与 “加页 ” 方式 .3. 2. 1内存“加墙 ” 方式保护原理“ 加墙方式” 可检查内存在使用的过程中是否越界,可考虑在要保护的内存的头部或尾部(一般为尾部,因为在实际操作中对地址增加方向的操作概率要大一些,当然也可在头部和尾部同时进行)多添加一个或几个字节,并将这个字节
14、内容置为应用中一般不会出现的特殊数值.如果在内存归还的时候,发现这个字节内容已经变了,则说明对该块内存的操作已经越界了.如果在上述内存块管理方式中使用该方式,则在释放时还要进行越界检测.3. 2. 2内存“加页 ” 保护方式该种方式与硬件支持mmu 的通用操作系统的内存保护方式类似.它是在内存块或堆栈的附近(一般为尾部 )加上保护页,利用 mmu 的页表保护机制,将该保护页的属性设置为不可写或者不可转换. 一旦发生溢出 ,将马上会引起系统异常,从而保护了其它数据区内容不被破坏.对于使用虚地址方式内存块的保护,可这样实现:初始化时,在该内存块高端加一虚拟页,并让该块向高端靠齐 . 下图3用以说明
15、这种保护方式.由图3可知,返回给用户的内存块地址是0 x801fc0.若用户程序不慎操作了内存块外的地址如:0 x802100,则因为该段地址无效,立刻会报pagefault异常 .3. 2. 3两种保护方式的比较“ 加墙 ” 方法缺点是事先不能给予保护,只有在归还的时候才能检测到是否溢出了, 而这时, 相邻的数据块的信息有可能已被破坏了.? 1995-2005 tsinghua tongfang optical disc co., ltd. all rights reserved.178西华师范大学学报(自然科学版) 2005年 “ 加页 ” 方式 ,克服“ 加墙 ” 方式检测的 “事后性
16、” 不足 ,但其需要硬件支持,并且由于页表的存在对性能有所影响,并造成较大的内存浪费(要求被保护的内存页对齐) ,该种方式更适合较大内存块的保护.3. 3 堆内存区管理块内存管理对频繁申请固定大小内存分配与释放提高了性能,但实际应用中也得考虑非定长内存分配与释放 ,对这种情况可用堆内存区管理的方式来实现.3. 3. 1堆内存分配堆内存分配实际上是对原vxworks内核内存分配函数memparta lloc的一个封装,增加的调试信息附在被分配内存区的头部(不妨称为堆控制头) ,可包括如下一些信息:申请获得的地址,获取该内存空间的时间 ,申请该段内存的进程名,用户请求的内存大小,申请该段内存的操作
17、所在的源程序文件名,行数 ,该段内存是否被破坏等等.要分配的实际内存大小包括调试信息头及为实现内存保护的一定字节量“ 保护墙 ” (如果采用 “ 加墙 ” 的内存保护方式,可采取前后都添加一定的字节空间的“ 前后墙 ” 方式 ) ,因此堆分配的封装实现为:memparta l2loc (partid,用户申请内存大小+堆控制头大小+ “前后墙 ” 所占用的内存大小) ,实际返回给申请者的地址为memparta lloc返回地址+堆控制头调试头大小+“ 前墙 ” 尺寸 ,分配成功的同时需填写堆控制头中的相关调试统计信息 .图 4显示了墙厚度为8字节的堆分配情况(pbuf为申请者可用内存的起始地址
18、) :3. 2. 2堆内存释放堆方式的内存释放,也是对原来vxworks 函数提供的mempartfree( void 3 pblock)函数的一个简单封装,不过由于控制头和“ 保护墙 ” 的存在,使用mempartfree时应为mempartfree(pblock - sizeof(控制头)-前墙尺寸) ,同时要检查该堆前后的“保护墙 ” 有无操作溢出,并填写控制头中的相关调试统计信息,最后将要释放的指针pb lock置为一无效值.3. 3. 3堆内存调试信息查询通过利用原vxworks内存分配机制及堆控制头的相关调试统计信息域可用于查询以下一些信息:申请时间 、 申请进程 、 占用地址 、
19、 申请大小 、 申请行数 、 申请文件等等.3. 3. 4堆使用情况统计如果要进行堆使用情况的统计,则需一用于统计所有堆分配释放情况的全局性数据结构. 该结构包含诸如堆分配/释放失败的次数、 曾经出现的分配峰值、 当前的分配值等等,在堆的分配和释放时同时填写相应的统计域 . 这样 ,在需要时 ,可输出相应的统计信息.? 1995-2005 tsinghua tongfang optical disc co., ltd. all rights reserved.第 26卷第2期 何先波 :一种基于vxworks的内存管理封装层的设计与实现1794 小 结基于 vxworks内存分配功能的块内存分
20、配与堆内存分配封装方式在一定程度适应了通信产品应用领域对内存管理性能和安全的要求,实际的软件开发实践也证明了其有效性.但不同的嵌入式应用领域有不同的性能要求,如有的应用把节省内存作为首要考虑因素,本文给出的封装方式显然是不适用的.参考文献 : 1 汤子瀛,哲凤屏,汤小丹.计算机操作系统m .西安:西安电子科技大学出版社, 1996. 2(美) way ne w.嵌入式计算系统设计原理m .北京:机械工业出版社, 1998. 3jean j l.嵌入式系统构件m .北京:机械工业出版社,2002. 4ke ijro a,zengo f, jingde c.a general framework
21、for debugging j . ieee software, 1991: 14 - 20. 5rudolphe s . a knowledge based program debugging system s j .ieee software, 1987, 20 - 23. 6 何先波,钟乐海,芦冬昕.嵌入式操作系统封装层的设计与实现 j .计算机应用, 2003, 23 (5) : 89 - 91.design and implementati on of the encapsulated layeron m emory management based on vxw orkshe xian2bo( computer college, china w est normal university, nanchong 637002,china )abstract:encapsulation basedon commercial embeddedoperating syste m in specific application field is very neces 2sary . comparatively, the performance and safetyof memory management in the progra m design of commu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 明确目标的多媒体应用设计师考试试题及答案
- 学习评估标准初级社会工作者试题及答案
- 社会服务设计与评估试题及答案
- 2025年设计师考试新规解读试题及答案
- 烟叶分级考试试题及答案
- 最行食安法测试题及答案
- 2025年软件评测师考试的知识面扩展建议试题及答案
- 房山严守卡口管理制度
- 杭州小学封闭管理制度
- 批发企业账务管理制度
- 军队食堂管理员岗位职责
- 25学年四年级数学下期末复习每日一练
- 2024年江苏省无锡市中考历史真题(原卷版)
- 金矿合作协议书
- 人教版三年级数学下册100道口算题大全(全册)
- 2025年中国电瓷器材市场调查研究报告
- 2025年中国茴香市场现状分析及前景预测报告
- 电商直播对消费者购买行为影响的实证研究
- 历年高考数列试题及答案
- 《ISO 37001-2025反贿赂管理体系要求及使用指南》专业解读和应用培训指导材料之8:10改进(雷泽佳编制-2025A0)
- 保安队长考试试题及答案
评论
0/150
提交评论