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