一种VxWorks内存管理方案

上传人:d**** 文档编号:181396040 上传时间:2023-01-13 格式:DOCX 页数:7 大小:48.70KB
收藏 版权申诉 举报 下载
一种VxWorks内存管理方案_第1页
第1页 / 共7页
一种VxWorks内存管理方案_第2页
第2页 / 共7页
一种VxWorks内存管理方案_第3页
第3页 / 共7页
资源描述:

《一种VxWorks内存管理方案》由会员分享,可在线阅读,更多相关《一种VxWorks内存管理方案(7页珍藏版)》请在装配图网上搜索。

1、一种VxWorks内存管理方案摘要:探讨嵌入式开发对内存管理的基本要求、嵌入式开发内存管理的关键问题以及给出一种VxWorks内存管理方案,即把除VxWorks系统保留内存以外的内存分为三种类型进行管理:固定大小的缓冲池、动态可变的堆以及由各种固定大小的缓冲区组成的队列。目前,针对有内存管理单元MMU(MemoryManagementUnit)的处理器设计的一些桌面操作系统,如Windows、Linux,使用了虚拟存储器的概念。虚拟内存地址被送到MMU映射为物理地址,实际存储器被分割为相同大小的页面,采用分页的方式载人进程。大多数嵌人式系统针对没有MMU的处理器设计,不能使用处理器的虚拟内存管

2、理技术,而采用实存储器管理策略。因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际物理地址;而且,大多数嵌人式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载人主存储器的连续空间。由此可见,嵌人式系统的开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存;在开发应用程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外,由于采用实存储器管理策略,用户程序同内核以及其他用户程序在一个地址空间,程序开发

3、时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其他程序的运行异常;因而,嵌人式系统的开发人员对软件中的一些内存操作要格外小心。1嵌入式系统中对内存分配的要求嵌人式系统开发对内存分配有很高的要求: 内存能快速申请和释放,即快速性。嵌人式系统中对实时性的保证,要求内存分配过程要尽可能地快;内存分配保持原子性,即可靠性。也就是内存分配的请求必须得到满足,如果分配失败可能会带来灾难性的后果;内存应该各尽其用,即高效性。内存分配要尽可能地少浪费。不可能为了保证满足所有的内存分配请求而将内存配置得无限大。2VxWorks内存管理机制VxWorks采用用户程序、内核处于同一个地

4、址空间的内存管理策略,软件开发人员在开发程序时必须保证不侵犯其他程序和内核的地址空间,以免破坏系统的正常工作或导致其他程序异常运行。内核负责为程序分配内存、动态分配内存和回收内存。VxWorks为用户提供两种内存区域:内存域region和内存分区partitionregion是可变长的内存区,可以从创建的region中在分配段segment,region的特点是容易产生碎片,但灵活、不浪费;partition是定长的内存区,用户可以从创建的partition中分配内存块或在某个内存分区中再创建一个内存分区,partition的特点是无碎片、效率高,但浪费。通常,VxWorks内核和应用程序对内

5、存的操作是基于内存分区进行的。内存池是一块连续的内存区域,包含一个或多个内存块。内存分区包含分区自身的描述信息(一个结构体)和一个或多个内存池,描述信息保存在系统内存分区中,内存池是该分区实际拥有的内存空间。内存分区刚创建完毕时,只有一个内存池,以后用户程序可往该分区中添加内存池。内存池之间的地址不一定连续,VxWorks在启动过程中会创建一个包含系统内存池的系统内存分区,如图1所示。VxWorks的内存管理采用自由链管理内存空闲块。用首先适配算法动态分配内存,内存释放时,采用上下空闲区融合的方法,即把相邻的空闲内存块合并,没有清理碎片的功能。USER_HESERVEDMEMSyleinMeu

6、kuryPi说WDB_POOLSIZEVxWttrkNitApplicdiioii(也12讥亡工tJ阳砧IidtiglSuckRESERVED*lucdlmcni_sizfsy&MemToPO_d.d阳图】ViWarksF*1存布為3对VxWorks内存管理的改进改进的缓冲区管理模块的作用在于加强VxWorks实时操作系统对内存的管理,并为上层应用程序提供所需内存申请和释放工作。因此本改进模块位于VxWorks实时操作系统模块和应用程序模块之间。CPU实际物理内存在bootRoom启动时划分为两部分:VxWorks内核操作系统内存和保留给用户管理的内存。为了便于管理,对为用户保留内存作进一步划

7、分,使用memPartCreate函数创建两个内存分区:一个分区用来生成预先申请好固定大小缓冲池;另一分区以堆方式向上层提供的缓冲池。这样就把物理内存划分成3个部分:(1) Paal:VxWorks系统内存,在物理低端;Part2:预先申请好的固定大小的缓冲池,每种固定长度的内存缓冲区形成一个队列;Pan3:以堆方式提供给上层应用程序的缓冲池;内存划分如图2所示。Vkworks累统内存车同大甬固定烷度缓冲池1Parti1Pur和3mentTop特理內存的珈分3.1不同大小固定长度缓冲区管理为了避免内存碎片,我们采用预先分配内存块的方式实现对堆内存分区进行管理:分区内的所有内存队列,每个队列管理

8、一定数量大小相同且已经申请好的内存块,这些内存块永久占用。然后对每个内存队列管理数据结构进行维护。上层应用程序调用模块接口函数从缓冲池中申请和释放。每块缓冲区的用户区填充默认内容。3.2堆方式内存的管理对于堆内存的使用,我们对VxWorks的两个内核函数memPartAlloc()和memPartFree()进行了圭寸装,并在调试版本中加入信息,如图3所示。图中:BLOCK-HDR表示内存块头,OAHEAD表示块附加信息头,pbuf指向实际的堆空间,size为堆的大小。1pBufOAHEADnize图3堆结构3.3快速内存分配管理对于协议等存在大量、快速地申请/释放内存的操作而言,在系统运行一

9、段时间后内存都变成了碎片,再申请大块内存时容易失败。提供一种快速的内存申请/释放的方式,并且最大程度地减少系统的内存碎片。提供64/128/524288大小的内存使用快速内存分配管理机制,则在一个大的内存块内部进行内存使用,申请/释放时不涉及到系统对内存的拆链/建链过程,比较快速,并且对释放的内存进行合并,保证系统有尽可能多的大块内存。如图4所示。4小结许多嵌入式应用开发在实时操作系统提供的malloc()和free()函数的基础上编写自己的内存管理方案。编写这样的内存管理方案,一方面可以减少对malloc()和free()函数的依赖,统一内存应用接口,从而避免此之带来的内存碎片、时间不确定等

10、缺点,另一方面可以增强程序的查错能力,减少内存使用错误。对于在嵌入式系统中广泛存在的数据库类型的内存需求,把由用户管理的内存分为固定大小的缓冲区、以堆方式分配的缓冲区和不同固定大小内存队列的分配方式,体现了内存管理的优越性register关键字(转)Register修饰符暗示编译程序相应的变量将将被频繁使用,如果可能的话,应将其保存在CPU的寄存器中,以指加快其存取速度。但是,使用register修饰符有几点限制。首先,register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小於或等於整型的长度。但是,有些机器的寄存器也能存放浮点

11、数。其次,因为register变量可能不存放在内存中,所以不能用取址符运算符“&”来获取取址符运算符“&”register变量的地址。如果你试图这样做,编译程序就会报告这是一个错误。register变量修饰符的用处有多大还受其它一些规则的影响。因为寄存器的数量是有限的,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此,真正能起作用的register修饰符的数目和类型都依赖於运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。那麽,甚麽时候使用register变量修饰符呢?回答是,对现有的大多数编译程序来说,永远不要使用register变量修饰符。早期的C编译程序

12、不会把变量保存在寄存器中,除非你命令它这样做,这时register变量修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译程序能必程序员作出更好的决定。实际上,许多C编译程序会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。省去了内存与CPU的数据交换过程,直接使用CPU的内部寄存器。li8_19.c说明:(1)只有局部变量和形参可以作为register变量,全局变量不行。(2)80x86系列CPU最多可使用的register变量数目有限。int型可使用8个通用寄存器。实际上有些系统并不把registe

13、r变量存放在寄存器中,而优化的编译系统则可以自动识别使用频繁的变量而把他们放在寄存器中,因此用register声明变量实际上是不必要的。我们只需要知道有这么一种变量即可。3)静态变量不能定义为register。【转】C/C+中涉及存储方式的关键字:auto,static,register,externauto关键字:auto对象和变量被存储在栈中,它的生命周期仅存在于它的声明所在的块(block)中。在块中定义的块如果不加其它的修饰符则都是auto类型的。auto关键字可以省去。auto对象和变量对外部模块都是不可见的。static关键字:它是C,C+中都存在的关键字,它主要有三种使用方式,其

