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,如需转载请自行联系原作者


相关文章
|
8月前
|
存储 C++
C++:类的内存布局
C++:类的内存布局
|
1月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
51 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
1月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
48 3
|
3月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
68 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
33 0
深入理解java对象的内存布局
|
5月前
|
存储 算法 Oracle
不好意思!耽误你的十分钟,JVM内存布局还给你
先赞后看,南哥助你Java进阶一大半在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。Java生态发展被打开了新的大门,Java 7的G1垃圾回收器、Java 8的Lambda表达式和流API…大家好,我是南哥。一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。
不好意思!耽误你的十分钟,JVM内存布局还给你
|
5月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
5月前
|
存储 编译器 C++
Method&ConstMethod的内存布局
综上所述,常规方法和常量方法在对象的内存布局中并不直接占据空间;它们作为代码的一部分存储在程序的代码段中。对于虚方法(包括常量虚方法),它们通过VTable在对象中有表示,但即便在这种情况下,方法代码本身也不在对象的内存布局中。理解这些概念有助于深入理解面向对象编程,提高编程效率和代码的可理解性。
47 3
|
6月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
150 8
|
4月前
crash —— 获取物理内存布局信息
crash —— 获取物理内存布局信息

热门文章

最新文章