您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 移动_黄烨明_基于VxWorks的内存管理和一个内存泄漏查找实例
1基于VxWorks的内存管理和一个内存泄漏查找实例本文主要分三部分,第一章介绍基于VxWorks的内存管理的主要内容,第二章介绍应用在ZXWRNB01产品软件设计中OSS的内存管理方法,第三章介绍实际应用中一个内存泄漏查找的实例。Chapter1基于VxWorks的内存管理一、综述对于一个采用了VxWorks操作系统的主处理器构成的系统,主内存的管理机制主要由BSP来实现,包括内存的初始化和内存的访问接口;主内存的初始化由romInit()实现,总线访问(对设备而言)在sysHwInit()中初始化;BSP对内存访问的支持和管理策略:主内存的配置对MMU的虚拟映射Cache策略内存探针BSP的硬件寄存器在sysHwInit中初始化,通常的设备(串口除外)寄存器当设备初始化时被初始化;为调示方便,在BSP开发期间禁止cache和MMU直到以下的情况实现:内核被成功的激活驱动器经过测试二、内存配置BSP负责配置主内存来实现快速的内核操作一些关键地址必须被定义如果使用MMU,必须定义内存映射提供支撑程序内存地址的定义在以下的文件中:-----config.h-用户可配置的-----bsp.h-由目标板配置,非用户使用BSP提供的内存函数:sysMemTop()、sysNvRamSet()、sysNvRamGet()2上图代表了下载的镜像被重定位后的RAM的分区;一个WDB代理内存池仅仅当与VxWorks镜像一起的Tornado工具被使用时才需要;用户保留内存是不被VxWorks的程序所访问的。char*sysMemTop(void)函数返回系统内存的首地址,代码在sysLib.c中;宏USER_RESERVED_MEM定义了不被VxWorks程序访问的用户保留内存的大小如果BSP不支持可选函数sysPhyMemTop(),由LOCAL_MEM_LOCAL_ADRS+LOCAL_MEM_SIZE替代。内存的自动分区允许在初始化时配置物理内存的大小,如果自动分区功能没有激活,物理内存的大小由config.h中的LOCAL_MEM_SIZE静态定义;3自动分区的具体细节是根据系统的不同而异的,典型的有:当DRAM在romInit()中被初始化时,配置信息存储在内存的控制寄存器或/和软件结构中;在分区时,配置信息被读取来计算所有物理内存的大小。支持自动分区的函数是sysPhysMemTop():char*sysPhysMemTop(void)函数返回的是物理内存的首地址;如果LOCAL_MEM_AUTOSIZE在config.h中被定义,该函数可提供动态的内存分区;BSP对自动分区的支持是可选的,如果参考BSP的代码没有静态的修改,被定义的缺省值将被返回;SysPhysMenTop()是由sysHwInit()函数调用的:该函数必须在KernelInit()之前,也就是sysMemTop被调用时。内核激活的调用:所有的BSPs必须有NVRAM接口即使在目标环境中没有非易失RAM,接口必须支持:sysNvRamSet()、sysNVRamGet()所有NVRAM的大小必须在config.h中定义为NV_RAM_SIZE的大小,如果没有NVRAM则定义为NONE;如果提供了,NVRAM用于存储可下载的镜像的启动参数;缺省配置在NVRAM的开头保留了255个字节用于启动参数的存储;缺省的启动参数在config.h中定义并静态连接到可下载的VxWorks的镜像中,缺省条件下是没有NVRAM的;NVRAM为启动参数分配的大小和定位在configAll.h中定义:BOOT_LINE_SIZE定义NVRAM为启动参数保留的大小,缺省为255字节;NV_BOOT_OFFSET定义了启动参数在NVRAM中的首地址,缺省为0;为覆盖缺省值,在config.h中重定义宏。set/getNVRAM的程序部分驱动器在../src/drv/mem目录下,如果没有NVRAM使用../src/drv/mem/下的4nullNvRam.c,该程序包含在sysLib.c中。NVRAM支持的函数:STATUSsysNvRamSet(string,strLen,offset)STATUSsysNvRamGet(string,strLen,offset)三、MMU机制MMU主要是受系统库的控制,BSP则负责提供对物理内存描述符的支持:由MMU使用的物理内存描述符用来创建与虚拟地址空间的初始映射;缺省的映射是平滑的,一对一的在物理和虚拟内存空间的映射。MMU由tUsrRoot任务调用usrMmuInit()进行初始化和使能首先初始化系统内存池的设置;其次是MMU的初始化;MMU的支持可提供基本级别或通过可选产品VxVMI两种,本章主要讨论基本级:对基本的MMU支持,宏INCLUDE_MMU_BASIC必须在config.h中被定义;UsrMmuInit()的代码在../src/config/usrMmuInit.c中初始的(静态的)物理内存映射定义在sysLib.c中,是定义在../h/vmLib.h中一个结构数组SYS_PHYS_MEM_DESC:映射的状态有:有效或无效、可写或不可写、可高速缓存或不可高速缓存虚拟-物理的映射举例:5由结构库使用的配置宏用于初始化MMU的转换表;配置宏在../h/vmLib.h中定义修改物理-虚拟内存的映射:修改sysPhysMemDesc[](静态映射),调用vmBaseStateSet()(动态修改);映射到一个页面的内存:页面的大小由宏VM_PAGE_SIZE在configAll.h中定义的,缺省为8k(对PowerPC结构是4K),对sysPhysMemDesc[]映射的长度应该是页面大小的整数倍;每一张表的入口都需要一个物理内存的页表入口:为能定义多少地址映射设置一个上限;一些MMU也应该限制有多少内存能被映射,参考硬件的文档。虚拟内存映射必须映射所有的可被访问的物理内存,包括被映射的设备内存(Ethernet,SCSI,etc);当MMU使能时,对非虚拟-物理映射的地址进行写操作时会导致总线错误;通常虚拟-物理映射的配置有:LocalRAM-有效、可写、可高速缓存ROM-有效、只读、经常高速缓存Flash-有效、可写、非高速缓存I/O设备-有效、可写、非高速缓存脱离目标板的内存-有效、可写、非高速缓存可编程Flash需要直接访问因此不能被高速缓存,但如果flash是只读的就可以被高速缓6存;STATUSvmBaseStateSet(context,pVirtual,len,stateMaskstate)Context:映射的上下文,变量类型:VM_CONTEXT_ID;Pvirtual:被修改状态的虚拟地址,变量类型:void*;Len:映射的长度,变量类型:int;StateMask:Unsignedint;State:Unsignedint该函数改变了一块虚拟内存的状态:用于改变由sysPhysMemDesc[]定义的初始内存映射;函数的第一个参数为NULL时表示指示的是当前的context;虚拟映射对基本级的MMU是全局的,对于构造和管理私有context的信息请参照VxVMI;四、速缓存Cache机制在VxWorks中,如果MMU使能,Cache就在MMU的控制下;系统库(cacheLib)中提供基本的cache管理支持,其中BSP的主要功能:选择合适的cache库和模式执行多个cache的操作;如果MMU使能,内存映射将被标识是否被cacheable;遵循设备驱动器的cache策略,对BSP控制的系统设备进行操作;STATUScacheLibInit(intMode,dataMode)IntMode定义指令cache的模式,类型:CACHE_MODEDataMode定义数据cache的模式,类型:CACHE_MODE初始化cacheLib机制:调用结构定义的初始化函数;置cache为静态;在sysHwInit()运行之前由usrInit()调用。参数用来定义指令/数据caches的模式CACHE_MODE在../h/cacheLib.h中声明Cache的模式配置宏:USR_I_CACHE_MODE,USR_D_CACHE_MODE7对cache模式配置的宏的确省值在configAll.h中定义。如果需要则在config.h中重新定义:对指令和数据的缺省模式是writethroughcache模式由具体的cache库用来配置合适的cache硬件如果目标板支持多cache的操作,BSP负责选择恰当的库package:MACRO_ARCH_MULTIPLE_CACHELIB必须在../h/arch/someArch/archsomeArch.h中定义为TRUE或FALSE;如果为TRUE则通过声明和初始化sysLib.c和config.h中的sysCacheLibInit提供正确的cache初始化;FUNCPTRsysCacheLibInit=(FUNCPTR)cacheXLibInit;对于L2cache,BSP需要提供单独的cache管理库:系统支撑决定_ARCH_MULTIPLE_CACHELIB是否定义为TRUE,BSP并不控制;STATUScacheEnable(cache)cache:CACHE_TYPE使能特定的cache类型:指令、数据或者分支要使用特定系统的函数;必须undefineconfig.h中的宏来禁止:INCLUDE_CACHE_SUPPORT为任何cache的类型;USER_I_CACHE_ENABLE为指令Cache;USER_D_CACHE_ENABLE为数据Cache;USER_B_CACHE_ENABLE为分支Cache在usrInit()中被调用,在KernelInit()调用之前;缺省的所有Cache类型在configAll.h中定义;CACHE_TYPE结构在../h/cacheLib.h中声明;8Cache类型定义在../h/cacheLib.h中对管理有效访问设备的代码不论设备是否独立于BSP要保持cache与DMA设备和硬件寄存器的一致性管理设备内存访问方法防止RISC处理器的指令的无序操作使用cacheLib实行期望的cache管理为cache分配安全的缓冲区为一个驱动器(系统设备或BSP独立的设备驱动器)分配属性并且申请执行方法一些系统具有特殊的cache库,具体可参见VxWorksReferenceManual对设备cache的管理机制与被分配的可由设备访问的内存大小有关可由设备访问的被分配的内存使用:cacheDmaMalloc(),malloc和memalign,数据段和堆栈段内存,系统区外的特殊内存区,未知的分配方法设备寄存器内存:如果内存被映射,将使用上述方法中的一种被分配;如果内存没有映射,将不被高速缓存;void*cacheDmaMalloc(bytes)bytes:分配的字节数,变量类型:size_t函数为DMA设备分配了cache-aligned,cache-safe的缓冲区,返回内存的首地址9cache对通过cacheDmaMalloc()分配的内存的一致性管理是依赖于MMU是否使能如果MMU使能,被分配的内存被标为non-cacheable如果MMU不被使能,刷新和禁止的宏代码调用必须插入代码cacheLib通过CACHE_FUNCS和CACHE_LIB结构(见。。/h/cacheLib.h)来管理刷新、禁止和其他的宏程序,例如:宏代码使用CACHE_FUNCS和CACHE_LIB结构中的程序指针,例:通常情况下,如果一个特定的宏程序是一个no-op,它的CACHE_FUNCS和CACHE_LIB结构中的程序指针为NULL:所有的探查、刷新和禁止函数被设置为NULL;宏程序被分为两组
本文标题:移动_黄烨明_基于VxWorks的内存管理和一个内存泄漏查找实例
链接地址:https://www.777doc.com/doc-2237502 .html