<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 電源與新能源 > WinCE內存管理報告

WinCE內存管理報告

——
作者: 時(shí)間:2007-02-28 來(lái)源:ARM 嵌入式資源站 收藏

1. Windows CE支持虛擬內存動(dòng)態(tài)分配(virtual memory allocation),局部和單獨的堆空間(Local and separate heaps),甚至內存映射文件(memory_mapped files,memory mapping simplifies file access. Instead of using a system-maintained pointer to write to the file, you can write directly to memory.)

2. Windows CE環(huán)境下ROM和RAM的使用和我們平時(shí)的PC機有所不同。RAM被分為 兩個(gè)區域:程序區(proram memory),也叫系統堆(system heap),和對象存儲(object store)。

l 對象存儲可以被看作類(lèi)似于一個(gè)永久的虛擬RAM磁盤(pán)。在Pocket PC上,當我們關(guān)閉顯示屏后,系統實(shí)際上并沒(méi)有真正斷電,而是進(jìn)入一個(gè)低功耗的睡眠狀態(tài)(由主電池來(lái)供電)。當我們按下后面的Reset按鈕后,Windows CE內核在RAM中尋找最近一次創(chuàng )建的對象存儲,如果找到的話(huà),就是用這個(gè)對象存儲重新啟動(dòng)。

l RAM的另一個(gè)區域是程序區。這個(gè)區域就像PC機的RAM一樣。它存放所運行程序的堆和棧的空間。對象存儲和程序區的界限是可移動(dòng)的。在低內存的情況下,系統會(huì )請求用戶(hù)把部分可用的存儲對象空間提供給運行程序使用,以滿(mǎn)足程序運行的RAM需要。

u PC機上,ROM用來(lái)存儲BIOS,通常是64-128K。在WindowCE系統中,ROM用來(lái)存儲整個(gè)操作系統以及和OS綁定的應用程序,大小可以4-32M不等。因此,WinCE下的ROM就像一個(gè)很小的只讀硬盤(pán)一樣。

u 在WinCE OS中,ROM_based程序可以被指定位就地執行(Excute in Place)。也就是說(shuō),它們直接從ROM中執行而不是先載入RAM然后再執行。這樣不僅可以節省寶貴的Ram資源,而且程序啟動(dòng)更快。不在ROM中的程序(在對象存儲空間里的或者是在Flash內存中的)不能原地執行。

3. 虛擬內存。OS使用微處理的內存管理單元實(shí)時(shí)地把虛擬地址轉換到物理地址。

u 分頁(yè)內存(Paged Memory)。在WinCE OS下,一頁(yè)是1K或者4K,取決于微處理芯片。Intel 的ARM,一頁(yè)是4K。

u 虛擬頁(yè)面有三種狀態(tài):未用的(free),保留的(reserved)和占用的(committed)。一個(gè)free的頁(yè)面,顧名思義就是可以被分配的。一個(gè)reserved頁(yè)面就是已經(jīng)被預定的,所以他的虛擬地址空間不能再分配給操作系統和這個(gè)進(jìn)程的另一個(gè)線(xiàn)程。它的地址還未映射到物理空間。一個(gè)committed頁(yè)就是已經(jīng)被一個(gè)程序保留了并且已經(jīng)直接映射到了一個(gè)物理地址空間。

4.WinCE地址空間

u 為所有的應用程序實(shí)現單個(gè)的2GB的虛擬地址,但是每個(gè)應用程序的內存空間都是受保護的,以保證其他應用程序不能訪(fǎng)問(wèn)。從最低的虛擬地址空間開(kāi)始分為33個(gè)slot,每個(gè)slot32M。每個(gè)slot被分配為當前運行的進(jìn)程。Slot 0中存放的當前激活的進(jìn)程。當winCE在進(jìn)程間切換時(shí),它就重新映射地址空間,把老進(jìn)程移出,新進(jìn)程移進(jìn)slot 0。這個(gè)任務(wù)是通過(guò)操作微處理器的頁(yè)轉換表來(lái)迅速完成的。

u 33個(gè)slot以上地址區域是為OS和映射內存映射文件保留的。和windows XP一樣,winCE也保留了最低的64K地址空間,任何進(jìn)程都不能訪(fǎng)問(wèn)。

5.查詢(xún)系統內存。

u GetSystemInfo(LPSYSTEM_INFO)

u GlobalMemoryStatus(LPMEMORYSTATUS)(paging files are not supported under windows CE)

6.各種內存分配方式

u 首先是Virtualxxxx函數,用來(lái)預留,提交和釋放虛擬內存頁(yè)。然后是堆API。堆使用該應用程序管理的保留內存空間區域。堆有兩種:缺省的局部堆和獨立堆。堆API下來(lái)是靜態(tài)數據,這些數據塊由編譯器定義并且在載入時(shí)自動(dòng)分配。最后是棧,它存放應用程序中每個(gè)函數的局部變量。

