資料介紹
三、內存管理
同其它Windows操作系統一樣,Windows CE.NET也支持32位虛擬內存機制、按需分配內存和內存映射文件等。但是與其它Windows操作系統又有明顯的不同。畢竟Windows CE是一種嵌入式實時性的操作系統,在內存管理方面必須要比其它Windows操作系統更節約物理內存和虛擬地址空間。在內存管理API方面,為了便于移植程序,Windows CE和其它Windows操作系統函數聲明基本一致,這使一個在其它Windows下開發的程序員可以直接使用早就熟悉的API函數, 但是CE下內存管理的原理開發者還是應該熟悉的。
1、ROM和RAM
最早的基于Windows CE的民用產品,采用的存儲設備都是ROM + RAM ,ROM保存CE內核文件、應用程序,而RAM用于內核、所有應用程序運行時使用,關閉電源時必須給RAM提供電力來保存系統配置信息、用戶產生的文件等。為了適應這樣的存儲硬件,CE采用了ROM文件系統和RAM文件系統。在ROM中存放的模塊可以是壓縮的,也可以是不壓縮的,這取決于OEM。OEM在定制內核時可以設置是否壓縮模塊。如果是壓縮的,模塊在運行前先解壓并全部存放到RAM中。如果是不壓縮的,就本地執行(XIP,executed in place)。本地執行和其它Windows操作系統下執行應用程序、DLL方式一致,也就是應用了內存映射文件技術。在這里我順便講一下。在啟動時應用程序或DLL的代碼段不加載到物理內存中,內核只是分配虛擬地址空間給代碼段,當執行代碼時內核會到實際存放在硬盤上的文件中尋找代碼并執行。采用這樣的技術既可以節省可用內存又可以減少加載的時間。請注意,操作系統首先會到為硬盤準備的緩沖區里讀取代碼數據,如果沒有就命令硬盤讀取應用程序文件數據到緩沖區。所以緩沖區設置大點是有好處的。Windows CE的本地執行就是采用這樣的技術來加載ROM內的應用程序和DLL的。所以Windows CE的DLL分為XIP DLL和非XIP DLL。這種加載方式的缺點就是執行相對較慢一點,如果用PB創建一個具有實時性特點的內核,一定不能選用XIP技術。
到后來基于Windows CE的產品開始采用FLASH、IDE等永久存儲設備時,文件系統又加了個FAT。內核文件和其它應用程序也可以存放到永久存儲設備中,內核由加載程序解壓并加載到RAM的對象存儲區域(object store),包含在內核中的所有系統應用程序文件和DLL文件都存放到這個區域。當執行一個應用程序時,內核將這個應用程序調用的系統DLL加載到Slot 1(0x0200 0000-0x03FF FFFF)。在Windows CE.NET中Slot 1專用于XIP DLL使用。
RAM文件系統專用于對象存儲。在以前的文章中曾經講過,它和ROM文件系統是Windows CE默認的文件系統。Windows CE啟動后把RAM分為對象存儲區域(object store)和應用程序內存區域(program memory)。對象存儲區域采用RAM文件系統來保存文件,一般用于保存內核解開的所有文件。應用程序內存區域留給所有應用程序運行時使用。在Windows CE下“控制面板”-“系統”-“內存”中,可以調節這兩個存儲區域的比例,滑塊向左,則釋放對象存儲區域的一些內存并將這些內存劃到應用程序內存區域中。滑塊向右則相反。
2、內存結構
Windows CE.NET只能管理512MB的物理內存和4GB大小的虛擬地址空間。不同的CPU內存管理方法也不同。對于MIPS和SHX系列CPU來說,物理地址映射是由CPU完成的,CE內核可以直接訪問512MB的物理內存。對于x86系列和ARM系列的CPU來說,在內核啟動過程中它會將現有物理內存地址全部映射到0x8000 0000以上的虛擬地址空間中供內核以后使用。OEM可以通過OEMAddressTable來詳細定義虛擬地址和物理地址的映射關系。OEMAddressTable本身并不是一個文件,它只是存在于其它文件中描述虛擬地址和實際物理地址的映射關系的數據。比如文件oem init.asm中包含一段代碼: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 這個范圍為用戶定義的靜態虛擬地址空間,但這個地址空間只能用于非緩沖使用。
利用OEMAddressTable定義物理地址映射空間后,每次內核啟動時這個范圍都不改變了,除非產品包含的物理內存容量發生變化。假如增加到128MB物理內存,那么物理地址映射空間也向后擴大了一倍。Windows CE.NET也允許用戶創建靜態的物理地址映射空間。用戶可以調用CreateStaticMapping函數或者NKCreateStaticMapping函數來映射某一段物理地址到0xC400 0000和0xE000 0000之間的某一個范圍。需要注意的是用這個函數創建的靜態虛擬地址只能夠由內核訪問,而且不能用于緩沖。
0xE000 0000到0xFFFF FFFF 內核使用的虛擬地址。當內核需要大的虛擬地址空間時,會在這個范圍內分配。
![Windows CE 進程、線程和內存管理三](/uploads/allimg/171108/2755807-1G10Q03455324.png)
圖1 Windows CE.NET內存結構
3、進程地址空間結構
進程地址空間結構如圖2所示。這個圖源至MSDN。Windows CE.NET同以前版本的Windows CE操作系統在進程地址空間上有所不同,以前的Windows CE把XIP DLL也加載到進程的32MB地址空間中,而Windows CE.NET把XIP DLL單獨加載到Slot 1中,這樣對于每個進程來說,它總的地址空間就大了一倍,也就是64MB。這個問題我在講解進程的時候提到過。
當一個應用程序啟動時,內核為這個程序選擇一個空閑的槽(Slot),并且加載所有的代碼、資源,并分配堆棧,加載DLL等。當這個進程得到CPU使用權時,它的整個地址空間被內核映射到Slot 0,也就是當前進程使用的地址空間,然后開始運行。圖中給出的地址實際上是經過映射到Slot 0之后的結構。從圖中可以看出,進程首先加載代碼段,因為每個進程最低部64KB作為保留區域,所以代碼段從0x0001 0000開始,內核為代碼段分配足夠的虛擬地址空間后,接著分配空間為只讀數據和可讀/可寫數據,接著分配空間為資源數據,之后分配空間為默認堆和棧。非XIP DLL從進程最高地址向下開始加載。非XIP DLL的加載按如下規則:內核先檢查要加載的DLL是否被其它進程加載過,如果加載過,就做一個地址的重定位。這樣就避免了整個系統內多次加載相同DLL。如果沒有加載過,就按照從槽的高地址到槽的低地址的順序查找空閑的地址空間。然后分配足夠的地址空間用于加載DLL。因為每個進程在執行前都要映射到Slot 0,而且進程使用的所有DLL可能來自不同的槽(Slot),為避免所有使用的DLL在映射到Slot 0中出現地址空間沖突的現象,內核的加載器(Loader)在加載DLL時會查找所有槽中加載的DLL的地址,保證在映射到Slot 0時不會發生地址沖突現象。假如系統內有兩個進程,進程A只加載了DLL A,進程B需要加載DLL A和DLL B,那么進程B會留出DLL A的地址空間,然后加載DLL B,也就是說進程B映射到Slot 0時,DLL A的地址空間和DLL B的地址空間是相鄰的,不會發生沖突。好在Windows CE下DLL都很小,而且一個應用程序使用的DLL多數是系統的DLL(存在于Slot 1)。所以目前來看進程的地址空間還夠用。
同其它Windows操作系統一樣,Windows CE.NET也支持32位虛擬內存機制、按需分配內存和內存映射文件等。但是與其它Windows操作系統又有明顯的不同。畢竟Windows CE是一種嵌入式實時性的操作系統,在內存管理方面必須要比其它Windows操作系統更節約物理內存和虛擬地址空間。在內存管理API方面,為了便于移植程序,Windows CE和其它Windows操作系統函數聲明基本一致,這使一個在其它Windows下開發的程序員可以直接使用早就熟悉的API函數, 但是CE下內存管理的原理開發者還是應該熟悉的。
1、ROM和RAM
最早的基于Windows CE的民用產品,采用的存儲設備都是ROM + RAM ,ROM保存CE內核文件、應用程序,而RAM用于內核、所有應用程序運行時使用,關閉電源時必須給RAM提供電力來保存系統配置信息、用戶產生的文件等。為了適應這樣的存儲硬件,CE采用了ROM文件系統和RAM文件系統。在ROM中存放的模塊可以是壓縮的,也可以是不壓縮的,這取決于OEM。OEM在定制內核時可以設置是否壓縮模塊。如果是壓縮的,模塊在運行前先解壓并全部存放到RAM中。如果是不壓縮的,就本地執行(XIP,executed in place)。本地執行和其它Windows操作系統下執行應用程序、DLL方式一致,也就是應用了內存映射文件技術。在這里我順便講一下。在啟動時應用程序或DLL的代碼段不加載到物理內存中,內核只是分配虛擬地址空間給代碼段,當執行代碼時內核會到實際存放在硬盤上的文件中尋找代碼并執行。采用這樣的技術既可以節省可用內存又可以減少加載的時間。請注意,操作系統首先會到為硬盤準備的緩沖區里讀取代碼數據,如果沒有就命令硬盤讀取應用程序文件數據到緩沖區。所以緩沖區設置大點是有好處的。Windows CE的本地執行就是采用這樣的技術來加載ROM內的應用程序和DLL的。所以Windows CE的DLL分為XIP DLL和非XIP DLL。這種加載方式的缺點就是執行相對較慢一點,如果用PB創建一個具有實時性特點的內核,一定不能選用XIP技術。
到后來基于Windows CE的產品開始采用FLASH、IDE等永久存儲設備時,文件系統又加了個FAT。內核文件和其它應用程序也可以存放到永久存儲設備中,內核由加載程序解壓并加載到RAM的對象存儲區域(object store),包含在內核中的所有系統應用程序文件和DLL文件都存放到這個區域。當執行一個應用程序時,內核將這個應用程序調用的系統DLL加載到Slot 1(0x0200 0000-0x03FF FFFF)。在Windows CE.NET中Slot 1專用于XIP DLL使用。
RAM文件系統專用于對象存儲。在以前的文章中曾經講過,它和ROM文件系統是Windows CE默認的文件系統。Windows CE啟動后把RAM分為對象存儲區域(object store)和應用程序內存區域(program memory)。對象存儲區域采用RAM文件系統來保存文件,一般用于保存內核解開的所有文件。應用程序內存區域留給所有應用程序運行時使用。在Windows CE下“控制面板”-“系統”-“內存”中,可以調節這兩個存儲區域的比例,滑塊向左,則釋放對象存儲區域的一些內存并將這些內存劃到應用程序內存區域中。滑塊向右則相反。
2、內存結構
Windows CE.NET只能管理512MB的物理內存和4GB大小的虛擬地址空間。不同的CPU內存管理方法也不同。對于MIPS和SHX系列CPU來說,物理地址映射是由CPU完成的,CE內核可以直接訪問512MB的物理內存。對于x86系列和ARM系列的CPU來說,在內核啟動過程中它會將現有物理內存地址全部映射到0x8000 0000以上的虛擬地址空間中供內核以后使用。OEM可以通過OEMAddressTable來詳細定義虛擬地址和物理地址的映射關系。OEMAddressTable本身并不是一個文件,它只是存在于其它文件中描述虛擬地址和實際物理地址的映射關系的數據。比如文件oem init.asm中包含一段代碼: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 這個范圍為用戶定義的靜態虛擬地址空間,但這個地址空間只能用于非緩沖使用。
利用OEMAddressTable定義物理地址映射空間后,每次內核啟動時這個范圍都不改變了,除非產品包含的物理內存容量發生變化。假如增加到128MB物理內存,那么物理地址映射空間也向后擴大了一倍。Windows CE.NET也允許用戶創建靜態的物理地址映射空間。用戶可以調用CreateStaticMapping函數或者NKCreateStaticMapping函數來映射某一段物理地址到0xC400 0000和0xE000 0000之間的某一個范圍。需要注意的是用這個函數創建的靜態虛擬地址只能夠由內核訪問,而且不能用于緩沖。
0xE000 0000到0xFFFF FFFF 內核使用的虛擬地址。當內核需要大的虛擬地址空間時,會在這個范圍內分配。
![Windows CE 進程、線程和內存管理三](/uploads/allimg/171108/2755807-1G10Q03455324.png)
圖1 Windows CE.NET內存結構
3、進程地址空間結構
進程地址空間結構如圖2所示。這個圖源至MSDN。Windows CE.NET同以前版本的Windows CE操作系統在進程地址空間上有所不同,以前的Windows CE把XIP DLL也加載到進程的32MB地址空間中,而Windows CE.NET把XIP DLL單獨加載到Slot 1中,這樣對于每個進程來說,它總的地址空間就大了一倍,也就是64MB。這個問題我在講解進程的時候提到過。
當一個應用程序啟動時,內核為這個程序選擇一個空閑的槽(Slot),并且加載所有的代碼、資源,并分配堆棧,加載DLL等。當這個進程得到CPU使用權時,它的整個地址空間被內核映射到Slot 0,也就是當前進程使用的地址空間,然后開始運行。圖中給出的地址實際上是經過映射到Slot 0之后的結構。從圖中可以看出,進程首先加載代碼段,因為每個進程最低部64KB作為保留區域,所以代碼段從0x0001 0000開始,內核為代碼段分配足夠的虛擬地址空間后,接著分配空間為只讀數據和可讀/可寫數據,接著分配空間為資源數據,之后分配空間為默認堆和棧。非XIP DLL從進程最高地址向下開始加載。非XIP DLL的加載按如下規則:內核先檢查要加載的DLL是否被其它進程加載過,如果加載過,就做一個地址的重定位。這樣就避免了整個系統內多次加載相同DLL。如果沒有加載過,就按照從槽的高地址到槽的低地址的順序查找空閑的地址空間。然后分配足夠的地址空間用于加載DLL。因為每個進程在執行前都要映射到Slot 0,而且進程使用的所有DLL可能來自不同的槽(Slot),為避免所有使用的DLL在映射到Slot 0中出現地址空間沖突的現象,內核的加載器(Loader)在加載DLL時會查找所有槽中加載的DLL的地址,保證在映射到Slot 0時不會發生地址沖突現象。假如系統內有兩個進程,進程A只加載了DLL A,進程B需要加載DLL A和DLL B,那么進程B會留出DLL A的地址空間,然后加載DLL B,也就是說進程B映射到Slot 0時,DLL A的地址空間和DLL B的地址空間是相鄰的,不會發生沖突。好在Windows CE下DLL都很小,而且一個應用程序使用的DLL多數是系統的DLL(存在于Slot 1)。所以目前來看進程的地址空間還夠用。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- C語言多線程的詳細教程資料說明 10次下載
- 關于進程與線程的解析PDF文件資料
- windows應用程序讀取進程的內存工具免費下載 1次下載
- Windows CE 進程、線程和內存管理一 0次下載
- Windows CE 進程、線程和內存管理二 0次下載
- Windows CE 電源管理解析 0次下載
- 基于Windows 操作系統內核驅動的多核CPU 線程管理 0次下載
- 用多線程實現GPS接收機與PDA在Windows CE下的串口通 5次下載
- 基于Windows CE MSCEComm控件的串行通信 4次下載
- Windows CE詳解 67次下載
- 基于Windows CE的GPS串行通信的實現
- 基于Windows CE的數控軟件開發與實現
- Windows線程、窗口與消息內在機制研究
- Windows CE下多線程串口通信
- WINDOWS核心編程 (pdf下載)
- Python中多線程和多進程的區別 447次閱讀
- 線程是什么的基本單位 進程與線程的本質區別 980次閱讀
- 進程和線程的概念及其區別 944次閱讀
- RTOS中的線程、進程和協程詳解 2032次閱讀
- 關于Python多進程和多線程詳解 872次閱讀
- Java多線程的用法 973次閱讀
- 程序中進程和線程的區別 696次閱讀
- 進程(線程)精細化控制中方法的使用 616次閱讀
- 什么是多線程 1304次閱讀
- 為什么在JVM中線程崩潰不會導致JVM進程崩潰呢? 697次閱讀
- 基于Windows NT多線程實現智能蓄電池遠程監控系統的設計 1860次閱讀
- 如何管理Linux 的內存分頁? 3818次閱讀
- 如何避免僵尸進程,多線程的實現原理 8350次閱讀
- Windows CE.NET 4.2下的串行通信技術講解 1706次閱讀
- 一文讀懂線程、進程、程序之間的不同 1356次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論