CE6上新的虚拟内存布局

简介:

首先看看这张图,从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物理内存上限。

 

本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2007/05/16/749334.html,如需转载请自行联系原作者


相关文章
|
1月前
|
9月前
|
安全 Java 程序员
38-Metaspace区域是如何因为类太多而发生内存溢出的?
永久代溢出,由于到了JDK8,已经完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Metaspace)来代替,因此后续我们不再说 方法区、永久代,直接使用Metspace元空间来称呼。
461 0
38-Metaspace区域是如何因为类太多而发生内存溢出的?
|
11月前
|
程序员
【操作系统】第五章:虚拟内存(Part1:交换[swapping]和覆盖[overlay]技术)
【操作系统】第五章:虚拟内存(Part1:交换[swapping]和覆盖[overlay]技术)
385 0
|
Oracle 关系型数据库 Linux
Linux 关闭透明大页(transparent_hugepage)和 NUMA
有些情况下需要关闭Linux 服务器的 透明大页和 NUMA,比如安装 Oracle 数据库!
Linux 关闭透明大页(transparent_hugepage)和 NUMA
|
监控 Linux
物理内存 虚拟内存 页映射模式
物理内存 虚拟内存 页映射模式
113 0
物理内存 虚拟内存 页映射模式
|
存储 索引
File Space Header & xdes(5)FSP HDR独立表空间结构(三十一)
File Space Header & xdes(5)FSP HDR独立表空间结构(三十一)
|
算法 安全
内存分配管理之Largeobjectspace
内存分配管理之Largeobjectspace
98 0
|
Oracle 关系型数据库 Linux