![]() |
學(xué)校地址:湖南省 長沙市 雨花區(qū) 車站南路紅花坡路口 |
![]() |
學(xué)校地址:湖南省 長沙市 雨花區(qū) 車站南路紅花坡路口 |
近幾天,我在開發(fā)一款嵌入式移動(dòng)產(chǎn)品項(xiàng)目上遇到了一點(diǎn)麻煩。這個(gè)應(yīng)用是arm9內(nèi)核和WinCE平臺,這幾天我一直被糾纏在一個(gè)內(nèi)存問題,程序吃內(nèi)存很厲害,跑一段時(shí)間后,內(nèi)存占用就接近了,出現(xiàn)所謂的假死機(jī)。
看任務(wù)管理器里面的程序內(nèi)存使用一直都很正常,但整個(gè)系統(tǒng)的內(nèi)存卻在被緩慢的侵蝕,但就是看不出來是程序哪一部份使用了過多的內(nèi)存。反復(fù)的查程序,也沒發(fā)現(xiàn)內(nèi)存泄漏,需要不斷的修改內(nèi)存分配策略,很頭疼。
1.WinCE是如何分配內(nèi)存?
。1)WinCE內(nèi)存環(huán)境
在PC上增加物理內(nèi)存是很方便的,插上內(nèi)存條后只要自檢程序識別,桌面操作系統(tǒng)就能夠支持,而在基于WinCE的產(chǎn)品上就沒那么簡單了。嵌入式設(shè)備與桌面PC的一個(gè)顯著不同是它的應(yīng)用程序中通常需要直接訪問某一段物理內(nèi)存,這在驅(qū)動(dòng)程序中對物理內(nèi)存的訪問尤為重要。尤其是像arm體系結(jié)構(gòu)下,I/O端口也被映射成某一個(gè)物理內(nèi)存地址。而且與桌面版本W(wǎng)indows相比,WinCE也提供相對簡單的物理內(nèi)存訪問方式,無論是驅(qū)動(dòng)程序還是應(yīng)用程序都可以通過API訪問某一段物理內(nèi)存。
一般來說,運(yùn)行一個(gè)WinCE需要ROM(只讀存儲器)和RAM(隨機(jī)存儲器)。但在WinCE系統(tǒng)中,ROM和RAM的使用還是稍微有些不同于個(gè)人電腦環(huán)境。RAM在WinCE 系統(tǒng)中被分為兩個(gè)區(qū)域:第一個(gè)是程序存儲區(qū)(Program Memory),也叫做系統(tǒng)堆(System Heap),程序存儲區(qū)有點(diǎn)像個(gè)人電腦中的RAM,它為正在運(yùn)行的應(yīng)用程序保存堆和棧的內(nèi)容。第二個(gè)是對象存儲區(qū)(Object Store),它有點(diǎn)像一個(gè)永久的虛擬RAM磁盤。不同于PC上的虛擬RAM磁盤,對象存儲區(qū)保留存儲的文件甚至可以在系統(tǒng)被關(guān)閉以后。
在WinCE系統(tǒng)中,存儲在ROM的程序能以現(xiàn)場執(zhí)行(Execute in Place,XIP)的方式運(yùn)行。換句話說,程序可以直接從ROM中執(zhí)行而不必先加載到RAM中再執(zhí)行。這種能力對嵌入式系統(tǒng)來說,具有兩個(gè)方面的巨大優(yōu)勢,一是代碼直接從ROM中執(zhí)行意味著程序代碼不會(huì)占據(jù)更有價(jià)值的RAM;二是程序在執(zhí)行前也不必先復(fù)制到RAM中,這樣就只需要很少的時(shí)間來啟動(dòng)一個(gè)應(yīng)用程序。而不在ROM中的但是被含在對象存儲區(qū)或閃存卡中的程序?qū)⒉荒芤袁F(xiàn)場方式執(zhí)行,它們將被復(fù)制到RAM中再執(zhí)行。
。2)虛擬內(nèi)存
電腦中所有運(yùn)行的程序都需要經(jīng)過內(nèi)存執(zhí)行,如果執(zhí)行的程序很大或很多,就會(huì)導(dǎo)致內(nèi)存消耗殆盡。為了解決這個(gè)問題,Windows運(yùn)用了虛擬內(nèi)存技術(shù),以緩解內(nèi)存的緊張。和大多數(shù)操作系統(tǒng)一樣,WinCE也實(shí)現(xiàn)按需調(diào)頁的虛擬內(nèi)存機(jī)制。WinCE是32位的操作系統(tǒng),支持4GB的虛擬地址空間。系統(tǒng)調(diào)用虛擬內(nèi)存API來為其它類型內(nèi)存分配內(nèi)存,括堆和棧。WinCE虛擬內(nèi)存頁可以處在三種狀態(tài):自由(free),保留(reserved),或被提交(committed)。
WinCE提供兩種虛擬地址映射方法,分別為靜態(tài)映射和動(dòng)態(tài)映射,靜態(tài)映射的虛擬地址空間只能由內(nèi)核訪問,而動(dòng)態(tài)映射的地址空間可以由用戶模式的應(yīng)用程序訪問。WinCE系統(tǒng)使用微處理器的內(nèi)存管理單元(MMU)來處理虛擬地址和物理地址間的實(shí)時(shí)轉(zhuǎn)換。意思是說:一旦WinCE系統(tǒng)的MMU開始工作,CPU就不再直接訪問物理內(nèi)存了,對于運(yùn)行在x86和arm系列CPU上的CE內(nèi)核來說,必須先確立物理內(nèi)存地址和虛擬內(nèi)存地址的映射關(guān)系。
這種關(guān)系是在一個(gè)名為OEMAddressTable的表中定義的,屬于靜態(tài)映射方法。因此,在一個(gè)虛擬內(nèi)存系統(tǒng)中,應(yīng)用程序主要處理這個(gè)虛擬的地址空間,并不涉及到由硬件管理的物理內(nèi)存,應(yīng)用程序使用虛擬內(nèi)存不需要知道實(shí)際物理內(nèi)存的位置,只要有內(nèi)存可用就行。
2. WinCE與桌面WINDOWS在內(nèi)存方面的區(qū)別
。1)Win32 API 接口之間的區(qū)別
WinCE實(shí)現(xiàn)了Windows XP中可用到的幾乎全部的Win32內(nèi)存管理API。WinCE支持虛擬內(nèi)存(virtual memory)分配,本地(local)和分離(separate)的堆(heaps),甚至還有(memory-mapped files)內(nèi)存映射文件。雖然 WinCE 支持幾乎每個(gè)Win32 內(nèi)存管理函數(shù),但是開發(fā)人員應(yīng)當(dāng)永遠(yuǎn)不要忘記 WinCE 是與 Windows XP 完全不同的操作系統(tǒng),這些內(nèi)存管理API的實(shí)現(xiàn)WinCE 具有不同的要求和不同的實(shí)現(xiàn)方式。
像Windows XP一樣,WinCE支持一個(gè)帶有應(yīng)用程序間內(nèi)存保護(hù)功能的32位地址空間,但是WinCE是被設(shè)計(jì)來應(yīng)用于不同場合,所以它底層的內(nèi)存結(jié)構(gòu)不同于Windows XP。例如,WinCE不支持Win32 內(nèi)存API的全局堆(global heap)。因此,開發(fā)人員應(yīng)該熟悉 Win CE 與 Windows 桌面版本之間的細(xì)微差異,在設(shè)計(jì)應(yīng)用程序或診斷問題時(shí)知道 WinCE 如何實(shí)現(xiàn)Win32 兼容性是一件非常重要的事情。
(2)存儲結(jié)構(gòu)區(qū)別
WinCE實(shí)現(xiàn)了一個(gè)和其他Win32操作系統(tǒng)類似的分頁式虛擬內(nèi)存系統(tǒng)。在WinCE中,一頁的大小可以從1024字節(jié)到4096字節(jié),基于微處理器的不同而不同。這和Windows XP不同,Windows 頁面尺寸是Intel微處理器所支持的4096字節(jié)。
WinCE 通過改變每頁的保護(hù)來保護(hù)程序內(nèi)存,而不是分配給每一程序不同地址空間。存儲在ROM中的程序組在WinCE下當(dāng)?shù)貓?zhí)行,所以嵌入式系統(tǒng)的設(shè)計(jì)者能夠只占用很少的RAM用于堆棧存儲的需要。而且為了進(jìn)一步的增加應(yīng)用程序軟件的性能,WinCE采用按需求將內(nèi)存分頁,操作系統(tǒng)僅僅需要解壓縮并且裝入基于RAM的一小部分程序準(zhǔn)備執(zhí)行。因此,ROM和基于RAM的程序的靈活性與速度意味著基于WinCE的設(shè)備能夠被構(gòu)造成多種內(nèi)存結(jié)構(gòu)形式。
。3)低內(nèi)存環(huán)境的區(qū)別
WinCE定義了內(nèi)存門檻(Memory thresholds),它有四種內(nèi)存狀態(tài):Normal, Limited, Low和Critical,這些狀態(tài)的劃分主要取決于當(dāng)前可用的內(nèi)存大小。WinCE監(jiān)視系統(tǒng)自由的RAM,并對越來越少的RAM作出響應(yīng)。當(dāng)很少內(nèi)存可用時(shí),WinCE發(fā)送WM_HIBERNATE消息,接下來會(huì)限制可能的內(nèi)存分配。當(dāng)系統(tǒng)運(yùn)行需要更多的內(nèi)存,而又不能滿足的情況下,shell會(huì)自動(dòng)關(guān)閉該應(yīng)用程序。
例如,OS首先向非活動(dòng)狀態(tài)的程序發(fā)送此消息,請求它們在不破壞各自內(nèi)在狀態(tài)情況下盡量釋放多的內(nèi)存,比如釋放GDI對象;如果沒有可用的物理RAM,需要?臻g的線程就會(huì)被掛起;如果在給定的一小段時(shí)間內(nèi),這個(gè)內(nèi)存需求不能得到響應(yīng),就會(huì)彈出系統(tǒng)異常。簡單說是:當(dāng)系統(tǒng)運(yùn)行在一個(gè)低RAM環(huán)境中,應(yīng)用程序?qū)⒄{(diào)整并 小化它們的內(nèi)存使用,如果當(dāng)系統(tǒng)需要更多內(nèi)存時(shí),外殼(shell)會(huì)自動(dòng)關(guān)閉這些程序。因此,管理WinCE運(yùn)行在低內(nèi)存系統(tǒng)中的程序的方法有很多種,但必須要小心應(yīng)用,否則容易造成程序掛起或被關(guān)閉。
|
關(guān)于收錄1 |
關(guān)于收錄2 |
網(wǎng)站幫助 |
廣告合作 |
下載聲明 |
友情連接 |
網(wǎng)站地圖 |
| 共有文章: 15338 篇
今日新文: 32 篇
當(dāng)前在線: