移動(dòng)_黃燁明_基于VxWorks的內(nèi)存管理和一個(gè)內(nèi)存泄漏查找實(shí)例_第1頁(yè)
移動(dòng)_黃燁明_基于VxWorks的內(nèi)存管理和一個(gè)內(nèi)存泄漏查找實(shí)例_第2頁(yè)
移動(dòng)_黃燁明_基于VxWorks的內(nèi)存管理和一個(gè)內(nèi)存泄漏查找實(shí)例_第3頁(yè)
移動(dòng)_黃燁明_基于VxWorks的內(nèi)存管理和一個(gè)內(nèi)存泄漏查找實(shí)例_第4頁(yè)
移動(dòng)_黃燁明_基于VxWorks的內(nèi)存管理和一個(gè)內(nèi)存泄漏查找實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、基于 VxWorks 的內(nèi)存管理和一個(gè)內(nèi)存泄漏查找實(shí)例本文主要分三部分,第一章介紹基于 VxWorks 的內(nèi)存管理的主要內(nèi)容,第二章介紹應(yīng)用在ZXWR NB01產(chǎn)品軟件設(shè)計(jì)中 OSS的內(nèi)存管理方法,第三章介紹實(shí)際應(yīng)用中一個(gè)內(nèi)存泄漏查找的 實(shí)例。Chapter 1 基于 VxWorks 的內(nèi)存管理一、綜述BSP對(duì)于一個(gè)采用了 VxWorks 操作系統(tǒng)的主處理器構(gòu)成的系統(tǒng),主內(nèi)存的管理機(jī)制主要由 來(lái)實(shí)現(xiàn),包括內(nèi)存的初始化和內(nèi)存的訪問(wèn)接口;主內(nèi)存的初始化由 romInit() 實(shí)現(xiàn),總線訪問(wèn)(對(duì)設(shè)備而言)在 sysHwInit() 中初始化;BSP對(duì)內(nèi)存訪問(wèn)的支持和管理策略:主內(nèi)存的配置對(duì)MMU勺虛

2、擬映射Cache策略內(nèi)存探針BSP的硬件寄存器在 sysHwl nit中初始化,通常的設(shè)備(串口除外)寄存器當(dāng)設(shè)備初始化 時(shí)被初始化;為調(diào)示方便,在 BSP開(kāi)發(fā)期間禁止cache和MMUC到以下的情況實(shí)現(xiàn): 內(nèi)核被成功的激活驅(qū)動(dòng)器經(jīng)過(guò)測(cè)試二、內(nèi)存配置BSP負(fù)責(zé)配置主內(nèi)存來(lái)實(shí)現(xiàn)快速的內(nèi)核操作一些關(guān)鍵地址必須被定義如果使用MMU必須定義內(nèi)存映射提供支撐程序內(nèi)存地址的定義在以下的文件中:config.h- 用戶可配置的.h- 由目標(biāo)板配置,非用戶使用BSP提供的內(nèi)存函數(shù): sysMemTop()、sysNvRamSet()、sysNvRamGet()RAM Layout*一 LO CAL_MEM_L

3、OCAL_ADR SInitial Stack19RAI1_LOW_ADRSWDB PoolVxWorksFREE_RAM_ADRS +SystemMemory PoolWDB_POOL_SIZEUser ReservedsysMeinTopf)sysP/iysf phi TopO上圖代表了下載的鏡像被重定位后的 RAM的分區(qū);一個(gè) WDB弋理內(nèi)存池僅僅當(dāng)與 VxWorks鏡像一起的Tornado工具被使用時(shí)才需要;用戶保留內(nèi)存是不被VxWorks的程序所訪問(wèn)的。Top of System Memorychar * sysMemTop(void)函數(shù)返回系統(tǒng)內(nèi)存的首地址,代碼在 sysLib.

4、c中;宏USER_RESERVED_M定義了不被VxWorks程序訪問(wèn)的用戶保留內(nèi)存的大小如果 BSP 不支持可選函數(shù) sysPhyMemTop(),由 LOCAL_MEM_LOCAL_ADRS+ LOCAL_MEM_SIZE 替代。Memory Autosizing內(nèi)存的自動(dòng)分區(qū)允許在初始化時(shí)配置物理內(nèi)存的大小,如果自動(dòng)分區(qū)功能沒(méi)有激活,物理內(nèi)存的大小由 config.h 中的LOCAL_MEM_SIZ靜態(tài)定義;自動(dòng)分區(qū)的具體細(xì)節(jié)是根據(jù)系統(tǒng)的不同而異的,典型的有:當(dāng)DRAM在 romInit()中被初始化時(shí),配置信息存儲(chǔ)在內(nèi)存的控制寄存器或/和軟件結(jié)構(gòu)中;在分區(qū)時(shí),配置信息被讀取來(lái)計(jì)算所有物

