Windows CE系統中定義了兩種地址:物理地址和虛擬地址.在不同架構的CPU中地址管理有所區別:MIPS和SHx系列處理器,地址映射是由CPU完成的,CE內核管理1G的存儲(512M緩存,512M非緩存);而X86和ARM系列處理器則通過一個結構數組定義了從4G的虛擬地址到512M物理地址的映射關系.更詳細的解釋參見“Windows CE的存儲與地址映射技術學習”。上面提到的確立地址映射數據結構的名稱與其源代碼的位置和WinCE版本有關,與CPU體系結構也有關。比如,Windows CE 4.2的OEMAddressTable位于oeminit.asm(X86)或map.a(ARM)中。而Windows CE 5.0中ARM架構的CPU采用g_oalAddressTable來初始化MMU,其定義位于%WINCE500\PLATFORM\***\SRC\INC的oemaddrtab_cfg.inc文件中。
例如SMDK2410的映射表如下:
; TABLE FORMAT
; cached address, physical address, size
;------------------------------------------------------------------------------
g_oalAddressTable
DCD 0x80000000, 0x32000000, 32 ; 32 MB DRAM BANK 6
DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1
……
i.MX21平臺上虛實地址映射的實現比較特別,它通過三個文件共同實現,而不是僅靠一個文件就完成了。
首先,在%WINCE500\PLATFORM\iMX21_SD\Src\Inc\oemaddrtab_cfg.inc中完成了從虛擬地址到片選信號/存儲器/寄存器的映射:
; TABLE FORMAT
; cached address, physical address, size
;------------------------------------------------------------------------------
g_oalAddressTable
DCD 0x88000000, CSP_BASE_MEM_PA_CSD0, 64 ; Entry for 64MB on CSD0, sdram
DCD 0x80000000, CSP_BASE_MEM_PA_CS0, 64 ; 64MB CS0 flash
DCD 0x84000000, CSP_BASE_MEM_PA_CSD1, 64 ; Entry for CSD1
DCD 0x8C000000, CSP_BASE_MEM_PA_CS1, 64 ; 64MB CS1 Expanded IO
……
接著,位于%WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\FREESCALE\MX21\Inc目錄下的mx21_base_mem.inc(或mx21_base_mem.h)給出了片選信號和存儲器到物理地址的映射關系:
;; i.MX21 INTERNAL MEMORY MAP
;;-----------------------------------------------------------------------------
CSP_BASE_MEM_PA_AIPI1 EQU (0x10000000)
……
;;-----------------------------------------------------------------------------
;; i.MX21 EXTERNAL MEMORY MAP
;;-----------------------------------------------------------------------------
CSP_BASE_MEM_PA_CSD0 EQU (0xC0000000)
CSP_BASE_MEM_PA_CSD1 EQU (0xC4000000)
CSP_BASE_MEM_PA_CS0 EQU (0xC8000000)
CSP_BASE_MEM_PA_CS1 EQU (0xCC000000)
……
類似的,%WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\FREESCALE\MX21\Inc目錄下的mx21_base_regs.inc(或mx21_base_mem.h)給出了設備寄存器到物理地址的映射:
……
// AIPI1 periperhals
#define CSP_BASE_REG_PA_AIPI1 (0x10000000)
……
// Non-AIPI Peripherals
#define CSP_BASE_REG_PA_AITC (0x10040000)
#define CSP_BASE_REG_PA_ROMPATCH (0x10041000)
#define CSP_BASE_REG_PA_SMN (0x10042000)
#define CSP_BASE_REG_PA_SCM (0x10043000)
#define CSP_BASE_REG_PA_CSI (0x80000000)
#define CSP_BASE_REG_PA_BMI (0xA0000000)
#define CSP_BASE_REG_PA_SDRAMC (0xDF000000)
……
經過這樣從虛擬地址---片選信號/存儲器/寄存器---物理地址的轉換,虛擬地址和物理地址間就建立了映射關系,如下表所示:
虛擬地址, 片選信號/存儲空間/寄存器, 物理地址
DCD 0x88000000, CSP_BASE_MEM_PA_CSD0, 0xC0000000
DCD 0x84000000, CSP_BASE_MEM_PA_CSD1, 0xC4000000
DCD 0x80000000, CSP_BASE_MEM_PA_CS0, 0xC8000000
DCD 0x8C000000, CSP_BASE_MEM_PA_CS1, 0xCC000000
DCD 0x90000000, CSP_BASE_MEM_PA_CS2, 0xD0000000
DCD 0x91000000, CSP_BASE_MEM_PA_CS3, 0xD1000000
DCD 0x92000000, CSP_BASE_MEM_PA_CS4, 0xD2000000
DCD 0x93000000, CSP_BASE_MEM_PA_CS5, 0xD3000000
DCD 0x94000000, CSP_BASE_MEM_PA_PCMCIA_CF_IO, 0xD4000000
DCD 0x98000000, CSP_BASE_REG_PA_AIPI1, 0x10000000
DCD 0x98100000, CSP_BASE_REG_PA_CSI, 0x80000000
DCD 0x98200000, CSP_BASE_REG_PA_BMI, 0xA0000000
DCD 0x98300000, CSP_BASE_REG_PA_SDRAMC, 0xDF000000
DCD 0x98400000, CSP_BASE_MEM_PA_VRAM, 0xFFFFE800