现在的位置: 首页 > 综合 > 正文

CE6上的虚拟内存布局

2013年11月16日 ⁄ 综合 ⁄ 共 1959字 ⁄ 字号 评论关闭

转载自:http://hi.baidu.com/even_xf/blog/item/cb7841b4b352a6758bd4b2ae.html

 

 

首先看看这张图,从Windows CE Base Team Blog上抓过来的,左边是CE5的虚拟内存布局,右边是CE6的.

        上图暂且按下不表,我们先翻出CE5文档里的大图来看( CE5和CE6文档里讲MEM ARCH的地方, Windows CE Features -> Core OS Services -> Core OS Design Development -> Kernel Overview -> Memory Architecture, 藏这么深, 害我找半天 )

        上图是CE5的内存布局细节图,User Space里面的Slot 1, Slot 33-63还都被群雄割据, 所以咱们每个进程只能有32M(0x0200 0000)的虚拟地址空间, 一共32个slot可以容纳32个进程. 当然如果32M用光的话,据文档说可以用memory-mapped file或者VirtualAlloc来扩展,不过这两种做法我自己都没有试验过. 偶比较艰苦朴素,内存花销没那么大. 有多艰苦? BOOL类型都舍不得用啊,多凑几个BOOL,搞位段去一块儿用一个字节吧, 穷啊,买不起RAM啊~ 哈哈,夸张了。
        CE6里面看起来就爽很多了.(疯掉,CE6这个地方不是给图,而是给表格, 我敲了好久)

Mode Range Size Descroption
KERNEL 0xF000 0000 ~ 0xFFFF FFFF 256MB CPU specific VM
0xE000 0000 ~ 0xEFFF FFFF 256MB Kernel VM, CPU dependent
0xD000 0000 ~ 0xDFFF FFFF 256MB Kernel VM
0xC800 0000 ~ 0xCFFF FFFF 128MB Object store
0xC000 0000 ~ 0xC7FF FFFF 128MB Kernel XIP DLLs
0xA000 0000 ~ 0xBFFF FFFF 512MB Statically mapped, uncached
0x8000 0000 ~ 0x9FFF FFFF 512MB

Statically mapped, cached

USER 0x7FF0 0000 ~ 0x7FFF FFFF 1MB unmapped for protection
0x7000 0000 ~ 0x7FEF FFFF 255MB shared system heap
0x6000 0000 ~ 0x6FFF FFFF 256MB RAM backed map files
0x4000 0000 ~ 0x5FFF FFFF 512MB User mode DLLs, Code and data
0x0001 0000 ~ 0x3FFF FFFF 1GB Process, User allocatable VM
0x0000 0000 ~ 0x0000 1000 64KB CPU dependent user kernel data

        如上图,虽然内核区和用户区对半开的局面没变,但是每个进程可以占据USER SPACE全部的2GB地址空间. 当然只有当前进程可以拿这2GB,就是在CE5里面位于slot 0的那个进程,这会儿猫变虎了;其他的进程到后面排队上场。不过我很好奇盖茨大叔把非当前进程的2GB内容藏到哪里去了, 而且还是号称最多32,000个进程的, 还有就是多个进程并发运行时, 这当前的2GB如何切换,我在CE6的文档暂时里没有找到相关说明.
        我比较关心的,每个进程的HEAP占了1GB, malloc起来比较应该爽. 但是实际上没法用那么多, 因为物理内存的限制仍然是512M, 这点上CE5和CE6是一样的, 因为KERNEL SPACE里面,在0x80000000~0xBFFFFFFF的1GB空间里,得把RAM映射出来CACHED和UNCHACHED两份, 这就限制了物理内存只能有512M. 如果你非要说WINCE真破啊,不不支持1GB的物理内存啊, 靠,我鄙视你,有了1GB内存可以跑VISTA了,或者至少也XP EMBEDDED,而不是跟我们这些穷人在玩CE.
        CE6这样修改内存布局的结果是需要使用大量内存的应用程序可以跑了, 系统的安全性也提高了, 但是进程间通信和缓存数据的传递变得复杂了.关于CE6的进程间通信我还没试验.
        简单地打个比方,CE5的内存布局就是大家一起来切一块蛋糕,每人分得很小一块,围着桌子一起吃,所以要偷吃别人的那块比较容易些;CE6的内存布局就是每人都拿一块大蛋糕,,但是饭桌只有一个,所以得挨个轮流吃,这样要偷吃别人的蛋糕就没那么容易了。但是两者存在同样的瓶颈,不论是做很多块蛋糕,还是做成一大块来分,可以拿来做蛋糕的面粉上限就只有那么多,即512M物理内存上限。

抱歉!评论已关闭.