WinCE 5.0 virtual memory space
生活随笔
收集整理的這篇文章主要介紹了
WinCE 5.0 virtual memory space
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
要深入了解WinCE的memory結(jié)構(gòu),就不得不在這里先畫個virtual memory space的圖。這個圖是針對WinCE 5.0的。由于WinCE 6的結(jié)構(gòu)做了很大變化,關(guān)于WinCE 6的內(nèi)容將在以后介紹。????關(guān)于這個圖的來源,有兩點要說明。其一,繪制這個圖的主要依據(jù)是Micorsoft一份ppt。其二,在Nasiry的blog上也有一份類似的圖(http://www.cnblogs.com/nasiry/archive/2004/11/16/64437.html)。也正是Nasiry的那幅圖給我啟發(fā),才讓我想在這里重新繪制一份,并寫下一些說明。
???? WinCE 5.0 的virtual memory 分為4GB。其中高位的2GB為Kernel space,低位的2GB為User space。Kernel space可以被擁有權(quán)限(運行在Kernel mode)的線程訪問。任何線程,可以通過調(diào)用SetKMode來讓自己切換到Kernel mode或者User mode。低位的2GB,只是理論上可以被任何線程訪問,但實際上訪問起來也要受到一些限制。這點在下文說明。
???? 關(guān)于Kernel Space:
0x8000 0000 ~ (0xC000 0000 - 1): 這1GB的空間是用來做static mapping的。在WinCE啟動時,WinCE會把物理地址通過靜態(tài)映射到這1GB的空間。其中0x8000 0000 - (0xA000 0000 - 1)的512MB空間是帶緩存的映射,另外的高512MB空間是不帶緩存的。為什么同樣的memory要做兩次映射?目前能想到的例子是,當(dāng)我們使用一片memory,比如FileMapping的方式在多個進(jìn)程之間共享memory的時候,如果一個進(jìn)程寫,一個進(jìn)程讀,那么這片meomry可能要設(shè)置為UnCached,從而保證兩邊的數(shù)據(jù)不會因為cache的原因而出現(xiàn)不同步的情況。另外,由于靜態(tài)映射的地址空間已經(jīng)確定了,最大為512MB,那么也就限定了WinCE 5.0最多只能管理512MB的memory。 0xC000 0000 ~ (0xC200 0000 -1) 未使用。 0xC200 0000 ~ (0xC400 0000 -1): NK.exe進(jìn)程被load的位置。 0xC400 0000 ~ (0xE000 0000 -1):OEM可以使用的靜態(tài)映射空間,具體如何使用尚未遇到過。 0xE000 0000 ~ 0xFFFF FFFF:Trap,KPAGE等地址空間。 關(guān)于User space,可以被分為64個,每個為32MB的slots。
0x0000 0000 ~ (0x0200 0000 - 1):Slot0 為當(dāng)前運行的進(jìn)程。前面說道每個線程雖然可以放問user space,但時機(jī)上,在訪問其它進(jìn)程的空間時,需要獲得對那個進(jìn)程的訪問權(quán)限。可以通過調(diào)用SetProcPermissions 獲得對其它進(jìn)程的訪問權(quán)限。 0x0200 0000 ~ (0x0400 0000 - 1):slot1 為存放XIP DLL的地方。所謂XIP,就是execute in place的縮寫。XIP區(qū)域就是可以直接從ROM中執(zhí)行,不需要load到RAM中的代碼。 0x0400 0000 ~ (0x4200 0000 - 1):存放另外31個進(jìn)程的slot。0x4200 0000 ~ (0x7E00 0000 - 1):object store,share memory(eg. memory mapped files)。可以被所有線程訪問。0x7E00 0000 ~ (0x8000 0000 - 1):存放dll的resource。
發(fā)表
???? WinCE 5.0 的virtual memory 分為4GB。其中高位的2GB為Kernel space,低位的2GB為User space。Kernel space可以被擁有權(quán)限(運行在Kernel mode)的線程訪問。任何線程,可以通過調(diào)用SetKMode來讓自己切換到Kernel mode或者User mode。低位的2GB,只是理論上可以被任何線程訪問,但實際上訪問起來也要受到一些限制。這點在下文說明。
???? 關(guān)于Kernel Space:
0x8000 0000 ~ (0xC000 0000 - 1): 這1GB的空間是用來做static mapping的。在WinCE啟動時,WinCE會把物理地址通過靜態(tài)映射到這1GB的空間。其中0x8000 0000 - (0xA000 0000 - 1)的512MB空間是帶緩存的映射,另外的高512MB空間是不帶緩存的。為什么同樣的memory要做兩次映射?目前能想到的例子是,當(dāng)我們使用一片memory,比如FileMapping的方式在多個進(jìn)程之間共享memory的時候,如果一個進(jìn)程寫,一個進(jìn)程讀,那么這片meomry可能要設(shè)置為UnCached,從而保證兩邊的數(shù)據(jù)不會因為cache的原因而出現(xiàn)不同步的情況。另外,由于靜態(tài)映射的地址空間已經(jīng)確定了,最大為512MB,那么也就限定了WinCE 5.0最多只能管理512MB的memory。 0xC000 0000 ~ (0xC200 0000 -1) 未使用。 0xC200 0000 ~ (0xC400 0000 -1): NK.exe進(jìn)程被load的位置。 0xC400 0000 ~ (0xE000 0000 -1):OEM可以使用的靜態(tài)映射空間,具體如何使用尚未遇到過。 0xE000 0000 ~ 0xFFFF FFFF:Trap,KPAGE等地址空間。 關(guān)于User space,可以被分為64個,每個為32MB的slots。
0x0000 0000 ~ (0x0200 0000 - 1):Slot0 為當(dāng)前運行的進(jìn)程。前面說道每個線程雖然可以放問user space,但時機(jī)上,在訪問其它進(jìn)程的空間時,需要獲得對那個進(jìn)程的訪問權(quán)限。可以通過調(diào)用SetProcPermissions 獲得對其它進(jìn)程的訪問權(quán)限。 0x0200 0000 ~ (0x0400 0000 - 1):slot1 為存放XIP DLL的地方。所謂XIP,就是execute in place的縮寫。XIP區(qū)域就是可以直接從ROM中執(zhí)行,不需要load到RAM中的代碼。 0x0400 0000 ~ (0x4200 0000 - 1):存放另外31個進(jìn)程的slot。0x4200 0000 ~ (0x7E00 0000 - 1):object store,share memory(eg. memory mapped files)。可以被所有線程訪問。0x7E00 0000 ~ (0x8000 0000 - 1):存放dll的resource。
發(fā)表
轉(zhuǎn)載于:https://www.cnblogs.com/googlegis/archive/2008/11/28/2979219.html
總結(jié)
以上是生活随笔為你收集整理的WinCE 5.0 virtual memory space的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CollapsiblePanel控件
- 下一篇: 我是新人我最强----团队新手培训计划展