博主:關(guān)于Windows Mobile的ROM和RAM的相關(guān)問(wèn)題,我也確實(shí)夠頭大的,雖然自己經(jīng)過(guò)了一些研究有了一些結(jié)論,但還是未能完全解釋為什么會(huì)這樣,今天偶爾找到一篇文章,總算比較全面的描述了這些相關(guān)的細(xì)節(jié)問(wèn)題,雖然對(duì)于一個(gè)軟件開(kāi)發(fā)者來(lái)說(shuō),不明白這些也關(guān)系不大,但有一個(gè)比較全面的了解很明顯能夠幫助我們理清思路。
轉(zhuǎn)自:http://club.tech.sina.com.cn/mobile/thread-61369-1-1.html
網(wǎng)上看帖,發(fā)現(xiàn)常有網(wǎng)友尤其新手在問(wèn):我的機(jī)器標(biāo)稱(chēng)有128 MB 的RAM,為什么打開(kāi)系統(tǒng)設(shè)置里的內(nèi)存選項(xiàng)卻顯示總的程序內(nèi)存(RAM)只有11x MB或10x MB。機(jī)器RAM說(shuō)是64 MB, 可是為什么總的內(nèi)存顯示只有5x 甚至4x MB?
回答則是五花八門(mén),莫衷一是:內(nèi)置軟件,后臺(tái)程序,開(kāi)機(jī)服務(wù)和程序,系統(tǒng)緩存或緩沖池,常駐內(nèi)存的核心占用,系統(tǒng)占用,甚而解釋為刷系統(tǒng)就占用的(部分ROM占用).……
個(gè)別回答更為武斷:誰(shuí)的PPC使用中的內(nèi)存加上剩余內(nèi)存會(huì)等于機(jī)器所標(biāo)稱(chēng)的內(nèi)存的?--所以實(shí)在沒(méi)有深究的必要。
話雖如此,畢竟這個(gè)差值對(duì)不同的機(jī)器往往不同,個(gè)別甚至相差還很大,因而很多用戶(hù)仍免不了有些心中惴惴。
那么究竟哪種解釋更為準(zhǔn)確呢?本文的目的就是解開(kāi)一部分用戶(hù)心中的這個(gè)疑惑。
【誰(shuí)用了我的內(nèi)存?】
為什么WM5/6系統(tǒng)顯示的總程序內(nèi)存(RAM)會(huì)比標(biāo)稱(chēng)內(nèi)存總量少幾兆,十幾兆,甚至幾十兆字節(jié)的容量呢?
產(chǎn)生這種疑問(wèn)的根源在于WM5/6系統(tǒng)設(shè)置實(shí)際并沒(méi)有顯示出實(shí)際總的RAM容量,它所顯示的只是WM操作系統(tǒng)在載入時(shí)及載入后應(yīng)用程序和進(jìn)程所可控制/支配的內(nèi)存總量,它包括“已使用”(In use)和“閑置”(Free)兩部分。其中“已使用”部分除操作系統(tǒng)占用外,還包括了硬件驅(qū)動(dòng),個(gè)人信息管理,電話撥號(hào)等在系統(tǒng)啟動(dòng)時(shí)自動(dòng)加載的,用戶(hù)實(shí)際沒(méi)有控制權(quán)的程序。這些程序,一部分來(lái)自微軟,一部分來(lái)自設(shè)備制造商,還有一部分來(lái)自移動(dòng)通訊服務(wù)商(PPC Phone)。
除設(shè)置中所顯示的總?cè)萘客猓溆嗖糠值膬?nèi)存被固定用作了其它方面的用途而并未被系統(tǒng)設(shè)置里的內(nèi)存狀況顯示所計(jì)算在內(nèi)。這是用戶(hù)所不能控制的并且更為隱蔽的另一部分被占內(nèi)存。
這部分隱蔽的被占內(nèi)存主要被用在了五個(gè)方面。
1. 緩存池(Page Pool)
系統(tǒng)運(yùn)行程序,程序代碼和代碼所產(chǎn)生的數(shù)據(jù)都會(huì)消耗內(nèi)存。對(duì)于NOR型flash ROM的設(shè)備,代碼可以從ROM里直接被CPU調(diào)用執(zhí)行。這種執(zhí)行方式叫作“立即執(zhí)行”或“就地執(zhí)行” (XIP: execute in place)。對(duì)于NAND型flash ROM的設(shè)備,程序代碼必須首先被調(diào)入內(nèi)存,然后再?gòu)膬?nèi)存里被CPU逐條執(zhí)行。如果沒(méi)有緩存池,代碼會(huì)首先被全部調(diào)入普通的內(nèi)存里。緩存池實(shí)際上就是起到了限制執(zhí)行代碼時(shí)占用過(guò)多內(nèi)存的作用,也就是說(shuō),超出了緩存池容量的其余代碼不會(huì)被預(yù)先調(diào)入內(nèi)存,而只有需要時(shí)再行調(diào)入。
WM5系統(tǒng)的NAND型ROM設(shè)備的緩存池大小一般是4.5 MB。
2. 射頻協(xié)議棧(Radio Stack)
在PPC手機(jī)中,有相當(dāng)部分的代碼是用于和發(fā)射基站間的通訊。在某些設(shè)備里,這一無(wú)線通訊模塊有自己的RAM和ROM。而在其它設(shè)備里,無(wú)線通訊模塊的代碼是被存儲(chǔ)在系統(tǒng)的ROM里的。這樣,它或者是就地執(zhí)行,或者是調(diào)入內(nèi)存執(zhí)行。如果是后者,那么這部分被占內(nèi)存會(huì)直接從總的內(nèi)存中劃掉而不被計(jì)入系統(tǒng)設(shè)置里所顯示的總的內(nèi)存容量的。
這一模塊(射頻協(xié)議棧)占用約 4 MB內(nèi)存。
3. 直接存取內(nèi)存區(qū)(DMA Buffers)
一些硬件可以不經(jīng)CPU的處理和控制而自行寫(xiě)內(nèi)存,這叫作直接性?xún)?nèi)存讀寫(xiě)(DMA: Direct Memory Access)。這塊內(nèi)存區(qū)在系統(tǒng)加載前已被事先分出(而不受CPU支配)。這種方式的優(yōu)點(diǎn)在于能夠極高效和通常更低能耗地進(jìn)行數(shù)據(jù)的傳送。在早期的 PPC里,這主要用在音頻采集上,通常占用內(nèi)存很小。現(xiàn)在,它被用于視頻采集,從而也占用了大得多的內(nèi)存。
機(jī)器的生產(chǎn)商會(huì)根據(jù)機(jī)器在應(yīng)用方面的定位來(lái)調(diào)整這部分內(nèi)存的大小。譬如如果主要用途是預(yù)設(shè)為拍照,則會(huì)需要較小的DMA內(nèi)存,而如果考慮用于攝像,則需要占用大得多的內(nèi)存,而如果是視頻會(huì)議的話,所需內(nèi)存會(huì)更大。
直接存取內(nèi)存區(qū)的容量從300 KB 到 6 MB 不等。對(duì)于把視頻采集作為主要應(yīng)用方向之一的機(jī)器,可能會(huì)在4 MB左右。
4. 核心區(qū)(XIP Kernel)
操作系統(tǒng)最核心的部分需要就地執(zhí)行(XIP)的模式。對(duì)于NAND型ROM的設(shè)備,在系統(tǒng)加載時(shí),需要把這部分代碼首先載入內(nèi)存,并從這部分代碼開(kāi)始執(zhí)行后面的任務(wù)。由于系統(tǒng)正在運(yùn)行時(shí)還無(wú)法分辨正被執(zhí)行的這部分核心代碼是從ROM還是RAM執(zhí)行的,所以它會(huì)假設(shè)是從ROM里執(zhí)行的從而把這部分內(nèi)存排除在外。
核心區(qū)占用約 1.5 到 2 MB 大小。
5. 幀緩沖區(qū)(the Frame Buffer)
這部分內(nèi)存專(zhuān)門(mén)用作存儲(chǔ)當(dāng)前屏幕上顯示的一切信息。大多數(shù)設(shè)備,每個(gè)像素占用兩個(gè)字節(jié)(16-bit 65535種色彩)。所以一般320x240的QVGA屏需要150 KB,而640x480的VGA屏需要600 KB。有時(shí)為了顯示性能方面的原因,機(jī)器 會(huì)設(shè)置兩個(gè)幀緩沖區(qū),這樣就會(huì)占用1.2 MB的內(nèi)存容量。
最后來(lái)做一下加法: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里所占用的未顯示內(nèi)存范圍在6.45-13.7 MB,PPC Phone會(huì)多占用約4 MB。而基于NOR型flash ROM的機(jī)器可能會(huì)減少約4.5 MB (PPC) 的內(nèi)存占用。其它方面,有攝像頭尤其更強(qiáng)調(diào)動(dòng)態(tài)視頻攝錄效果的設(shè)備占用容量會(huì)更大,VGA顯示的機(jī)器也會(huì)高一些。
舉例:手頭的HP iPAQ 21x (PPC,640x480 VGA,無(wú)攝像頭,WM6,NAND flash ROM): 128 MB(總)-121.40(顯示)=6.6 MB,與上面的估算結(jié)果相當(dāng)符合。對(duì)于現(xiàn)在市場(chǎng)上一般配置的PPC手機(jī)(基本都是基于NAND型flash ROM的設(shè)備),這部分未顯示內(nèi)存大約會(huì)占用13-15 MB的空間。
另外,需要說(shuō)明的個(gè)例是HTC Touch DiaMond。該款機(jī)器號(hào)稱(chēng)有192 MB DDR SDRAM,但實(shí)際上其中的64 MB是內(nèi)置于CPU中的顯存(供3D圖形顯示用,有說(shuō)亦用于無(wú)線模塊的),所以對(duì)整個(gè)系統(tǒng)而言,可資利用的有效內(nèi)存仍只有128 MB(內(nèi)存利用上在圖形顯示方面或許會(huì)節(jié)省一些---未知)。因此與其它128 MB RAM的類(lèi)似配置的設(shè)備相比,鉆石機(jī)的用戶(hù)并沒(méi)有發(fā)現(xiàn)在可用RAM上有什么優(yōu)勢(shì)。HTC Touch HD的標(biāo)稱(chēng)RAM容量也存在同樣的數(shù)字游戲。
最后強(qiáng)調(diào)的一點(diǎn)是,在對(duì)內(nèi)存的利用和分配上,機(jī)器生產(chǎn)商總可能會(huì)針對(duì)不同型號(hào)機(jī)器的某些組件作一定調(diào)整,也總會(huì)在預(yù)載應(yīng)用軟件與速度及用戶(hù)可利用的內(nèi)存資源上作出取舍。所以即使對(duì)于具有相同操作系統(tǒng)和同樣標(biāo)稱(chēng)內(nèi)存但不同款型的機(jī)器,機(jī)器啟動(dòng)后的用戶(hù)可用內(nèi)存也可能會(huì)相差很大。
【關(guān)于Flash ROM的基本常識(shí)】
在性能上,RAM的讀寫(xiě)速度非常快(讀、寫(xiě)速度基本相當(dāng)),由于需要頻繁刷新,也非常耗電(所以對(duì)掌上設(shè)備而言,RAM并非完全是多多益善,過(guò)多閑置無(wú)用的RAM會(huì)耗掉大量不必要的電力);而ROM的讀寫(xiě)速度相比RAM慢很多,尤其是寫(xiě)入速度更慢,但耗電較少(由于不需要高頻刷新來(lái)維持記憶)。
所以應(yīng)用上,ROM主要是用以存儲(chǔ)程序和數(shù)據(jù),而RAM主要用以運(yùn)行程序。
Flash ROM 按照實(shí)現(xiàn)的整個(gè)電路邏輯結(jié)構(gòu)及相應(yīng)存儲(chǔ)單元擦寫(xiě)操作的不同分為NAND和NOR兩種類(lèi)型。NOR型提供完整的尋址與資料總線,并允許隨機(jī)存取內(nèi)存上的任何區(qū)域,因而其特點(diǎn)是讀取數(shù)據(jù)快,但需要較長(zhǎng)的時(shí)間進(jìn)行擦寫(xiě)。NAND型沒(méi)有隨機(jī)存取外部尋址總線,必須以區(qū)塊性的方式進(jìn)行讀取。與NOR型相比,它具有具有較快的擦寫(xiě)時(shí)間,但數(shù)據(jù)讀取的速度較慢。NAND型ROM的每個(gè)儲(chǔ)存單元的面積也更小,這使得NAND Flash相較于NOR Flash具有較高的儲(chǔ)存密度與較低的單位存儲(chǔ)成本。同時(shí)它的可重復(fù)擦寫(xiě)次數(shù)也高出NOR Flash一個(gè)量級(jí)。所以現(xiàn)在所有的存儲(chǔ)卡都是NAND型的flash ROM。
NOR型ROM更類(lèi)似傳統(tǒng)的ROM,支持CPU進(jìn)行字節(jié)級(jí)別的讀取。而NAND型ROM則類(lèi)似于硬盤(pán),適合作為大量數(shù)據(jù)存儲(chǔ)介質(zhì)。所以對(duì)于NOR型 ROM,CPU可以進(jìn)行就地執(zhí)行(XIP)而省去了把代碼先讀入RAM的步驟,載入和運(yùn)行代碼的速度更快,并可減少所需的RAM空間。
在實(shí)際系統(tǒng)中,XIP只能用于底層的(操作系統(tǒng))代碼。對(duì)于后續(xù)安裝的被列入文件系統(tǒng)的程序,是必須載入RAM才能夠被CPU執(zhí)行的。
對(duì)于NOR flash ROM和XIP的關(guān)系再補(bǔ)充一點(diǎn)的是,并非NOR型flash ROM都會(huì)選擇XIP方式。因?yàn)閷?duì)于一塊flash ROM芯片不能同時(shí)進(jìn)行讀/寫(xiě)操作,所以如果代碼和數(shù)據(jù)都裝在一個(gè)ROM上,既要XIP,又要同時(shí)進(jìn)行數(shù)據(jù)寫(xiě)入的話,實(shí)現(xiàn)上相當(dāng)麻煩(因?yàn)閷?xiě)入時(shí)無(wú)法從 ROM讀入代碼,所以對(duì)中斷的處理會(huì)很復(fù)雜)。所以解決方法或者是不用XIP,或者是將XIP代碼和數(shù)據(jù)區(qū)分離在兩個(gè)ROM上,或者采用比較復(fù)雜的技術(shù)來(lái)實(shí)現(xiàn)(IPSM)。
【關(guān)于設(shè)備里ROM的占用情況】
應(yīng)有的朋友的要求,這里補(bǔ)充說(shuō)明一下關(guān)于ROM的占用情況。對(duì)于ROM占用,由于沒(méi)有黑幕(除引導(dǎo)記錄和文件分配表外),所以情形相對(duì)簡(jiǎn)單一些。
與RAM的情況有些類(lèi)似,在系統(tǒng)設(shè)置里,ROM,即存儲(chǔ)內(nèi)存(Storage)的總?cè)萘颗c設(shè)備的標(biāo)定ROM相比有一個(gè)幾十兆的大缺口。舉例而言,HP iPAQ 210系列,WM6.0, 標(biāo)定256 MB ROM, 系統(tǒng)設(shè)置顯示總存儲(chǔ)內(nèi)存為162.30 MB, 有近96 MB的差值。但發(fā)現(xiàn)并解釋這個(gè)差值則簡(jiǎn)單明了得多。這部分系統(tǒng)設(shè)置沒(méi)有顯示的空間是從軟件意義上來(lái)說(shuō)的真正的ROM(只讀)部分,文件系統(tǒng)沒(méi)有讀寫(xiě)的權(quán)力,是系統(tǒng)的操作系統(tǒng)和備份文件以及預(yù)裝在ROM部分的程序(包括來(lái)自微軟,設(shè)備制造商以及移動(dòng)服務(wù)商,對(duì)于自制的系統(tǒng)還包括ROM包里的其它程序和數(shù)據(jù)),主要裝在\windows目錄下。用資源管理器查看屬性會(huì)發(fā)現(xiàn)有ROM屬性,對(duì)文件無(wú)法修改,也無(wú)法復(fù)制--操作系統(tǒng)是禁止對(duì)ROM文件的操作的。所以操作系統(tǒng)在顯示時(shí)把這部分干脆拿了出來(lái),因?yàn)檫@是文件系統(tǒng)無(wú)法使用的部分。修改這部分文件的途徑只有通過(guò)刷ROM來(lái)重寫(xiě)。硬啟時(shí)設(shè)備也是通過(guò)這部分文件來(lái)恢復(fù)系統(tǒng)到初始狀態(tài)。
硬啟后會(huì)發(fā)現(xiàn)存儲(chǔ)內(nèi)存的已使用部分并不是0,這是根據(jù)ROM文件恢復(fù)的,文件系統(tǒng)內(nèi)可以讀寫(xiě)的部分操作系統(tǒng)的文件。現(xiàn)在我們做加法。把所有設(shè)備上的存儲(chǔ)空間(除存儲(chǔ)卡外)加起來(lái)。以手頭的iPAQ為例,用Resco Explorer,把所有目錄和文件全選(包括"iPAQ File Store“,這實(shí)際是從系統(tǒng)的flash ROM分出的一個(gè)存儲(chǔ)卡結(jié)構(gòu),在硬啟時(shí)不會(huì)被刷新),去掉SD Card和CF Card(如果有的話)以及RAM Disk (RAM模擬的)為111.15 MB。系統(tǒng)設(shè)置里的空閑存儲(chǔ)空間為134.83 MB。總的ROM容量就是:111.15+134.83 = 245.98 MB。
這個(gè)數(shù)字接近256 MB了,但仍有約10 MB的差距。
這里可以想到的有兩種解釋。
第一,是由文件系統(tǒng)的結(jié)構(gòu),尤其是大量小文件造成的。
一般寫(xiě)入一個(gè)1個(gè)字節(jié)甚至0字節(jié)的文件,雖然查看發(fā)現(xiàn)全部文件的總字節(jié)數(shù)沒(méi)有增加,但實(shí)際上這個(gè)文件已經(jīng)占用了一個(gè)區(qū),比如512個(gè)字節(jié)的空間,所以系統(tǒng)的可用空間實(shí)際已經(jīng)減少了512個(gè)字節(jié)。對(duì)于大文件來(lái)講,這個(gè)比例會(huì)很低,但對(duì)小文件,這個(gè)浪費(fèi)的空間比例很高,尤其是很多小文件時(shí),浪費(fèi)的總的空間就相當(dāng)可觀了。這個(gè)現(xiàn)象在硬盤(pán)上尤其突出,因?yàn)樗拿總€(gè)最小的文件單位-簇的空間相對(duì)更大,所以比如1個(gè)字節(jié)的文件,會(huì)占用4KB或更大(fat, fat32)的有效空間。
但WM系統(tǒng)的ROM(只讀)文件使用的不是一般的文件體系,而是壓縮的形式,即文件大小是多少,就會(huì)實(shí)際占用多少(關(guān)于這一點(diǎn),見(jiàn)下一部分的說(shuō)明)。這樣就只能由第二點(diǎn)來(lái)解釋。
第二,ROM的總空間的確小于標(biāo)定容量。
這里涉及到存儲(chǔ)介質(zhì)容量的單位問(wèn)題。在計(jì)算機(jī)應(yīng)用方面,1KB=1024字節(jié),而不是1000, 1MB=2^20, 1GB=2^30。但是存儲(chǔ)介質(zhì)(硬盤(pán),存儲(chǔ)卡等)的生產(chǎn)廠家在宣傳產(chǎn)品時(shí),偷換了單位,即標(biāo)定容量的1MB=1,000,000 字節(jié),而不是2^20=1,048,576 字節(jié),1GB=1,000,000,000字節(jié),而不是2^30=1,073,741,824字節(jié),從而變相降低了成本。所以買(mǎi)回來(lái)的號(hào)稱(chēng)80G的硬盤(pán),計(jì)算機(jī)上顯示的可用空間只有70多GB。存儲(chǔ)卡也是如此。(少5% (M為單位)到 7%(G為單位))
所以對(duì)于和存儲(chǔ)卡在物理上一致的系統(tǒng)內(nèi)置ROM,出現(xiàn)同樣的數(shù)字游戲也并不新奇。
另外就是flash ROM的實(shí)際容量對(duì)于比如每個(gè)卡可能都不同,有一個(gè)波動(dòng)范圍,flash ROM在生產(chǎn)時(shí)也會(huì)留有一定的冗余空間以備出現(xiàn)壞區(qū)時(shí)備用。
所以考慮第二點(diǎn)原因,245.98 X 1.024^2= 257.93 MB,這與標(biāo)定的256 MB的ROM總?cè)萘渴腔疚呛系摹?br>
注:關(guān)于這部分的討論可能有錯(cuò)漏,需參考更多資料核實(shí)。
【 關(guān)于WM系統(tǒng)“\Windows”目錄下的兩類(lèi)文件 】
搞清這一點(diǎn),其一是為上一部分關(guān)于ROM空間的分析作補(bǔ)充說(shuō)明,其二是為了闡明為什么通常無(wú)法對(duì)\Windows系統(tǒng)里的ROM屬性的文件進(jìn)行常規(guī)的文件操作,為什么對(duì)有些系統(tǒng)文件(非ROM屬性)卻可以。
實(shí)際上WM系統(tǒng)對(duì)內(nèi)置ROM的使用,的確是分成了兩部分區(qū)別對(duì)待的。其一是文件(Files)部分,其二是模塊(Modules)部分。
文件部分與磁盤(pán)、存儲(chǔ)卡等用來(lái)存放文件的存儲(chǔ)空間的性質(zhì)和文件結(jié)構(gòu)是一類(lèi)的,原則上用戶(hù)具有完全的讀寫(xiě)權(quán)力。操作系統(tǒng)里所有圖片及多媒體文件都被存放在這一部分。這也是為什么我們可以隨意更換桌面圖片--盡管桌面圖片文件也是屬于操作系統(tǒng)自帶的文件之一。一些程序也是以通常的(可執(zhí)行)文件形式存放在這部分的,所以也會(huì)發(fā)現(xiàn)對(duì)某些“\Windows“的可執(zhí)行文件我們也可以隨意處置。(博主:假如我刪除了這類(lèi)文件,在硬重置的時(shí)候它們會(huì)被恢復(fù)么?如果會(huì),那如何解釋?zhuān)?/span>)
對(duì)于第二部分的文件,則用常規(guī)的方法來(lái)進(jìn)行操作一般都是無(wú)能為力的。查看屬性就會(huì)發(fā)現(xiàn)這類(lèi)文件都標(biāo)有一個(gè)“ROM”屬性,而且無(wú)法更改。實(shí)際上,這部分程序文件在被刷入flash ROM前,是經(jīng)過(guò)了特別處理的。大多數(shù)文件的文件頭已被截去,文件代碼和數(shù)據(jù)在ROM里的存放地址也是完全固定的。所以從存放的形式來(lái)說(shuō),這些程序是可以直接被運(yùn)行而不必先被調(diào)入RAM的。即便不需要XIP,這種存儲(chǔ)形式也提高了代碼載入、執(zhí)行的效率。另外,這些文件本身變小了,而且不同文件能夠以更緊湊的形式存放在這個(gè)部分,從而節(jié)省了ROM空間。
存放的形式也決定了即使可以把ROM屬性的程序文件拷貝出來(lái)(有工具可以做到),也無(wú)法立即使用它們--必須再利用工具重新生成一個(gè)正常文件(加上文件頭),同時(shí)還要考慮到有些程序可能針對(duì)特定的設(shè)備進(jìn)行過(guò)代碼的優(yōu)化與壓縮--這決定了這不是一件直截了當(dāng),總能成功的活兒。 所以通常制作的新ROM總是非常依賴(lài)于特定機(jī)型的。