5、理內(nèi)存的大小。支持自動(dòng)分區(qū)的函數(shù)是 sysPhysMemTop(): char * sysPhysMemTop(void)函數(shù)返回的是物理內(nèi)存的首地址;如果LOCAL_MEM_AUTOSI在Econfig.h 中被定義,該函數(shù)可提供動(dòng)態(tài)的內(nèi)存分區(qū);BSP對(duì)自動(dòng)分區(qū)的支持是可選的,如果參考BSP的代碼沒(méi)有靜態(tài)的修改,被定義的缺省值將被返回;SysPhysMenTop()是由sysHwInit() 函數(shù)調(diào)用的: 該函數(shù)必須在 KernelInit() 之前,也就是 sysMemTop被調(diào)用時(shí)。內(nèi)核激活的調(diào)用:kernellnit (PUNCPTR) usrRoot f ROCT_TACK_SIZE

6、 f fde INCLUEE_WDE(char *) PREE_RAM_ADRS + WDB_POOL_SIZEf# else(Char +) FREE_RAM_ADRS#endifsysMemTop () f ISR_STACK_SIZEf INT_DOCK_LEV1:L;NVRAM Configuration所有的BSPs必須有NVRAM接口即使在目標(biāo)環(huán)境中沒(méi)有非易失RAM接口必須支持:sysNvRamSet()、sysNVRamGet()所有NVRA啲大小必須在 config.h 中定義為 NV_RAM_SIZE勺大小,如果沒(méi)有 NVRAM則定義 為 NONE如果提供了, NVRAI用于

7、存儲(chǔ)可下載的鏡像的啟動(dòng)參數(shù);缺省配置在NVRA啲開(kāi)頭保留了 255個(gè)字節(jié)用于啟動(dòng)參數(shù)的存儲(chǔ);缺省的啟動(dòng)參數(shù)在 config.h 中定義并靜態(tài)連接到可下載的 VxWorks的鏡像中,缺省條件下 是沒(méi)有NVRAM勺;NVRAI為啟動(dòng)參數(shù)分配的大小和定位在con figAll.h中定義:BOOT_LINE_SIZE定義NVRAM為啟動(dòng)參數(shù)保留的大小,缺省為255字節(jié);NV_BOOT_OFFSET義了啟動(dòng)參數(shù)在 NVRAI中的首地址,缺省為 0 ; 為覆蓋缺省值,在 co nfig.h中重定義宏。set/get NVRAM 的程序部分驅(qū)動(dòng)器在./src/drv/mem 目錄下,如果沒(méi)有NVRAM使用.

8、/src/drv/mem/ 下的nullNvRam.c,該程序包含在 sysLib.c 中。NVRAM持的函數(shù):STATUS sysNvRamSet(stri ng,strLe n,offset)STATUS sysNvRamGet(stri ng,strLe n, offset)三、MMl機(jī)制MMU OverviewMMl主要是受系統(tǒng)庫(kù)的控制,BSP則負(fù)責(zé)提供對(duì)物理內(nèi)存描述符的支持:由MMI使用的物理內(nèi)存描述符用來(lái)創(chuàng)建與虛擬地址空間的初始映射;缺省的映射是平滑的,一對(duì)一的在物理和虛擬內(nèi)存空間的映射。MML由 tUsrRoot任務(wù)調(diào)用usrMmulnit() 進(jìn)行初始化和使能首先初始化系統(tǒng)內(nèi)存

9、池的設(shè)置;其次是MML勺初始化;MMU勺支持可提供基本級(jí)別或通過(guò)可選產(chǎn)品VxVMI兩種,本章主要討論基本級(jí):對(duì)基本的MMI支持,宏INCLUDE_MMU_BAS必須在config.h 中被定義;UsrMmulnit()的代碼在./src/config/usrMmulnit.c中Physical Memory Descriptor初始的(靜態(tài)的)物理內(nèi)存映射定義在sysLib.c 中,是定義在./h/vmLib.h中一個(gè)結(jié)構(gòu)數(shù)組 SYS_PHYS_MEM_DESC:typedef struct physsc _ void; f* Virtual address */void *physicalA

