WinCE執行緒和記憶體管理之記憶體管理

2021-04-13 00:49:46 字數 3329 閱讀 4954

三、記憶體管理

同其它windows作業系統一樣,windows ce.net也支援32位虛擬記憶體機制、按需分配記憶體和記憶體對映檔案等。但是與其它windows作業系統又有明顯的不同。 畢竟windows ce是一種嵌入式實時性的作業系統,在記憶體管理方面必須要比其它windows作業系統更節約物理記憶體和虛擬位址空間。在記憶體管理api方面,為了便於移植程式,windows ce和其它windows作業系統函式宣告基本一致,這使乙個在其它windows下開發的程式設計師可以直接使用早就熟悉的api函式, 但是ce下記憶體管理的原理開發者還是應該熟悉的。

1、rom和ram

對於早期採用的儲存裝置一般採用rom + ram ,在rom中存放的所有檔案可以是壓縮的也可以是不壓縮的,這取決於oem(原始裝置製造商)。oem在定製ce核心時可以設定乙個標誌告訴rom映象製作工具(romimage.exe)是否壓縮檔案。對於rom中存放的模組(dll、exe檔案)來說,如果是壓縮的,模組在執行前先解壓並全部存放到ram中。如果是不壓縮的,並且rom介質支援線性訪問(line-accessed),就可以本地執行(executed in place,縮寫為xip)。利用本地執行方式執行應用程式、dll的優點是:採用這種技術在載入exe或dll時,其中的**段資料不載入到物理記憶體中,核心只是分配虛擬位址空間給**段,當執行**時核心會到實際存放在rom儲存裝置上的檔案中尋找**並執行。採用這樣的技術既可以節省可用記憶體又可以減少載入的時間。但是這種技術有一定的侷限性,如果要讓cpu到rom中去尋找**執行,那麼rom介質必須支援線性訪問,這就要求rom介質支援線性訪問,而不是塊訪問。xip這種載入方式的缺點就是執行速度相對較慢,cpu訪問rom的速度肯定遠慢於訪問ram的速度。

基於windows ce的產品開始採用flash、ide等永久儲存裝置時,核心映象(.bin)和其它應用程式檔案開始存放到永久儲存裝置中而不是rom中,這不僅僅是因為硬碟或者flash的i/o速度比rom快,更因為現在的核心包含的功能多並且檔案數量增加,因而需要的儲存空間很大,一般都在20mb左右。再加上其它開發商開發的應用程式檔案,要求的空間就更大了。ce啟動時核心映象由引導程式解壓並將系統檔案載入到ram的nk,nk是在config.bib中定義的一段ram區域,專用於儲存核心映象解壓出來的所有檔案。windows ce將nk看作是rom,當執行乙個應用程式時,ce核心將這個應用程式需要的系統dll(在nk中儲存)載入到slot 1(位址範圍0x0200 0000-0x03ff ffff,在windows ce.net中slot 1專用於xip dll使用)。slot 1是一段虛擬位址,當cpu執行dll的**時,cpu會根據位址對映關係到nk中尋找實際的**執行,因為nk是一段實際的物理記憶體,i/o速度非常快,所以相對於在rom中執行,dll的執行效率得到很大提高。

非xip dll在載入時ce核心會在呼叫dll的程序的位址空間中申請足夠大的位址空間,並且執行**時按需提交物理記憶體。

ram和rom檔案系統是windows ce預設的檔案系統。ram檔案系統的優點是支援檔案壓縮、支援事務機制(和資料庫中的事務機制相似)、資料i/o較快。windows ce.net啟動時把除了nk以外的ram分為物件儲存(object store)區域和應用程式記憶體(program memory)區域,並且預設各使用一半ram。在基於windows ce的裝置沒有採用永久儲存器之前,物件儲存的作用相當於永久儲存器,物件儲存區域採用ram檔案系統來儲存檔案,物件儲存中可以儲存的物件型別有檔案、目錄、資料庫、記錄、資料庫卷。預設在物件儲存中儲存的物件全部是壓縮的。當整個系統關閉時,裝置的電源還繼續提供電力給ram,這樣物件儲存中儲存的所有資料就不會丟失。應用程式記憶體區域留給所有應用程式執行時使用。基於windows ce的裝置採用永久儲存器後,物件儲存的作用就被永久儲存器替代了,所以採用永久儲存器後,應該減小物件儲存區域的大小。如果定製的windows ce的核心包含了資源管理器(explorer.exe),那麼開啟「控制面板」,在「系統」-「記憶體」中,可以調節這兩個儲存區域的比例。滑塊向左,則釋放物件儲存區域的一些可用記憶體並將這些記憶體劃到應用程式記憶體區域中。滑塊向右則相反。

