Windows Mobile的ROM,RAM可能会比较令人迷惑,这是因为:操作系统所说的ROM,RAM并不是硬件上的ROM芯片和RAM芯片。概念不同,所以必须理解清楚这个不同之后才能继续。
首先说硬件上的ROM,RAM,我们购买手机的时候,在手机参数里通常喜欢这么说明(以我的HTC HD2为例):
ROM:1024M
RAM:576M
这是什么意思呢?这指的是手机上面的两颗芯片的数据容量,ROM这颗芯片其实并非真的Read-only,它的特点只是断电后上面数据不会丢失,而RAM这颗芯片则跟我们PC上的内存条芯片一样,断电后数据丢失。
接下来是操作系统所说的ROM和RAM,Windows Mobile的刷机其实就是将ROM文件的内容写入到那颗ROM芯片去。而操作系统第一次启动的时候将完成一些后续的相关初始化。Windows Mobile所认为的ROM,指的是ROM芯片中被写入的那些只读的部分,这部分的内容是不能改变的,(刷机才能改)那么剩下的能被程序和操作系统改变的,就是RAM了,所以RAM也不等同于硬件上的RAM芯片,它还包括了ROM芯片中可以读写的那一部分。
那么,下面所提到的ROM和RAM都是操作系统概念上的ROM和RAM,而不是硬件上ROM芯片和RAM芯片。
任何Windows Mobile设备,ROM保存了整个操作系统,包括操作系统自带的那些应用程序,也都在ROM里边。如果ROM里边的模块(在资源管理器中看到的可执行文件,通常是EXE和DLL,在这里称之为模块)没有被压缩,那么操作系统就它“当地执行”(Excute In Place,也就是缩写词XIP);反之,如果ROM里边的模块是压缩过的,那操作系统就只能先把模块解压缩到RAM中,然后再在RAM中执行它。至于哪些模块可以XIP,那是OEM相关的。
使用XIP有很大好处,最重要的是节省了宝贵的RAM,也节省了模块家载入RAM中所需要消耗的时间。
那我们平常安装的软件,保存的配置,是存放在哪里呢?——存放在“对象存储”(Object Store)或者卡上,存放在“对象存储”或者卡上的可执行模块,是无法XIP的,只能先加载入RAM,然后再在RAM中执行。
上面提到了“对象存储”,下面进一步讲解:
Windows Mobile的RAM(再次提醒一下,指的不是硬件上的RAM芯片)分为两个部分:
其一就是“对象存储”,“对象存储”里的内容在断电后继续保留,不会丢失;另一个就是“程序内存”,程序内存的内容会在断电后丢失。
“对象存储”存放的内容包括各种文件,数据库,数据库记录,注册表等;而“程序内存”则存放应用程序运行时候的堆(heap)和栈(stack)。
当Windows Mobile启动的时候,它创建了单独的4G虚拟地址空间,这4G的空间中划分了33个格子,每个格子32M,所有的进程共享这个地址空间,当一个进程启动的时候,操作系统就为它选一个格子来映射。这是跟桌面的Windows很不一样的机制,据说Windows CE 6.0已经改进了这种内存机制,但最新版本的Windows Mobile 6.5其实还是基于Windows CE 5.x内核的。微软这么设计估计是因为想节省便携式设备本来就很宝贵的资源,但这样做的缺点显而易见,一是只能最多跑32个进程(第1个格子总是用来映射前端进程的地址空间),二是每个进程默认只能有32M的虚拟空间(虽然你还可以通过内存映射文件机制或调用VirtualAlloc函数来分配超过32M的虚拟内存)。
我们在Windows Mobile的系统设置里面看到的“主内存”,指的就是RAM。而ROM呢?ROM不光是只读,我认为它还是不可读,几乎不可见的,常规的程序是看不到ROM的,即便你能够在资源管理器里找到那些属于ROM的“文件”,但你还是无法读取它或者将它“复制”出来。
![](http://www.cppblog.com/images/cppblog_com/guogangj/windows_mobile_memory_controlpanel.png)
如上图,主内存分两类,一是“存储”,一是“程序”,其实也就是前面提到的“对象存储”和“程序内存”了。也许你发觉“程序”的总内存只有460.02M,而不是硬件上标称的576M,要解释这个可相当不容易,具体参考我前面转载的一篇文章:
http://www.cppblog.com/guogangj/archive/2010/12/19/136927.html