10、ddr;/* Physical address. */TTINT Len;/* Length of mapping * /UINT initialStateMask; /* State mask fcr map. */ UINT;/* State for map. */ PHYS_MEM_DESC;映射的狀態(tài)有:有效或無(wú)效、可寫或不可寫、可高速緩存或不可高速緩存虛擬-物理的映射舉例:PMYS_MEM_DESC sysPhysMeWesc -I _/* Local DRM */(void *5 RAM LOW MRS;(void *0 RAM_LOW_ADRS, LOCAL_MEM_SIZE _

11、 RAM_LOW_ADRS.VM_S T AEM A S KVALID | VM_STATE_MASK_WRITABLEVMS5 KCACM EB LE,-VM_S T APE_V AL ID| VM_S TAT E_ WRIT ABLEVM_grATE_CACMEABLE h 一 由結(jié)構(gòu)庫(kù)使用的配置宏用于初始化 MMU勺轉(zhuǎn)換表;配置宏在./h/vmLib.h中定義Virtual Memory Mapping修改物理-虛擬內(nèi)存的映射:修改sysPhysMemDesc(靜態(tài)映射),調(diào)用 vmBaseStateSet()(動(dòng)態(tài)修改);映射到一個(gè)頁(yè)面的內(nèi)存: 頁(yè)面的大小由宏 VM_PAGE_SIZ在

12、configAll.h 中定義的,缺省為8k (對(duì)PowerPC結(jié)構(gòu)是4K),對(duì)sysPhysMemDesc映射的長(zhǎng)度應(yīng)該是頁(yè)面大小的整數(shù)倍 ; 每一張表的入口都需要一個(gè)物理內(nèi)存的頁(yè)表入口:為能定義多少地址映射設(shè)置一個(gè)上限;一些MMU1應(yīng)該限制有多少內(nèi)存能被映射,參考硬件的文檔。虛擬內(nèi)存映射必須映射所有的可被訪問(wèn)的物理內(nèi)存,包括被映射的設(shè)備內(nèi)存(Ethernet,SCSI, etc );當(dāng)MMU!能時(shí),對(duì)非虛擬-物理映射的地址進(jìn)行寫操作時(shí)會(huì)導(dǎo)致總線錯(cuò)誤;通常虛擬-物理映射的配置有:Local RAM 有效、可寫、可高速緩存ROW有效、只讀、經(jīng)常高速緩存Flash -有效、可寫、非高速緩存I/O

13、設(shè)備-有效、可寫、非高速緩存脫離目標(biāo)板的內(nèi)存-有效、可寫、非高速緩存可編程Flash需要直接訪問(wèn)因此不能被高速緩存,但如果flash是只讀的就可以被高速緩存;Dynamic Virtual MappingSTATUS vmBaseStateSet(co ntext,pVirtual,le n,stateMask state)Con text :映射的上下文,變量類型: VM_CONTEXT_I;DPvirtual :被修改狀態(tài)的虛擬地址,變量類型:void*Len: 映射的長(zhǎng)度,變量類型:int ;StateMask : Un sig ned int ;State :Un sig ned in

14、t該函數(shù)改變了一塊虛擬內(nèi)存的狀態(tài):用于改變由sysPhysMemDesc定義的初始內(nèi)存映射;函數(shù)的第一個(gè)參數(shù)為虛擬映射對(duì)基本級(jí)的四、速緩存Cache機(jī)制NULL時(shí)表示指示的是當(dāng)前的con text ;MMI是全局的,對(duì)于構(gòu)造和管理私有con text的信息請(qǐng)參照VxVMI;Cache Overview在VxWorks中,如果MMI使能,Cache就在MMU勺控制下;系統(tǒng)庫(kù)(cacheLib )中提供基本的cache管理支持,其中 BSP的主要功能:選擇合適的cache庫(kù)和模式執(zhí)行多個(gè) cache的操作;如果MMU使能,內(nèi)存映射將被標(biāo)識(shí)是否被cacheable ;遵循設(shè)備驅(qū)動(dòng)器的cache策略,

15、對(duì)BSP控制的系統(tǒng)設(shè)備進(jìn)行操作;Cache Library InitializationSTATUS cacheLibI ni t(i ntMode,dataMode)IntMode定義指令 cache的模式,類型: CACHE_MODEDataMode定義數(shù)據(jù) cache的模式,類型:CACHE_MODE初始化cacheLib機(jī)制:調(diào)用結(jié)構(gòu)定義的初始化函數(shù);置cache為靜態(tài);在sysHwInit() 運(yùn)行之前由usrlnit() 調(diào)用。參數(shù)用來(lái)定義指令/數(shù)據(jù)caches的模式CACHE_MOD在./h/cacheLib.h中聲明Cache 的模式配置宏:USR_I_CACHE_MODE ,

16、USR_D_CACHE_MODE對(duì)cache模式配置的宏的確省值在configAll.h中定義。如果需要?jiǎng)t在config.h中重新定義:#日巳f(wàn)iKLECACHE_DISABLED0x00efineCACHE_WR1I?ETHRQUGH0x01#defineCACME_COPYBACK0X02#defineCACHeZwRTTEALLOCATE0x04efineCACHE_LJO_WRITBAIJLOCATEOxOQ#defineCACHE_SNOaP_ENABLE0x10efineCACHE_gNOOP_DISABLE0x20MefineCACHE_BURST_ENABLEOH40defin

17、eCACHE_BURST_DISABLEOz80對(duì)指令和數(shù)據(jù)的缺省模式是 writethroughcache模式由具體的cache庫(kù)用來(lái)配置合適的 cache硬件如果目標(biāo)板支持多 cache的操作,BSP負(fù)責(zé)選擇恰當(dāng)?shù)膸?kù) package :MACRO_ARCH_MULTIPLE_CACHE必須在./h/arch/arch.h中定義為 TRUE或 FALSE;如果為TRUE則通過(guò)聲明和初始化 sysLib.c 和config.h 中的sysCacheLibInit 提供正確的 cache初始化;FUNCPTR sysCacheLib In it=(FUNCPTR) cacheXLibI nit;

