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的“文件”,但你還是無法讀取它或者將它“復制”出來。

如上圖,主內存分兩類,一是“存儲”,一是“程序”,其實也就是前面提到的“對象存儲”和“程序內存”了。也許你發覺“程序”的總內存只有460.02M,而不是硬件上標稱的576M,要解釋這個可相當不容易,具體參考我前面轉載的一篇文章:
http://www.shnenglu.com/guogangj/archive/2010/12/19/136927.html