



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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,从头开始比较,直至找到满足大小size的块为止,并从链表相应块中分配出相应size大小的块指针),通过free释放的内存将被聚合以形成更大的空闲块。这就是VxWorks的动态内存分配机理。最先适应法具有搜索速度快,利于内存碎片合并的特点。另外,最先适应法尽可能利用低地址空间,从而保证高地址空间有较大的空闲区来放置内存要求较多的进程或作业。但是,使用动态内存分配malloc/free时要注意到以下几个方面的限制:(1)因为系统内存分区是一种临界资源,由信号量保护,使用malloc会导致当前调用挂起,所以它不能用于中断服务程序;(2)因为进行内存分配需要执行查找算法,其执行时间与系统当前的内存使用情况相关,是不确定的,所以对于有规定时限的操作它是不适宜的;(3)采用简单的最先匹配算法,容易导致系统中存在大量的内存碎片,降低内存使用效率和系统性能。 一般在系统设计时采用静态分配与动态分配相结合的方法。也就是说,系统中的一部分任务有严格的时限要求,而另一部分只是要求完成得越快越好。按照RMS(Rate Monotonic Scheduling)理论,所有硬实时任务总的CPU时间应小于70,这样的系统必须采用抢先式任务调度;而在这样的系统中,就可以采用动态内存分配来满足那一部分可靠性和实时性要求不那么高的任务。在VxWorks中,内存管理单元(MMU)的功能主要是由一些库函数来控制和实现的,这些库函数根据CPU的体系不同而不同。虚拟地址和物理地址之间的映射关系通过一个类型为PHYSMEM_DESC(定义于vmLib.h文件中)的结构体来实现:typedef struct phys_mem_descVoid* virtualAddr;Void* physicalAddr;UINT len;UINT initialStateMask;*mask parameter to vmStateSet*UINT initialState;*state parameter to vmStateSet*PHY_MEM_DESC;其中,virtualAddr表示映射后的虚拟内存空间的起始地址;physicalAddr表示被映射的物理内存空间的起始地址;initialState表示内存页面的状态;len表示映射内存的长度。由于内存映射是基于页面的,所以virtualAddr、physicalAddr、len必须是页面大小的偶数倍。下面是一个MMU配置示例:(void*)Ox2000000,(void*)0x2000000,0x20000,*initial state mask*MMU_ATTR_VALID_MSK | MMU_ATTR_PROT_MSK,*initial state*MMU_ATTR_VALID | MMU_ATTR_PRO_SUP_WRITE上面表示这一段内存起始于Ox2000000,可写。在VxWorks中,虚拟内存地址和物理地址是一一对应的关系,所以如果不考虑对特定内存区域设置写保护或高速缓存机制,则完全可以不使用虚拟内存。4 VxWorks的内存保护41 内存保护初始化内存保护初始化主要包括3个步骤:(1)初始化MMU。建立虚拟内存和实际内存页面对应关系的转化表,此时MMU功能还是关闭的,此后应用程序访问的内存均为虚拟内存;(2)初始化虚拟内存模块。该过程包括初始化页状态及页状态掩码转换表,设置虚拟内存库函数;(3)全局页面映射的初始化。该步骤创建系统全局的页面映射以及内核代码所需要的页面映射。内存保护初始化的流程如图3所示。42修改页状态每一个虚拟内存页都有一个或多个状态,分为有效无效、可写、可读、缓存不缓存等。页状态可以用函数vmStateSet()实现。在程序中,一个任务执行的所有数据都放在一个全局区域里。为了防止其他任务破坏该区域的数据,可以用钩子函数在任务切换之间设置页的状态,从而实现数据的保护。比如在进入任务时,把内存页面设置成MMU_ATTR_VALID,使该内存页有效,然后在离开任务时,把它设置为MMU_ATTR_VALID_NOT,从而使别的任务不能访问该页面。43锁定页表条目CPU执行机构在收到应用程序发来的虚拟地址后,首先到页表缓冲(TLB)中查找相应的页表条目,如果TLB中正好存放着所需要的页表条目,则称为TLB命中(TLB Hit),接下来CPU再看物理内存地址中的数据是不是已经在缓存里了,若没有则到内存中取相应地址所存放的数据。如果TLB中没有所需的页表,则成为TLB失败(TLB Miss),接下来就必须访问物理内存中存放的页表,同时更新TLB的页表条目。由此可见,TLB命中率越高,则CPU访问内存的速度就越快,系统性能也就越高。因此,在vxworks系统中,用函数vmPageLock()锁定用户频繁使用的页表条目,这样TLB的命中率显然会大大提高,但由于TLB的容量收到一定的限制,所有锁定太多的页表条目会导致剩下的页表条目的动态使用率降低。检测缓冲越界内存保护 也能用于检测代码编写中的缓冲越界错误。通过在一个缓冲区的两端申请“卫兵”页面,能使系统检测到这类错误。生成“卫兵”页面的方法是,首先,申请所要使用的缓冲区,该缓冲区应该是按页对齐的;然后,把申请到的缓冲区增大额外的相当于两页的大小,实际使用的缓冲区位于中间,其高端和低端各一页用来做“卫兵”页面;最后,把这两页“卫兵”页面用宏VM STATE SET和VMSTATE VALID NOT设成不可访问页。这样,任何对该缓冲两端的页
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢架桥维护施工方案
- 河床浇筑施工方案
- 恩施阳台假山施工方案
- 中央空调采购合同
- 施工单位岗位安全培训课件
- 施工单位安全培训考核课件
- 进口废塑料合同(标准版)
- 施工作业现场安全培训课件
- 2025房产买卖合同范文
- 2025【合同范本】标准债权转让合同协议书
- 山东省济南市2025届中考数学真题(含答案)
- 2025-2030农业传感器网络部署模式与精准农业实践案例
- 2024年绍兴职业技术学院军训动员大会校长发言稿9000字
- 接手烂尾项目的合同范本
- 物业客服人员培训
- 2025至2030年中国制药装备行业市场全景分析及投资前景展望报告
- 泌尿科膀胱灌注护理课件
- 2025北京京剧院招聘工作人员10人考试备考题库及答案解析
- 脊柱区课件教学课件
- 检修现场管理培训课件
- 村集体经济培训课件
评论
0/150
提交评论