18、對(duì)于L2 cache,BSP需要提供單獨(dú)的 cache管理庫(kù):系統(tǒng)支撐決定 _ARCH_MULTIPLE_CACHEL是否定義為 TRUE BSP并不控制;Cache EnableSTATUS cacheE nable(cache) cache:CACHE_TYPE使能特定的cache類型:指令、數(shù)據(jù)或者分支要使用特定系統(tǒng)的函數(shù);必須undefine config.h中的宏來(lái)禁止:INCLUDE_CACHE_SUPPOR任何 cache 的類型;USER丄CACHE_ENAB為指令 Cache;USER_D_CACHE_ENABL1數(shù)據(jù) Cache;USER_B_CACHE_ENAB為分支 C

19、ache在usrInit()中被調(diào)用,在KernelInit()調(diào)用之前;缺省的所有Cache類型在configAll.h 中定義;CACHE_TYP結(jié)構(gòu)在./h/cacheLib.h中聲明;typedef 巴num* CACHE TYPE *#if (CPU =:= MCGGO60)BRANCH_CACHE=_BRANCH_CACHEf#endif /* 7CPU = MC6S060) INSTRUCTION_CACHE = _TNSTRUGTIQN_CACHE rDATA_CACHE=_DATA_CACHE CACHE_TYPE;Cache類型定義在./h/cacheLib.h中#defi

20、ne INSTRUCTIONCACHE0#def ine _DATA_CAC HQ1efine _BRANCH_CACHE2Cache and Device Code對(duì)管理有效訪問(wèn)設(shè)備的代碼不論設(shè)備是否獨(dú)立于BSP要保持cache與DMA設(shè)備和硬件寄存器的一致性管理設(shè)備內(nèi)存訪問(wèn)方法防止RISC處理器的指令的無(wú)序操作使用cacheLib實(shí)行期望的cache管理為cache分配安全的緩沖區(qū)為一個(gè)驅(qū)動(dòng)器(系統(tǒng)設(shè)備或 BSP獨(dú)立的設(shè)備驅(qū)動(dòng)器)分配屬性并且申請(qǐng)執(zhí)行方法一些系統(tǒng)具有特殊的 cache庫(kù),具體可參見(jiàn) VxWorks Referenee ManualCache and Memory Acces

21、s對(duì)設(shè)備cache的管理機(jī)制與被分配的可由設(shè)備訪問(wèn)的內(nèi)存大小有關(guān)可由設(shè)備訪問(wèn)的被分配的內(nèi)存使用:cacheDmaMalloc(), malloc 和memalign,數(shù)據(jù)段和堆棧段內(nèi)存,系統(tǒng)區(qū)外的特殊內(nèi)存區(qū),未知的分配方法設(shè)備寄存器內(nèi)存:如果內(nèi)存被映射,將使用上述方法中的一種被分配;如果內(nèi)存沒(méi)有映射,將不被高速緩存;cacheLib and Memory Allocationvoid * cacheDmaMalloc(bytes)bytes:分配的字節(jié)數(shù),變量類型: size_t函數(shù)為DMA設(shè)備分配了 cache-aligned,cache-safe的緩沖區(qū),返回內(nèi)存的首地址cache對(duì)通過(guò)c

22、acheDmaMalloc()分配的內(nèi)存的一致性管理是依賴于MMU!否使能如果MMI使能,被分配的內(nèi)存被標(biāo)為non-cacheable如果MMI不被使能,刷新和禁止的宏代碼調(diào)用必須插入代碼Cache Macro RoutinescacheLib 通過(guò) CACHE_FUNCS CACHE_LIB結(jié)構(gòu)(見(jiàn)。/h/cacheLib.h )來(lái)管理刷新、禁止和其他的宏程序,例如:typodef struct/* Driver Cache Routine Pointers */FUNCPTR flushRtn;FUNC PTR inva1idateRtn; FUNCJPTR vir tToPhysR tn

