WINCE5.0和WINCE6.0的内存与系统架构
WINCE5.0和WINCE6.0的內(nèi)存與系統(tǒng)架構(gòu)
http://topic.csdn.net/u/20090410/14/75bba2cb-cefc-4ca5-b4f5-4165bbf16006.html
http://wenku.baidu.com/view/b7adad4bcf84b9d528ea7ab0.html
http://msdn.microsoft.com/en-us/library/bb331824.aspx
http://www.msdnwebcast.com/?
1.WINCE5.0
1.1?WINCE5.0的內(nèi)存架構(gòu)
?
因?yàn)?span style="font-family: Times New Roman;">WINCE是32位的嵌入式操作系統(tǒng),所以WINCE的虛擬尋址能力可達(dá)4GB(為什呢,2^32=4GB),但是WINCE5.0和XP操作系統(tǒng)的每個(gè)進(jìn)程獨(dú)享4GB虛擬地址空間不同,WINCE5.0中所有的進(jìn)程共享一個(gè)4GB的虛擬地址空間。這4GB的虛擬地址空間被分為兩個(gè)2GB的區(qū)域,其中低地址的那2GB區(qū)域(0x00000000?~?0x7FFFFFFF)是用戶虛擬空間,這塊虛擬空間由應(yīng)用程序的共用,也就是說(shuō)應(yīng)用程序申請(qǐng)的內(nèi)存都會(huì)從低2GB虛擬內(nèi)存空間分配的;而高2GB區(qū)域(0x80000000?~?0xFFFFFFFF)是操作系統(tǒng)的內(nèi)核虛擬空間,供WINCE操作系統(tǒng)本身使用。
我們知道WINCE5.0的進(jìn)程數(shù)量最多只能達(dá)到32個(gè),而且每個(gè)進(jìn)程只能獨(dú)享32MB的虛擬空間(這個(gè)32MB的空間也叫一個(gè)slot),這33個(gè)進(jìn)程(32+1,這個(gè)1就是指slot0,因?yàn)?/span>slot0用于映射當(dāng)前在處理器上執(zhí)行的線程所在的進(jìn)程)占用的虛擬空間0x00000000~0x41FFFFFF(slot0~slot32),slot33~slot63對(duì)應(yīng)的虛擬地址空間是0x42000000~0x7FFFFFFF,這塊虛擬地址空間是由所有的進(jìn)程共享的,如果每個(gè)進(jìn)程獨(dú)享的32MB虛擬地址空間不夠用,那么進(jìn)程可以在這個(gè)范圍申請(qǐng)?zhí)摂M地址空間,這個(gè)范圍包括對(duì)象存儲(chǔ)和內(nèi)存映射文件(.map文件,每個(gè)進(jìn)程都有自己的map文件)。此范圍的最后一個(gè)slot(slot63)從0x7E000000~0x7FFFFFFF用來(lái)存放純資源DLL。如果某個(gè)DLL里面只有資源信息(比如圖標(biāo)、位圖、對(duì)話框及字符串表燈),這個(gè)DLL就會(huì)被加載到這個(gè)空間內(nèi)。
?
從0x80000000開(kāi)始是WINCE內(nèi)核使用的虛擬內(nèi)存空間,其中0x80000000~0x9FFFFFFF(512MB)這段用來(lái)靜態(tài)所有的物理地址,也就是說(shuō)WINCE會(huì)把所有的物理內(nèi)存1:1地址映射到這段虛擬內(nèi)存上,這也就是WINCE最大支持的物理內(nèi)存是512MB的由來(lái)。0xA0000000~0xBFFFFFFF(512MB)這段虛擬地址會(huì)重復(fù)映射所有的物理地址,這段對(duì)物理內(nèi)存的映射與0x80000000這段最大的不同是從0x80000000開(kāi)始的一段虛擬內(nèi)存(何宗鍵老師這里寫(xiě)得是物理內(nèi)存)是有緩沖的,而從0xA0000000開(kāi)始的一段是沒(méi)有緩沖的。通常,緩沖可以提高系統(tǒng)的I/O效率(why,有待進(jìn)一步理解),但是對(duì)于一些OAL或者bootloader或者驅(qū)動(dòng)來(lái)說(shuō),使用緩沖有可能會(huì)造成災(zāi)難性的后果,因?yàn)榫彌_有可能會(huì)更改我們對(duì)設(shè)備的寫(xiě)操作順序,因此在驅(qū)動(dòng)程序中如果直接訪問(wèn)設(shè)備的I/O或寄存器,那么通常使用0xA0000000這段內(nèi)存地址。
?
物理內(nèi)存被映射到內(nèi)核空間之后,WINCE內(nèi)核如果要訪問(wèn)某個(gè)物理內(nèi)存地址,就只需要把該物理地址加上0x80000000或者0xC0000000就可以了,這樣簡(jiǎn)便的方式只能由WINCE內(nèi)核使用,通常的應(yīng)用程序是無(wú)法享受這種便利的。
?
0xC2000000~0xC3FFFFFF是slot97,此slot97是WINCE5.0的核心進(jìn)程
NK.EXE,可見(jiàn)實(shí)現(xiàn)WINCE5.0操作系統(tǒng)的一些主要功能的NK.EXE本身的地址空間還是在和心態(tài)中的,0xE0000000~0xFFFFFFFF這段最高的地址是內(nèi)核使用的地址空間,對(duì)于不同的處理器體系結(jié)構(gòu),這里保存著不同的內(nèi)容,通常會(huì)放置一些供虛擬內(nèi)存用的頁(yè)表和中斷向量表等內(nèi)核使用的數(shù)據(jù)結(jié)構(gòu)。
從上圖我們就slot0來(lái)看看一個(gè)進(jìn)程中虛擬地址空間的使用情況。一個(gè)進(jìn)程的32MB虛擬地址空間中,最低的64KB地址(0x000000~0x00010000)是用來(lái)捕獲野指針的,通常是空指針NULL的,如果某個(gè)指針訪問(wèn)了低于64KB的內(nèi)存區(qū)域,那么WINCE就可以捕捉到這個(gè)錯(cuò)誤,但是這樣并不能捕獲代碼中所有的野指針。
?
64KB之上是進(jìn)程的代碼、數(shù)據(jù)以及堆和棧,進(jìn)程申請(qǐng)?zhí)摂M內(nèi)存是從低地址向高地址增長(zhǎng)的。從每個(gè)32MB虛擬地址空間最高地址開(kāi)始,存放的是進(jìn)程加載的ROM?DLL的讀寫(xiě)數(shù)據(jù)以及RAM?DLL的數(shù)據(jù)(ROM?DLL的代碼對(duì)所有的進(jìn)程來(lái)說(shuō)可以共享一個(gè)拷貝,放在slot1中,但對(duì)于DLL的數(shù)據(jù),就不得不為每個(gè)進(jìn)程設(shè)立單獨(dú)的拷貝),DLL代碼和數(shù)據(jù)的增長(zhǎng)是從高地址向低地址增長(zhǎng)的,如果這兩個(gè)高低增長(zhǎng)相遇,那么就表示進(jìn)程已經(jīng)耗盡了它的虛擬地址空間,就算此時(shí)有能還有多余的物理內(nèi)存,但是無(wú)法使用它了,因?yàn)檫M(jìn)程的虛擬地址空間已經(jīng)用完了。
?
我們知道虛擬內(nèi)存的申請(qǐng)是以64KB為邊界的,這對(duì)進(jìn)程加載DLL有非常重要的影響,這也就意味著每個(gè)DLL的都要至少占用64KB虛擬地址空間,從理論上來(lái)說(shuō)每個(gè)進(jìn)程只能加載512個(gè)DLL。要記住所有的ROM?XIP?DLL都會(huì)被映射到進(jìn)程的虛擬地址空間中,因?yàn)檫M(jìn)程有可能訪問(wèn)任何一個(gè)XIP?DLL。通常一個(gè)沒(méi)有圖形界面的WINCE操作系統(tǒng)就會(huì)包含有100個(gè)左右這樣的DLL,一個(gè)含有圖形界面的正常WINCE包含的這種DLL更多,因此這個(gè)問(wèn)題應(yīng)該引起重視。可以采取一些方法避免虛擬內(nèi)存耗盡,例如把幾個(gè)不到64KB的小DLL合并成為一個(gè)大的DLL。
?
1.2?WINCE5.0的系統(tǒng)架構(gòu)
?
?
2.WINCE6.0
2.1?WINCE6.0的內(nèi)存架構(gòu)
⑴WINCE6.0支持最大32000個(gè)進(jìn)程。
⑵每個(gè)進(jìn)程獨(dú)自占用2G虛擬地址空間。
⑶統(tǒng)一/一元化的內(nèi)核(unified?kernel),把關(guān)鍵性的OS部分移到內(nèi)核空間。
?
?
?
***和WINCE5.0類(lèi)似,2G的用戶空間被分為兩部分。
***最低64KB,被系統(tǒng)用來(lái)捕獲野指針。
***低1GB的地址空間用來(lái)加載進(jìn)程的代碼、數(shù)據(jù)、堆、棧等
***0x40000000~0x5FFFFFFF(512MB),這段虛擬內(nèi)存空間用于加載所有的用戶進(jìn)行的DLL代碼和數(shù)據(jù)。
***0x60000000~0x6FFFFFFF(256MB)這段內(nèi)存分配給內(nèi)存映射文件MMF(memory?mapped?files)。
***0x70000000~0x7FEFFFFF這段內(nèi)存是內(nèi)核程序和用戶進(jìn)程間的共享堆,實(shí)現(xiàn)內(nèi)核程序和用戶進(jìn)程間通信(無(wú)需通過(guò)API),此區(qū)域用戶程序可讀,但OS可寫(xiě)。
***0x7FF00000~0x7FFFFFFF這段內(nèi)存不可訪問(wèn),作為用戶和核心間的緩存。
?
***低1GB是靜態(tài)虛擬地址。
***0xC0000000~0xC7FFFFFF(128MB)用于內(nèi)核加載的XIP?DLLs。
***0xC8000000~0xCFFFFFFFF(128MB)是文件系統(tǒng)的對(duì)象存儲(chǔ)區(qū)。
***0xD000000~0xDFFFFFF(512MB)是內(nèi)核模式的程序執(zhí)行區(qū)。
***0xF000000~0xFFFFFFFF用于捕獲系統(tǒng)調(diào)用,包含核心數(shù)據(jù)頁(yè)。
WINCE6.0系統(tǒng)被劃分為user?mode(用戶模式)和kernel?mode(內(nèi)核模式)兩個(gè)“層”,CoreDLL同時(shí)出現(xiàn)在兩個(gè)層中,驅(qū)動(dòng)程序也移到了內(nèi)核中,以前的.exe基本上都變成了.dll
?
3.?WINCE5.0和WINCE6.0的OAL?design
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的WINCE5.0和WINCE6.0的内存与系统架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Eboot.bib中0x30000000
- 下一篇: WINCE5.0+S3C2443系统每隔