2、記憶體結構

windows ce.net只能管理512mb的物理記憶體和4gb大小的虛擬位址空間。不同的cpu記憶體管理方法也不同。對於mips和shx系列cpu來說,物理位址對映是由cpu完成的,ce核心可以直接訪問512mb的物理記憶體。對於x86系列和arm系列的cpu來說,在核心啟動過程中它會將現有物理記憶體位址全部對映到0x8000 0000以上的虛擬位址空間中供核心以後使用。oem可以通過oemaddresstable來詳細定義虛擬位址和實體地址的對映關係。oemaddresstable本身並不是乙個檔案,它只是存在於其它檔案中描述虛擬位址和實際實體地址的對映關係的資料。比如檔案oem init.a**中包含一段**:dd 80000000h, 0, 04000000h 。它表示將整個實體地址(0x0400 0000=64mb)共64mb對映到虛擬位址從0x8000 0000到0x8400 0000中。關於oemaddresstable我將在以後關於pb的文章中講述。

整個4gb虛擬位址空間主要劃分為兩部分,從0x8000 0000以上為核心使用部分,0x8000 0000以下為應用程式使用部分。詳細見下表:

位址範圍

用途 0x0000 0000到0x41ff ffff

由所有應用程式使用。共33個槽,每個槽佔32mb。槽0(slot 0)由當前占有cpu的程序使用。槽1由xip dll使用。其它槽用於程序使用,每個程序占用乙個槽。

0x4200 0000到0x7fff ffff

由所有應用程式共享的區域。32mb位址空間有時不能夠滿足一些程序的需求。那麼程序可以使用這個範圍的位址空間。在這個區域裡應用程式可以建堆、建立記憶體對映檔案、分配大的位址空間等。

0xa000 0000到0xbfff ffff

在這個範圍核心重複定義0x8000 0000到0x9fff ffff之間定義的物理位址對映空間。區別是在這範圍對映的虛擬位址空間不能夠用於緩衝。

我舉例來說明:假設乙個產品有64mb物理記憶體。如上文所述定義好oemaddresstable後。核心啟動後乙個物理位址對映空間範圍在0x8000 0000到0x8400 0000,那麼核心會從0xa000 0000到0xa400 0000定義乙個同樣範圍的位址空間,這個位址空間和0x8000 0000到0x8400 0000對映到相同的實體地址。但這個虛擬位址空間不能夠用於緩衝。

0xc000 0000到0xc1ff ffff

系統保留空間

0xc200 0000到0xc3ff ffff

核心程式nk.exe使用的位址空間。

0xc400 0000到0xdfff ffff

0xe000 0000到0xffff ffff

核心使用的虛擬位址。當核心需要大的虛擬位址空間時,會在這個範圍內分配。

圖1 windows ce.net記憶體結構

記憶體管理之記憶體定址

記憶體定址 三種記憶體位址 邏輯位址 logical address 包含機器語言指令中用來指定乙個運算元或一條指令的位址 線性位址 linear address 線性位址也稱為虛擬位址 virtual address 實體地址 physical address 用於記憶體晶元級記憶體單元定址,他們...

winCE6 0 學習筆記之記憶體管理

wince 6.0 是乙個32 位的作業系統,提供了 4gb的虛擬位址空間,其中系統核心使用高區的 2gb,使用者程序使用低區的 2gb。我們的記憶體管理單元 memory management unit 用來管理虛擬記憶體和實際物理記憶體的對映。在wince 6.0 中,虛擬記憶體的頁面有三種情況...

c 之記憶體管理

c 使用3 種不同解決方案儲存資料,區別是資料保留在記憶體中的時間 兩種儲存持續性為自動 自動變數和暫存器變數 register 沒有記憶體位址 堆疊 在函式外定義的變數和使用關鍵字static定義的變數的儲存持續性都為靜態.分為 3 外部鏈結性,內部鏈結性和無鏈結性 所有靜態變數都有下面的兩個初始...