www.Walzer.cn - 原创技术博客

专注于智能手机上的APP和BSP开发。
所谓高手,也就是熟悉别人制定的游戏规则、并且能在规则内跳舞的人。
posts - 59, comments - 419, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

CE6上新的虚拟内存布局

Posted on 2007-05-16 23:36 Walzer 阅读(1261) 评论(6)  编辑 收藏 所属分类: SYSTEM

首先看看这张图,从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, 藏这么深, 害我找半天 )

咱们做应用的嘿,Kernel Space就不用想了,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物理内存上限。

 

 

 

 

 

Feedback

#1楼    回复  引用  查看    

2007-05-25 13:48 by Bruce Lee      
不错的文章

#2楼    回复  引用    

2007-06-07 07:19 by Ke Yu [未注册用户]
Read through several previous posts. Very impressive.

Good job boy.

#3楼    回复  引用  查看    

2007-07-05 17:17 by 达达      
你好,想请教下,CE6比起CE5对CPU的要求会不会有所提高?我有一块3SC2410的板200Mhz的主频,不知道能不能跑CE6?

#4楼 [楼主]   回复  引用  查看    

2007-07-13 23:43 by Walzer      
@达达
对CPU要求是否有提高这个我实在不清楚,到目前为止我也就是在模拟器上自己跑着玩而已,当前项目我不打算升级到CE6了,时间来不及。
如果你打算再2410上跑CE6,那么你总得先从三星那里拿到2410在CE6上的BSP吧,如果能拿到,也就侧面说明了三星他们自己觉得可以跑得动。

#5楼    回复  引用    

2008-01-04 10:50 by 令人 [未注册用户]
我很佩服你 真的 还要向你多学习啊

#6楼 [楼主]   回复  引用  查看    

2008-01-08 21:19 by Walzer      
@令人
惭愧了,我已经好久没写BLOG了, 这些都老到快没价值的文章了。