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