前言
使用过windows mobile手机的人应该都知道RAM这个概念。RAM就好比电脑的内存,给手机运行程序提供空间。但是很多人都会有这样的疑问:为什么打开系统设置里的内存选项却显示总的程序内存小于机器的标称内存?
下面,我们就来看看这部分“消失的”内存,究竟到哪里去了。
概述
产生这种现象的根源在于windows mobile(以下简称wm)系统实际并没有显示出物理RAM大小,它所显示的只是WM系统在载入时及载入后应用程序和进程所可控制/支配的内存总量。
它包括“已使用”和“闲置”两部分。其中“已使用”部分除操作系统占用外,还包括了硬件驱动,个人信息管理,电话拨号等在系统启动时必须加载的程序。这些程序,一部分来自微软,一部分来自制造商,还有一部分来自移动通讯服务商。
自加载的基本内容有:
1.WM系统核心占用一部分RAM;
2.设备驱动占用的一部分RAM;
3.生产商预置的内容,用于第一次开机及格机之后的初始化;
除上述用途之外,其余部分的内存被固定用作了其它方面的用途而并未被系统设置里的内存状况显示所计算在内。这是用户所不能控制的并且更为隐蔽的另一部分被占内存。
包括以下部分:
1. 缓存池(Page Pool)
系统运行程序,程序代码和代码所产生的数据都会消耗内存。对于NOR型flash ROM的设备,代码可以从ROM里直接被CPU调用执行。这种执行方式叫作“立即执行”或“就地执行” (XIP: execute in place)。对于NAND型flash ROM的设备,程序代码必须首先被调入内存,然后再从内存里被CPU逐条执行。如果没有缓存池,代码会首先被全部调入普通的内存里。缓存池实际上就是起到了限制执行代码时占用过多内存的作用,也就是说,超出了缓存池容量的其余代码不会被预先调入内存,而只有需要时再行调入。
WM5系统的NAND型ROM设备的缓存池大小一般是4.5 MB。
2. 射频协议栈(Radio Stack)
在PPC手机中,有相当部分的代码是用于和发射基站间的通讯。在某些设备里,这一无线通讯模块有自己的RAM和ROM。而在其它设备里,无线通讯模块的代码是被存储在系统的ROM里的。这样,它或者是就地执行,或者是调入内存执行。如果是后者,那么这部分被占内存会直接从总的内存中划掉而不被计入系统设置里所显示的总的内存容量的。
这一模块(射频协议栈)占用约 4 MB内存。
3. 直接存取内存区(DMA Buffers)
一些硬件可以不经CPU的处理和控制而自行写内存,这叫作直接性内存读写(DMA: Direct Memory Access)。这块内存区在系统加载前已被事先分出(而不受CPU支配)。这种方式的优点在于能够极高效和通常更低能耗地进行数据的传送。在早期的PPC里,这主要用在音频采集上,通常占用内存很小。现在,它被用于视频采集,从而也占用了大得多的内存。
机器的生产商会根据机器在应用方面的定位来调整这部分内存的大小。譬如如果主要用途是预设为拍照,则会需要较小的DMA内存,而如果考虑用于摄像,则需要占用大得多的内存,而如果是视频会议的话,所需内存会更大。
直接存取内存区的容量从300 KB 到 6 MB 不等。对于把视频采集作为主要应用方向之一的机器,可能会在4 MB左右。
4. 核心区(XIP Kernel)
操作系统最核心的部分需要就地执行(XIP)的模式。对于NAND型ROM的设备,在系统加载时,需要把这部分代码首先载入内存,并从这部分代码开始执行后面的任务。由于系统正在运行时还无法分辨正被执行的这部分核心代码是从ROM还是RAM执行的,所以它会假设是从ROM里执行的从而把这部分内存排除在外。
核心区占用约 1.5 到 2 MB 大小。
5. 帧缓冲区(the Frame Buffer) 这部分内存专门用作存储当前屏幕上显示的一切信息。大多数设备,每个像素占用两个字节(16-bit 65535种色彩)。所以一般320×240的QVGA屏需要150 KB,而640×480的VGA屏需要600 KB。有时为了显示性能方面的原因,机器 会设置两个帧缓冲区,这样就会占用1.2 MB的内存容量。
根据上面列出的部分,对于现在市场上一般配置的PPC手机(基本都是基于NAND型flash ROM的设备),这部分未显示内存大约会占用13-15 MB的空间。
而由于系统的原因,刷不同的系统版本,也会导致“消失的”内存数量不尽相同。所以,即便是同一型号的手机,也未必会显示同样多的内存量。