u wince不支持全局堆。因此全局堆API,wince都不支持。

u 在wince中減少內存使用的關(guān)鍵是選擇恰當的內存分配策略。

6.1 虛擬內存

它是內存類(lèi)型中最基本的。系統可以調用虛擬內存API來(lái)為其他內存類(lèi)型分配空間,比如堆,棧。VirtualAlloc,VirtualFree,VirtualResize函數直接在這個(gè)應用程序的虛擬內存空間里操作虛擬內存頁(yè)??梢允褂眠@些函數預留,提交和是否物理內存。(以頁(yè)為單位的,舍入到頁(yè)的界限)

6.2 堆

顯然,以頁(yè)為單位分配內存對于大多數程序是低效的。而堆就可以以字節為單位來(lái)申請和釋放內存。粒度比虛擬內存函數要?。ㄖ辽?字節)。系統會(huì )隨著(zhù)所運行程序的需求自動(dòng)增長(cháng)堆的大小。當堆中的一些塊被釋放后,系統檢查看是否整個(gè)頁(yè)都被釋放了,如果是的話(huà),這個(gè)頁(yè)就被decommit。由于在一個(gè)堆上不斷地allocate和free,這個(gè)堆很可能被分割為一些碎片,或者有可能這個(gè)堆幾乎是空的,但是系統還是不能從這個(gè)堆中釋放 a page,除非它全空。

u Local Heap。每個(gè)應用程序在啟動(dòng)時(shí)都會(huì )創(chuàng )建一個(gè)缺省的堆??梢允褂肔ocalAlloc,LocalFree和LocalRealloc函數操作這個(gè)堆。

u Separate Heaps。為了避免把堆分割成很多碎片,如果在一段時(shí)間里需要一塊連續的塊空間的話(huà),更好的方法是創(chuàng )建一個(gè)單獨的堆。實(shí)際申請空間時(shí)才映射物理地址空間,并不才創(chuàng )建時(shí)就保留或者提交任何內存。Destroy這個(gè)堆時(shí)并不要求里面的數據塊都釋放了。

6.3棧

缺省一個(gè)??臻g最大是58K。當??臻g逐漸變小時(shí),系統將進(jìn)入低內存狀態(tài)。??臻g的最大值可以在鏈接時(shí)指定??梢灾付ǖ?M。注意:

u 缺省??臻g大小也是所有其他獨立線(xiàn)程棧的大小。

u 如果沒(méi)有可用的物理RAM,需要??臻g的線(xiàn)程就會(huì )被掛起。如果在給定的一小段時(shí)間內,這個(gè)內存需求不能得到響應,就會(huì )彈出系統異常。在低內存情況下不應該嘗試使用大量的??臻g。

6.4 靜態(tài)數據

預定義內存塊在程序載入時(shí)為它們自動(dòng)分配空間。這些塊中的數據包含了靜態(tài)申請的字符串,緩沖區,和全局變量以及和這個(gè)應用程序靜態(tài)鏈接的函數庫。Wince為一個(gè)應用程序申請兩個(gè)RAM塊:一個(gè)用于存放Read/Write數據,一個(gè)用于存放只讀數據。由于這些區域都是以頁(yè)為單位來(lái)分配內存的,所以為了節省空間,盡量使靜態(tài)數據段接近但不能超過(guò)頁(yè)的范圍。如果在靜態(tài)數據段還有相當空間,可以把本來(lái)動(dòng)態(tài)申請的一些緩沖區移到靜態(tài)數據區。有時(shí)根據具體情況可以把只讀數據區中的一些數據移到讀寫(xiě)數據區。決定的方法是查看map文件。

7.在低內存情況下WinCE如何處理應用程序的內存請求。

當系統運行需要更多的內存,而又不能滿(mǎn)足的情況下,shell會(huì )自動(dòng)關(guān)閉該應用程序。因此wince提供了一些方法來(lái)在所有正在運行的程序間分配寶貴的內存資源。

u WM_HIBERNATE消息。OS首先向非活動(dòng)狀態(tài)的程序發(fā)送此消息,請求它們在不破壞各自?xún)仍跔顟B(tài)情況下盡量釋放多的內存,比如釋放GDI對象,緩沖數據等等。

u 內存門(mén)檻(memory thresholds)。WinCE定義了四種內存狀態(tài):normal, limited, low and critical。這些狀態(tài)的劃分主要取決于當前可用的內存大小。當可用內存很少時(shí),系統首先發(fā)送WM_HIBERNATE消息,然后限制內存申請的請求。



關(guān)鍵詞: 存儲器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>