网上看帖,发现常有网友尤其新手在问:
我的机器标称有128 MB 的RAM,为什么打开系统设置里的内存选项却显示总的程序内存(RAM)只有11x MB或10x MB。机器RAM说是64 MB, 可是为什么总的内存显示只有5x 甚至4x MB?
回答则是五花八门,莫衷一是:
内置软件,后台程序,开机服务和程序,系统缓存或缓冲池,常驻内存的核心占用,系统占用,甚而解释为刷系统就占用的(部分ROM占用).……
个别回答更为武断:谁的PPC使用中的内存加上剩余内存会等于机器所标称的内存的?--所以实在没有深究的必要。话虽如此,毕竟这个差值对不同的机器往往不同,个别甚至相差还很大,因而很多用户仍免不了有些心中惴惴。
那么究竟哪种解释更为准确呢?本文的目的就是解开一部分用户心中的这个疑惑。
【 谁用了我的内存? 】
为什么WM5/6系统显示的总程序内存(RAM)会比标称内存总量少几兆,十几兆,甚至几十兆字节的容量呢?
产生这种疑问的根源在于WM5/6系统设置实际并没有显示出实际总的RAM容量,它所显示的只是WM操作系统在载入时及载入后应用程序和进程所可控制 /支配的内存总量,它包括“已使用”(In use)和“闲置”(Free)两部分。其中“已使用”部分除操作系统占用外,还包括了硬件驱动,个人信息管理,电话拨号等在系统启动时自动加载的,用户实际没有控制权的程序。这些程序,一部分来自微软,一部分来自设备制造商,还有一部分来自移动通讯服务商(PPC Phone)。
除设置中所显示的总容量外,其余部分的内存被固定用作了其它方面的用途而并未被系统设置里的内存状况显示所计算在内。这是用户所不能控制的并且更为隐蔽的另一部分被占内存。
这部分隐蔽的被占内存主要被用在了五个方面。
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的内存容量。
最后来做一下加法:Page Pool (+Radio Stack)+DMA Buffer+XIP Kernel+Frame Buffer
4.5 (+4) + 0.3 | 6 + 1.5 | 2 + 0.15 | 1.2 = 6.45 | 13.7 (10.45 | 17.7)
所以基于NAND型ROM 的PPC里所占用的未显示内存范围在6.45-13.7 MB,PPC Phone会多占用约4 MB。而基于NOR型flash ROM的机器可能会减少约4.5 MB (PPC) 的内存占用。
其它方面,有摄像头尤其更强调动态视频摄录效果的设备占用容量会更大,VGA显示的机器也会高一些。
举例:手头的HP iPAQ 21x (PPC,640×480 VGA,无摄像头,WM6,NAND flash ROM): 128 MB(总)-121.40(显示)=6.6 MB
与上面的估算结果相当符合。
对于现在市场上一般配置的PPC手机(基本都是基于NAND型flash ROM的设备),这部分未显示内存大约会占用13-15 MB的空间。
另外,需要说明的个例是HTC Touch DiaMond。该款机器号称有192 MB DDR SDRAM,但实际上其中的64 MB是内置于CPU中的显存(供3D图形显示用,有说亦用于无线模块的),所以对整个系统而言,可资利用的有效内存仍只有128 MB(内存利用上在图形显示方面或许会节省一些—未知)。因此与其它128 MB RAM的类似配置的设备相比,钻石机的用户并没有发现在可用RAM上有什么优势。HTC Touch HD的标称RAM容量也存在同样的数字游戏。
最后强调的一点是,在对内存的利用和分配上,机器生产商总可能会针对不同型号机器的某些组件作一定调整,也总会在预载应用软件与速度及用户可利用的内存资源上作出取舍。所以即使对于具有相同操作系统和同样标称内存但不同款型的机器,机器启动后的用户可用内存也可能会相差很大。
【 关于flash ROM的基本常识 】
在性能上,RAM的读写速度非常快(读、写速度基本相当),由于需要频繁刷新,也非常耗电(所以对掌上设备而言,RAM并非完全是多多益善,过多闲置无用的RAM会耗掉大量不必要的电力);而ROM的读写速度相比RAM慢很多,尤其是写入速度更慢,但耗电较少(由于不需要高频刷新来维持记忆)。
所以应用上,ROM主要是用以存储程序和数据,而RAM主要用以运行程序。
flash ROM 按照实现的整个电路逻辑结构及相应存储单元擦写操作的不同分为NAND和NOR两种类型。
NOR型提供完整的寻址与资料总线,并允许随机存取内存上的任何区域,因而其特点是读取数据快,但需要较长的时间进行擦写。
NAND型没有随机存取外部寻址总线,必须以区块性的方式进行读取。与NOR型相比,它具有具有较快的擦写时间,但数据读取的速度较慢。NAND型ROM的每个储存单元的面积也更小,这使得NAND Flash相较于NOR Flash具有较高的储存密度与较低的单位存储成本。同时它的可重复擦写次数也高出NOR Flash一个量级。所以现在所有的存储卡都是NAND型的flash ROM。
NOR型ROM更类似传统的ROM,支持CPU进行字节级别的读取。而NAND型ROM则类似于硬盘,适合作为大量数据存储介质。所以对于NOR型 ROM,CPU可以进行就地执行(XIP)而省去了把代码先读入RAM的步骤,载入和运行代码的速度更快,并可减少所需的RAM空间。
在实际系统中,XIP只能用于底层的(操作系统)代码。对于后续安装的被列入文件系统的程序,是必须载入RAM才能够被CPU执行的。
对于NOR flash ROM和XIP的关系再补充一点的是,并非NOR型flash ROM都会选择XIP方式。因为对于一块flash ROM芯片不能同时进行读/写操作,所以如果代码和数据都装在一个ROM上,既要XIP,又要同时进行数据写入的话,实现上相当麻烦(因为写入时无法从 ROM读入代码,所以对中断的处理会很复杂)。所以解决方法或者是不用XIP,或者是将XIP代码和数据区分离在两个ROM上,或者采用比较复杂的技术来实现(IPSM)。
【 关于设备里ROM的占用情况 】
应有的朋友的要求,这里补充说明一下关于ROM的占用情况。对于ROM占用,由于没有黑幕(除引导记录和文件分配表外),所以情形相对简单一些。
与RAM的情况有些类似,在系统设置里,ROM,即存储内存(Storage)的总容量与设备的标定ROM相比有一个几十兆的大缺口。举例而言,HP iPAQ 210系列, WM6.0, 标定256 MB ROM, 系统设置显示总存储内存为162.30 MB, 有近96 MB的差值。
但发现并解释这个差值则简单明了得多。
这部分系统设置没有显示的空间是从软件意义上来说的真正的ROM(只读)部分,文件系统没有读写的权力,是系统的操作系统和备份文件以及预装在ROM部分的程序(包括来自微软,设备制造商以及移动服务商,对于自制的系统还包括ROM包里的其它程序和数据),主要装在windows目录下。用资源管理器查看属性会发现有ROM属性,对文件无法修改,也无法复制--操作系统是禁止对ROM文件的操作的。所以操作系统在显示时把这部分干脆拿了出来,因为这是文件系统无法使用的部分。修改这部分文件的途径只有通过刷ROM来重写。硬启时设备也是通过这部分文件来恢复系统到初始状态。
硬启后会发现存储内存的已使用部分并不是0,这是根据ROM文件恢复的,文件系统内可以读写的部分操作系统的文件。
现在我们做加法。
把所有设备上的存储空间(除存储卡外)加起来。以手头的iPAQ为例,
用Resco Explorer,把所有目录和文件全选(包括"iPAQ File Store“,这实际是从系统的flash ROM分出的一个存储卡结构,在硬启时不会被刷新),去掉SD Card和CF Card(如果有的话)以及RAM Disk (RAM模拟的)为111.15 MB。
系统设置里的空闲存储空间为134.83 MB。
总的ROM容量就是:111.15+134.83 = 245.98 MB。
这个数字接近256 MB了,但仍有约10 MB的差距。
这里可以想到的有两种解释。
第一,是由文件系统的结构,尤其是大量小文件造成的。
一般写入一个1个字节甚至0字节的文件,虽然查看发现全部文件的总字节数没有增加,但实际上这个文件已经占用了一个区,比如512个字节的空间,所以系统的可用空间实际已经减少了512个字节。对于大文件来讲,这个比例会很低,但对小文件,这个浪费的空间比例很高,尤其是很多小文件时,浪费的总的空间就相当可观了。这个现象在硬盘上尤其突出,因为它的每个最小的文件单位-簇的空间相对更大,所以比如1个字节的文件,会占用4KB或更大(fat, fat32)的有效空间。
但WM系统的ROM(只读)文件使用的不是一般的文件体系,而是压缩的形式,即文件大小是多少,就会实际占用多少(关于这一点,见下一部分的说明)。这样就只能由第二点来解释。
第二,ROM的总空间的确小于标定容量。
这里涉及到存储介质容量的单位问题。在计算机应用方面,1KB=1024字节,而不是1000, 1MB=2^20, 1GB=2^30。但是存储介质(硬盘,存储卡等)的生产厂家在宣传产品时,偷换了单位,即标定容量的1MB=1,000,000 字节,而不是2^20=1,048,576 字节,1GB=1,000,000,000字节,而不是2^30=1,073,741,824字节,从而变相降低了成本。所以买回来的号称80G的硬盘,计算机上显示的可用空间只有70多GB。存储卡也是如此。(少5% (M为单位)到 7%(G为单位))
所以对于和存储卡在物理上一致的系统内置ROM,出现同样的数字游戏也并不新奇。
另外就是flash ROM的实际容量对于比如每个卡可能都不同,有一个波动范围,flash ROM在生产时也会留有一定的冗余空间以备出现坏区时备用。
所以考虑第二点原因,245.98 X 1.024^2= 257.93 MB,这与标定的256 MB的ROM总容量是基本吻合的。
注:关于这部分的讨论可能有错漏,需参考更多资料核实。
【 关于WM系统“Windows”目录下的两类文件 】
搞清这一点,其一是为上一部分关于ROM空间的分析作补充说明,其二是为了阐明为什么通常无法对Windows系统里的ROM属性的文件进行常规的文件操作,为什么对有些系统文件(非ROM属性)却可以。
实际上WM系统对内置ROM的使用,的确是分成了两部分区别对待的。其一是文件(Files)部分,其二是模块(Modules)部分。
文件部分与磁盘、存储卡等用来存放文件的存储空间的性质和文件结构是一类的,原则上用户具有完全的读写权力。操作系统里所有图片及多媒体文件都被存放在这一部分。这也是为什么我们可以随意更换桌面图片--尽管桌面图片文件也是属于操作系统自带的文件之一。一些程序也是以通常的(可执行)文件形式存放在这部分的,所以也会发现对某些“Windows“的可执行文件我们也可以随意处置。
对于第二部分的文件,则用常规的方法来进行操作一般都是无能为力的。查看属性就会发现这类文件都标有一个“ROM”属性,而且无法更改。实际上,这部分程序文件在被刷入flash ROM前,是经过了特别处理的。大多数文件的文件头已被截去,文件代码和数据在ROM里的存放地址也是完全固定的。所以从存放的形式来说,这些程序是可以直接被运行而不必先被调入RAM的。即便不需要XIP,这种存储形式也提高了代码载入、执行的效率。另外,这些文件本身变小了,而且不同文件能够以更紧凑的形式存放在这个部分,从而节省了ROM空间。
存放的形式也决定了即使可以把ROM属性的程序文件拷贝出来(有工具可以做到),也无法立即使用它们--必须再利用工具重新生成一个正常文件(加上文件头),同时还要考虑到有些程序可能针对特定的设备进行过代码的优化与压缩--这决定了这不是一件直截了当,总能成功的活儿。 所以通常制作的新ROM总是非常依赖于特定机型的。