23、 ; RUKCPTR physToVirtRtn; 1 CACHE FUNCS;宏代碼使用 CACHE_FUNCS CACHE_LIB吉構(gòu)中的程序指針,例:#define CACHE_DRV_PLUSH(pFuncs, adrs, bytes) (pFirnce-fIashRtn = NULL) ? OK :(pPuncs) - JuslnRtn) (DATA GACHE, (adrs ) , (bytes)通常情況下,如果一個(gè)特定的宏程序是一個(gè)no-op,它的CACHE_FUNCB CACHE_LIB結(jié)構(gòu)中的程序指針為 NULL所有的探查、刷新和禁止函數(shù)被設(shè)置為NULL;宏程序被分為兩組:c

24、acheDmaMalloc()分配的內(nèi)CACHE_DMA_XXX這些程序刷新、禁止和執(zhí)行其他的通過(guò)存區(qū)域的操作CACHE_USER_XXXX這些程序刷新、禁止和執(zhí)行其他的不是通過(guò)cacheDmaMalloc()分配的內(nèi)存區(qū)域的用戶操作CACHE_DMA_XXXXCACHE_USER_XXXX定義使用低一級(jí)的宏程序 CACHE_DRV_XXXXCACHE_DRV_XXX宏允許在提供cache與獨(dú)立的內(nèi)存分配方法一致的靈活性: 程序具有一個(gè) 附加的指向CACHE_FUNCS構(gòu)的指針參數(shù);開(kāi)發(fā)者能夠使用 CACHE_DRV_XXXX來(lái)控制cache與驅(qū)動(dòng)器控制的內(nèi)存、 可定制的cache管 理的一致

25、性Cache Management ExampleSTATUS drvDmaExample (void * pBuf)STATUS drvDmaExamp le (cdd * pEuf)LOCAL BOOL freeFlag = FAI.SE;if (pBilf != NULL)/* No buffer csche coherency problems * */ pDrvFuncs = cacheNullFuncs;elsepBllf = calleDmaM-alloc (BUF_IZE); pDrvFuncs = cache Dm Funes ;if (pBuf = NULL)return

26、(ERROR);freeFlag = TRUE;/* Driver initialization and buffer filling. */CACHE_D RV_F LUS K (pDrvFuncs, pBuf, EUP_SIZE); drvWritt (pBuf) ;/* Output data to device. */Driver code. */CACHE _DRV_I NVALI DATE (pDrvFurLCS, pEuf f 衛(wèi) UP_IZE); drvWait C) ;/* Wait for device data */* Read and handle input data

27、 from device, */if (freeFlag)cacheDniaFree (pBuf) ;/* Return buffer. */return (OK):Cache Strategies and AttributesZJCache對(duì)設(shè)備的策略將由使用的哪一個(gè) cacheLib機(jī)制來(lái)決定BSP開(kāi)發(fā)者應(yīng)基于設(shè)備的屬性來(lái)開(kāi)發(fā) cache,屬性有:WRITE_PIPING,SNOOPED,MMU_TAGGING,USER_DATA_UNKNOW,DEVICE_WRITES_ASYNCHRONOUSLY, SHARED_CACHE_LINES, SHARED_POINTERS屬性將指示cac

28、heLib將怎樣被使用chapter 2內(nèi)存管理的實(shí)現(xiàn)一、vxWorks操作系統(tǒng)內(nèi)存管理的庫(kù)函數(shù)vxWorks提供了一個(gè)用于從內(nèi)存池中動(dòng)態(tài)分配、釋放、重新分配內(nèi)存塊的工具。動(dòng)態(tài)分配 內(nèi)存塊可為任意大??;并且可自己指定內(nèi)存池的尺寸。這些內(nèi)存管理機(jī)制的基礎(chǔ)是vxWorks能管理好幾塊單獨(dú)的內(nèi)存池。(注:內(nèi)存池與內(nèi)存分區(qū)為同一概念)這些工具主要是用庫(kù)函數(shù)的形式提供。MemPartLib庫(kù):內(nèi)核內(nèi)存分區(qū)管理器該庫(kù)提供了一些用來(lái)管理內(nèi)存塊分配的內(nèi)核工具,所分配的內(nèi)存塊是在某一特定內(nèi)存分區(qū) 分配;也就是說(shuō)先分配好內(nèi)存分區(qū),再在分區(qū)中分配內(nèi)存塊。該庫(kù)中包含2套內(nèi)存分配例程:一套為memPart.(),主要由