14、中前两种只指在C语言中使用,第三种在C+中使用。(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数下面就这三种使用方式及(14)馐孪罘直鹚得鳎?br、局部静态变量与auto类型(普通)局部变量相比,static局部变量有三点不同:1. 存储空间分配不同,auto类型分配在栈上,属于动态存储类别,占动态存储区空间,函数调用结束后自动释放;而static分配在静态存储区,在程序整个运行期间都不释放。两者之间的作用域相同,但生存期不同。2. static局部变量在所处模块的初次运行时进行初始化工作,且只初始化一次。对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符;而a

15、uto类型的初值是不确定的。(对于C+中的class对象例外,class的对象实例如果不初始化,则会自动调用默认构造函数,不管是否是static类型)二、外部静态变量/函数在C中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了限制全局变量/函数的作用域,函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时,对于外部(全局)变量,不论是否有static限制,它的存储区域都是在静态存储区,生存期都是全局的。此时的static只是起作用域限制作用,限定作用域在本模块(文

16、件)内部。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。三、静态数据成员/成员函数(C+特有)C+重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。这是与普通成员函数的最大区别,也是其应用所在。比如在对某一个类的对象进行计数时,计数生成多少个类的实例,就可以用到静态数据成员。在这里面,static既不是限定作用域的,也不是扩展生存期的作用,而是指示变量/函数在此类中的唯一性。这也是“属于一个类而不是属于此类的任何特定对象的变量和函数”的含义。因为它是对整个类来说是唯一的,因此不可能属

17、于某一个实例对象的。(针对静态数据成员而言,成员函数不管是否是static,在内存中只有一个副本,普通成员函数调用时,需要传入this指针,static成员函数调用时,没有this指针)不能将union成员声明为static的,然而,对于全局的匿名union,必须显式的声明为static。register关键字:只有函数参数和局部变量可被声明为register。意思是,在可能的情况下,该变量被存储在CPU寄存器中。register变量和auto变量一样,它的生命周期只维持在它所声明的块中。编译器并不赞成程序员指定register变量。实际的情况是,编译器会根据全局优化的需要自动决定是否采用re

18、gister类型。extern关键字:extern用在声明语句中表示该对象或变量是在其它编译单元中(不能说是其它文件,因为有些文件,如头文件不是编译单元)定义的;如果用在定义语句中,表示该变量对外部可见。注意extern与#include作用的区别:例1,使用extern:/out.hinta=10;/out.cpp#includeout.h/example.cpp#includeusingnamespacestd;externinta;int_tmain(intargc,_TCHAR*argv)couta=aendl;system(pause);return0;编译链接流程:由于out.cp

19、p文件引用了out.h文件,所以out.cpp文件的内容变成了inta=10;,编译时生成编译单元out.obj(out.o),其中定义了变量a。example.cpp文件中出现了对a的引用couta二aendl;,但该文件中没有a的定义(externinta;只是一个声明),而且包含的头文件中也没有,但是由于有声明externinta;,表明a是在其它编译单元中定义的,编译不出错。最后链接器在编译单元out.obj(out.o)中找到a的定义,建立连接关系,生成最后的exe文件。该工程中有两个编译单元,最后链接成一个exe文件。例2,使用#include:/out.hinta=20;/exa

20、mple.cpp#includeout.h#includeusingnamespacestd;int_tmain(intargc,_TCHAR*argv)couta=aendl;system(pause);return0;编译链接流程:example.cpp文件中出现了对a的引用couta二abiggest)biggest=curr;returnbiggest;在C+类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。类的静态成员变

21、量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。如,floatSavingsAccount:currentRate=0.00154;(注:currentRate是类SavingsAccount的静态成员变量)register用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对32位编译器不起作用,当globaloptimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对32位编译器有效。auto它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量

22、声明(如for循环体内的变量声明)默认为auto存储类型。extern声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。在C+中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前MicrosoftC/C+仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:extern“C”声明语句extern“C”声明语句块volatile限定一个对象可被外部进程(操作系统、硬件

23、或并发线程等)改变,声明时的语法如下:intvolatilenVint;这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。只常用于像中断处理程序之类的异步进程进行内存单元访问。constconst所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。在C+中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量,如constintmaxarray=255;charstore_charmaxarray;/C+中合法,C中不合法const修饰指针时要特别注意。例:char*constaptr=mybuf;/常量指针*aptr=a;/Legalaptr=yourbuf;/Errorconstchar*bptr=mybuf;/(指针bptr)指向常量数据*bptr=a;/Errorbptr=yourbuf;/Legalconst修饰成员函数时不能用于构造和析构函数。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!