- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VxWorks的内存分配机制
VxWorks的内存管理机制
VxWorks的内存管理函数存在于2个库中:memPartLib(紧凑的内存分区管理器)和memLib(完整功能的内存分区管理器)。memPartLib提供的工具用于从内存分区中分配内存块。该库包含两类程序,一类是通用工具memPart…(),包含创建和管理内存分区并从这些分区中分配和管理内存块;另一类是标准的malloc/free程序提供给内存分区的接口。memLib是memPartLib的扩展,提供内存管理功能,包括错误处理,按对齐分配和ANSl分配函数。在Vxworks中内存分区只能创建,不能删除。主要的操作函数有memPartCreate、memPartAddToPool、memPartAlignedAlloe、memPartAlloe、memPartFree、memAddToPool、malloc、free、calloc、cfree等。分配时可以要求一定的对齐格式,不同的CPU架构有不同的对齐要求。为了优化性能,malloc返回的指针是经过对齐的,为此的开销随架构不同而不同。例如,68k为4字节对齐,开销8字节;SPARC为8字节对齐,开销12字节;MIPS为16字节对齐,开销12字节;1960为16字节对齐,开销16字节。
内核负责为程序分配内存、动态分配内存和回收内存。VxWorks为用户提供两种内存区域:内存域region和内存分区partition,region是可变长的内存区,可以从创建的region中在分配段segment,region的特点是容易产生碎片,但灵活、不浪费,partition是定长的内存区,用户可以从创建的partition中分配内存块,或在某个内存分区中再创建一个内存分区。partition的特点是无碎片、效率高,但浪费。通常,VxWorks内核和应用程序对内存的操作是基于内存分区进行的。内存池是一块连续的内存区域,包含一个或多个内存块。内存分区包含分区自身的描述信息(一个结构体)和一个或多个内存池,描述信息保存在系统内存分区中,内存池是该分区实际拥有的内存空间。内存分区刚创建完毕时,只有一个内存池,以后用户程序可往该分区中添加内存池。内存池之间的地址不一定连续,VxWorks在启动过程中会创建一个包含系统内存池的系统内存分区。
系统内存分区(其中ID为memSysPartId)是一个全局变量,关于它的定义在memLib.h中)在内核初始化kernelInit() 时由usrRoot()(包含在usrConfig.c中)调用memInit创建。其开始地址为RAM中紧接着VxWorks的BSS段之后,大小为所有空闲内存。VxWorks运行时的内存布局如图1所示,LOCAL_MEM_LOCAL_ADRS为嵌入式系统内存的起点,一般为0,宏RAM_LOW_ADRS是VxWorks系统镜像的起点,而FREE_RAM_ADES为系统镜像的终点。Initial Stack这部分空间在加载VxWorks映像时由sysInit初始化,由usrInit使用。Initial Stack和RESERVED之间的内存区域通常用于存放中断向量表。WDB内存池用于VxWorks调试代理任务运行模块的动态加载。系统内存池是VxWorks和应用程序运行时可操作、使用的内存空间。应用程序可以根据需要、调用函数memPartCreate从系统内存池中创建新的内存分区。多数BSP都定义sysPhysMemTop()为物理RAM的结束地址,而sysMemTop()为系统内存池的结束地址,两者之差则为可配置的常数USER_RESERVED_MEM。这些宏都在板级支持包(BSP)中定义。
图1 VxWorks运行时内存布局
嵌入式系统中为任务分配内存空间有两种方式,静态分配和动态分配。静态分配为系统提供了最好的可靠性与实时性,如可以通过修改USER_RESERVED_MEM分配内存给应用程序的特殊请求用。对于那些对实时性和可靠性要求极高的需求,只能采用静态分配方式[4]。但采用静态分配必然会使系统失去灵活性,因此必须在设计阶段考虑所有可能的情况,并对所有的需求做出相应的空间分配,一旦出现没有考虑到的情况,系统就无法处理。此外静态分配方式也必然导致很大的浪费,因为必须按照最坏情况进行最大的配置,而在实际运行中可能只用到其中的一小部分。VxWorks 的内存管理采用自由链管理内存空闲块,采用首先适配算法动态分配内存。内存释放时,采用上下空闲区融合的方法,即把相邻的空闲内存块合并,没有清理碎片的功能。
一般系统中只有1个内存分区,即系统分区,所有任务所需要的内存直接调用malloc从其中分配。分配采用First-Fit算法(空闲内存块按地址大小递增排列,对于要求分配的分区容量size,从头开始比较
文档评论(0)