29、創(chuàng)建和管理內(nèi)存分區(qū)以及在某一個(gè)分區(qū)中分配和重新分配內(nèi)存 塊的通用工具組成;另一套提供了與傳統(tǒng)ANSI兼容的malloc()和free()接口,該接口主要用于系統(tǒng)內(nèi)存分區(qū)中內(nèi)存的分配和釋放。其中系統(tǒng)內(nèi)存分區(qū)在內(nèi)核初始化時(shí)被創(chuàng)建(內(nèi)核在usrRoot()任務(wù)中,由kernelInit() 函數(shù)初始化),系統(tǒng)內(nèi)存分區(qū)的ID存儲(chǔ)在全局變量 memSysPartld中,該變量在memLib.h中被聲 明。在分配內(nèi)存時(shí),一般情況下調(diào)用malloc()函數(shù)用于在系統(tǒng)分區(qū)中分配內(nèi)存;而調(diào)用memPartAlloc()函數(shù)主要是用于在特定內(nèi)存分區(qū)中分配內(nèi)存。所有內(nèi)存的分配均采用首先擬合 調(diào)度算法(在下面的章節(jié)中

30、將有詳細(xì)的說(shuō)明)。在用memPartFree()函數(shù)和free()函數(shù)釋放內(nèi)存時(shí),先檢查相鄰的內(nèi)存塊是否為空閑,如果為空閑則合并成一大的空閑塊。該庫(kù)同時(shí)提供 memPartAlignedAlloc ()例程在特定的內(nèi)存分區(qū)中來(lái)分配與某一規(guī)定邊界對(duì)準(zhǔn)的內(nèi)存塊(詳細(xì)情況可參見(jiàn)函數(shù)參數(shù)的說(shuō)明)。注意:不同體系結(jié)構(gòu)有不同的對(duì)準(zhǔn)限制,為了提供最優(yōu)的性能,malloc()函數(shù)根據(jù)體系結(jié)構(gòu)的不同返回一指向一個(gè)緩沖區(qū)的對(duì)準(zhǔn)好的指針。緩沖區(qū)中可能有一部分空間不被使用。以下為該庫(kù)中函數(shù)的說(shuō)明:1創(chuàng)建內(nèi)存分區(qū):PART_ID memPartCreate(char * pPool, /* pointer to mem

31、ory area */ unsigned poolSize /* size in bytes */ )ID,該ID可以被。創(chuàng)建分區(qū)的目的主該例程用來(lái)創(chuàng)建包含在一指定內(nèi)存池中的新內(nèi)存分區(qū)。返回值為一分區(qū) 其它管理分區(qū)的例程使用 (比如:在分區(qū)中分配內(nèi)存塊和釋放內(nèi)存塊例程) 要是為了管理彼此分開(kāi)的內(nèi)存池。 2將內(nèi)存池中一內(nèi)存塊加到一內(nèi)存分區(qū)STATUS memPartAddToPool(PART_ID partId, /* partition to initialize */char * pPool, /* pointer to memory block */unsigned poolSize /

32、* block size in bytes */)3從一內(nèi)存分區(qū)中分配一塊內(nèi)存void *memPartAlloc(PART_ID partId, /* memory partition to allocate from */unsigned nBytes /* number of bytes to allocate */)4在一內(nèi)存分區(qū)中釋放一內(nèi)存塊STATUS memPartFree(PART_ID partId, /* memory partition to add block to */char * pBlock /* pointer to block of memory to fre

33、e */)5將一內(nèi)存塊增加到系統(tǒng)內(nèi)存分區(qū)void memAddToPool(char * pPool, /* pointer to memory block */unsigned poolSize /* block size in bytes */)6從系統(tǒng)內(nèi)存分區(qū)中分配一塊內(nèi)存void *malloc(size_t n Bytes /* nu mber of bytes to allocate */)7.釋放一塊內(nèi)存void free(void * ptr /* poin ter to block of memory to free */)MemLib庫(kù)具有特色的內(nèi)存管理器該庫(kù)為在內(nèi)存分區(qū)中

