********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2012.02.26
類別:WINCE系統開發
********************************LoongEmbedded********************************
1. WINCE記憶體模型
圖1 WINCE5.0和WINCE6.0記憶體模型對比圖
WINCE6.0之前的WINCE作業系統支援的進程最多隻有32個,並且每個進程只有32MB的虛擬記憶體空間,並且所有的進程共用相同的4GB地址空間。在WINCE6.0中,核心進程佔用4GB虛擬記憶體空間的高2GB,每個使用者進程都有獨立擁有低端的2GB虛擬記憶體空間,WINCE6.0支援的最大進程數達到32000個。進程數量的實際限制是受實體記憶體的大小來決定的。之前的WINCE版本,當前的應用在slot0執行,在WINCE6.0中,拋棄了原來的按Slot分配的方式,而是只要你需要你就可以建立記憶體,每個都有2GB的有效虛擬記憶體空間。
因為虛擬記憶體訪問是通過記憶體管理單元MMU轉化為實體記憶體的訪問,所以虛擬記憶體代碼是依賴於CPU的。ARM和x86處理器使用硬體頁表OEMAddressTable,所以硬體可以直接存取虛擬記憶體單元。WINCE支援的其他CPU使用一個軟體轉換旁路緩衝區TLB(translation look-aside buffer,可理解為頁表緩衝或是快表)miss handler,這需要完裡面填充虛擬記憶體的內容。
WINCE6.0基於下面的目標來設計虛擬記憶體管理:
⑴ 每個進程具有大容量的虛擬記憶體。
⑵ 不存在進程數量的限制。
⑶ 進程直接相互保護。
⑷ 最低程度降低使虛擬記憶體管理依賴CPU的代碼。
⑸ 有效虛擬記憶體分配
⑹ 有效TLB選中處理機制(miss handling)。
2. WINCE虛擬記憶體分配
下面來看WINCE6.0虛擬記憶體地址空間圖,先看核心模式下的虛擬記憶體地址空間分配。
圖2 核心模式虛擬記憶體空間分配圖
⑴ 靜態映射到虛擬記憶體,有緩衝的,範圍為0x80000000~0xA0000000,大小為512MB,通過CPU的cache直接存取實體記憶體,這段也就是BSP包中g_oalAddressTable映射表對應於實體記憶體到虛擬記憶體的映射關係。
⑵ 靜態映射到虛擬記憶體,無緩衝的,範圍為0xA0000000~OxBFFFFFFF,大小為512MB,不需要通過CPU的cache,直接存取實體記憶體。
⑶ 核心XIP DLLs所在的虛擬記憶體空間,範圍為0Xc0000000~0Xc7ffffff,大小為128MB。
⑷ Object Storage Service地區,範圍為0xC8000000~0Xcfffffff,大小為128MB,主要用於儲存RAM檔案系統、CEDB資料庫、基於RAM的註冊表和遺留的資料存放區(legacy data sore)。
⑸ 核心虛擬記憶體空間,為內中中裝載的所有服務和驅動所共用,範圍為0xD0000000~0xDFFFFFFF,大小為256MB,另外的256MB的虛擬記憶體空間取決於具體CPU,範圍為0xE0000000~0xEfffffff。
⑹具體CPU的虛擬記憶體空間,用於系統調用的陷阱捕獲地區,範圍為0xF0000000~0xFFFFFFFF,大小為256MB。
使用者模式下的虛擬記憶體地址空間分配如下
圖3 使用者模式虛擬記憶體空間分配圖
⑴每個進程的進程空間,主要用於可執行代碼和資料,使用者堆的虛擬記憶體分配,
範圍為0x00000000~0x3FFFFFFF,大小為1GB。
⑵ 使用者模式DLLs的代碼和資料空間,範圍為0x40000000~0x5FFFFFFF,大小為512MB。
⑶ 用於RAM-backed對應檔,範圍為0x60000000~0x6FFFFFFF,大小為256MB。
⑷ 共用系統堆,範圍為0x70000000~0x7FFFFFFF,大小為256MB。
一次只能映射一個虛擬記憶體,不能直接通過其他進程的虛擬記憶體地址來訪問它們的記憶體。虛擬記憶體地址只能在已被進程分配的情況下使用,比如應用程式不能在代碼中調用VirtualProtect函數來改變自己已有訪問保護。
free(可用):可被分配
reserved(保留):虛擬位址被保留,不能再分配。但不能被使用,因為它沒有被映射到實體記憶體。
committed(提交):映射到物理地址。