34、分配內(nèi)存塊提供了一些具有特色的工具。該庫(kù)是memPartLib庫(kù)的擴(kuò)展,并且提供了一些增強(qiáng)的內(nèi)存管理功能,包括:差錯(cuò)處理;對(duì)準(zhǔn)分配;ANSI分配例程。該庫(kù)中包含3個(gè)與ANSI兼容的例程:calloc()為一數(shù)組分配一內(nèi)存塊;realloc()改變指定內(nèi)存塊的大??;cfree()釋放由calloc申請(qǐng)的內(nèi)存,將其歸還到空閑的內(nèi)存池中。使用 memPartOptionsSet ()和 memOptionsSet ()函數(shù),可為每一分區(qū)選擇多種調(diào)試選項(xiàng)。 在分配和釋放內(nèi)存時(shí),主要檢測(cè)兩種類型的錯(cuò)誤:試圖分配比可得的內(nèi)存塊更大的內(nèi)存;在內(nèi) 存釋放時(shí),發(fā)現(xiàn)壞的內(nèi)存塊。在這兩種情況下,錯(cuò)誤狀態(tài)將會(huì)返回。并

35、且有4種錯(cuò)誤處理選項(xiàng)可選。MEM_ALLOC_ERROR_LOG_FLAG在分配內(nèi)存有錯(cuò)時(shí),將一消息登記到日志中。MEM_ALLOC_ERROR_SUSPEND_FLAG在分配內(nèi)存有錯(cuò)時(shí),懸掛該任務(wù)。MEM_BLOCK_ERROR_LOG_FLAG在釋放內(nèi)存有錯(cuò)時(shí),將一消息登記到日志中。MEM_BLOCK_ERROR_SUSPEND_FLAG在釋放內(nèi)存有錯(cuò)時(shí),懸掛該任務(wù)。1. 為一內(nèi)存分區(qū)設(shè)置調(diào)試選項(xiàng)STATUS memPartOptio nsSet(PART_ID partId, /* partition to set option for */un sig ned opti ons /*

36、memory man ageme nt opti ons */)2分配一對(duì)準(zhǔn)內(nèi)存void *memalign(unsigned alignment, /* boundary to align to (power of 2) */unsigned size/* number of bytes to allocate */)3在頁(yè)的邊界分配內(nèi)存void * valloc(unsigned size /* number of bytes to allocate */) 該例程保證所分配的緩沖區(qū)在頁(yè)的邊界。頁(yè)的尺寸與體系結(jié)構(gòu)相關(guān)。4在一特定的分區(qū)中重新分配一塊內(nèi)存void *memPartReallo

37、c(PART_ID partId, /* partition ID */char * pBlock, /* block to be reallocated */unsigned nBytes /* new block size in bytes */)。5找到最大可得的空閑內(nèi)存塊尺寸int memPartFindMax(PART_ID partId /* partition ID */)6為系統(tǒng)內(nèi)存分區(qū)設(shè)置調(diào)試參數(shù)void memOptionsSet(unsigned options /* options for system partition */)7在系統(tǒng)內(nèi)存分區(qū)中找到最大的空閑塊int

38、 memFindMax (void)8為一數(shù)組分配空間void *calloc(size_t elemNum, /* number of elements */size_t elemSize /* size of elements */)9重新分配一塊內(nèi)存void *realloc(void * pBlock, /* block to reallocate */size_t newSize /* new block size */)10釋放一塊內(nèi)存STATUS cfree(char * pBlock /* pointer to block of memory to free */)三、OSS中

39、的內(nèi)存管理內(nèi)存資源是系統(tǒng)重要的資源。為了節(jié)省和保護(hù)所需,根據(jù)實(shí)際情況將內(nèi)存分為UB_SPA,NUB_SPAN*2 UB_SPAN*4 UB_SPAN*8UBPOOL_SIZE種大小,每種大小的內(nèi)存用一隊(duì)列來(lái)進(jìn) 行管理。并提供申請(qǐng)和歸還的函數(shù)接口。為滿足軟件的不同需求,UB是可定制的,參數(shù)如下:UBPOOL_SIZE 表示 UB_POO的數(shù)量UB_SPAN 表示 UB_POOL勺粒度MAX_UB_SIZE表示最大的UB大小內(nèi)存隊(duì)列是一個(gè)簡(jiǎn)單的循環(huán)隊(duì)列,申請(qǐng)時(shí)從隊(duì)列頭取一空閑塊,歸還時(shí)歸還隊(duì)列尾。由于 內(nèi)存隊(duì)列是系統(tǒng)的每個(gè)任務(wù)都會(huì)申請(qǐng)和歸還的,設(shè)置了一個(gè)工作信號(hào)量來(lái)互斥。每個(gè)內(nèi)存塊都有一個(gè)頭,頭中

40、記錄有該內(nèi)存塊的地址,該內(nèi)存塊所屬于的內(nèi)存隊(duì)列,申請(qǐng) 指針與歸還指針。頭的地址值能防止將非法的內(nèi)存歸還到隊(duì)列中,頭中記錄的內(nèi)存隊(duì)列使歸還 時(shí)可以無(wú)需進(jìn)行查找,即知道該內(nèi)存塊所屬的隊(duì)列,提高效率。申請(qǐng)指針是申請(qǐng)時(shí)填入的,歸 還指針是歸還時(shí)填入的,兩者配合起來(lái)可以查找內(nèi)存的非法占用或長(zhǎng)時(shí)間占用。內(nèi)存申請(qǐng)算法:申請(qǐng)內(nèi)存(VmGetUB)時(shí),根據(jù)所需內(nèi)存數(shù)值的移位,得到一級(jí)索引值,找到相應(yīng)的UBPOOL及其對(duì)應(yīng)的內(nèi)存隊(duì)列,根據(jù)隊(duì)列的頭,將可用數(shù)據(jù)塊的指針值返回給調(diào)用者。內(nèi)存管理系統(tǒng)的初始化以及內(nèi)存申請(qǐng)的算法如下圖所示:內(nèi)存管理系統(tǒng)初始化申請(qǐng)內(nèi)存塊操作創(chuàng)建內(nèi)存管理隊(duì)列信號(hào)量二級(jí)循環(huán),初始化內(nèi)存池對(duì)每個(gè)U

41、B_POC創(chuàng)建UB也隊(duì),調(diào)用CeateQueue()返回判斷是否申請(qǐng)空內(nèi) 存,如果不是則繼續(xù)根據(jù)申請(qǐng)內(nèi)存大小得到一級(jí)索引找到相應(yīng)的內(nèi)存池(UBPOOL)從內(nèi)存池中取出內(nèi)存地址返回內(nèi)存初始化和內(nèi)存申請(qǐng)算法chapter 3 一個(gè)內(nèi)存泄漏定位實(shí)例在聯(lián)調(diào)過(guò)程中,由于我們的設(shè)備必須長(zhǎng)時(shí)間不間斷運(yùn)行,如果某個(gè)模塊出現(xiàn)了內(nèi)存泄漏,將會(huì)導(dǎo)致系統(tǒng)可用內(nèi)存越來(lái)越少,最終導(dǎo)致系統(tǒng)癱瘓。本文對(duì)前幾天MCU版軟件出現(xiàn)的內(nèi)存泄漏故障,以及故障的定位及解決辦法作了一個(gè)總結(jié),供參考。故障現(xiàn)象:所有的 NBAP消息編解碼失敗,原因是申請(qǐng)不到動(dòng)態(tài)內(nèi)存。分析及解決步驟:1、首先判斷是否是NBPS子系統(tǒng)引起由于故障的直接表現(xiàn)是在

42、NBPS子系統(tǒng),而且 NBPS子系統(tǒng)使用動(dòng)態(tài)內(nèi)存很頻繁,因此應(yīng) 首先判斷是不是由于 NBAP編解碼部分引起內(nèi)存泄漏。由于在此之前, NBAP 編解碼部分已經(jīng)經(jīng)過(guò)較長(zhǎng)時(shí)間考驗(yàn),在 WINDOWS+VC 平臺(tái)長(zhǎng)期運(yùn) 行,未發(fā)現(xiàn)內(nèi)存泄露的現(xiàn)象;編解碼部分的內(nèi)存申請(qǐng)、釋放都圍繞編解碼上下文進(jìn)行(由購(gòu)買 的軟件實(shí)現(xiàn)) 。在此之前, NBAP 編解碼上下文的申請(qǐng)、釋放都已經(jīng)進(jìn)行計(jì)數(shù),而且經(jīng)過(guò)長(zhǎng)時(shí)間 觀察,釋放與申請(qǐng)的個(gè)數(shù)完全一致。同時(shí),觀察內(nèi)存泄露的規(guī)律,在較長(zhǎng)時(shí)間未運(yùn)行編解碼程 序的情況下,也存在泄漏,因此可基本排除 NBPS 子系統(tǒng)。為了進(jìn)一步確認(rèn), 將 NBAP 編解碼申請(qǐng)內(nèi)存的函數(shù)該為了 malloc ,但是仍然存在內(nèi)存泄漏。 因此故障肯定在其他模塊。2、確定泄漏的內(nèi)存塊大小在采用OSS的環(huán)境中,例如MCU板,內(nèi)存的分配、釋放采用OSS提供的原語(yǔ) VmGetUB、 VmRetUB實(shí)現(xiàn)。OSS管理的內(nèi)存實(shí)在系統(tǒng)啟動(dòng)時(shí)一次性分配好的,根據(jù)實(shí)際系統(tǒng)的需求, 將一次性申請(qǐng)到的內(nèi)存劃分為大小不等的內(nèi)存池,每個(gè)內(nèi)存池管理不通大小的內(nèi)存塊。內(nèi)存的信息 保存在全局?jǐn)?shù)組atUBPool

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論