g_oalAddressTable數組相當於一張從物理地址到虛擬位址的映射表。該數組在\WINCE600\PLATFORM\SMDK6410\SRC\INC\oemaddrtab_cfg.inc檔案中。g_oalAddressTable數組的元素類型是一個結構體:
typedef struct{
UINT32 CA; // cached virtual address
UINT32 PA; // physical address
UINT32 size; // size, in MB bytes
} OAL_ADDRESS_TABLE, *POAL_ADDRESS_TABLE;
CA和PA分別是映射的虛擬位址和物理地址的起始地址,size是以MB為單位的容量大小。下面是飛淩OK6410開發板bsp中g_oalAddressTable表的具體實現:
g_oalAddressTable
DCD 0x80000000, 0x50000000, 256 ; 256 MB DRAM
DCD 0x90000000, 0x70000000, 4 ; SROM SFR
DCD 0x90400000, 0x71000000, 4 ; TZIC0
DCD 0x90800000, 0x72000000, 1 ; FIMG-3DSE SFR
DCD 0x90A00000, 0x74000000, 2 ; Indirect Host I/F
DCD 0x90C00000, 0x74300000, 2 ; USB Host
DCD 0x90E00000, 0x75000000, 2 ; DMA0
DCD 0x91000000, 0x76100000, 3 ; 2D Graphics
DCD 0x91300000, 0x77000000, 3 ; Post Processor
DCD 0x91600000, 0x78000000, 1 ; Camera I/F
DCD 0x91700000, 0x78800000, 1 ; JPEG
DCD 0x91800000, 0x7C000000, 5 ; USB OTG LINK
DCD 0x91D00000, 0x7D000000, 13 ; D&I(Security Subsystem Config) SFR
DCD 0x92A00000, 0x7E000000, 1 ; DMC,MFC,WDT,RTC,HIS TX/RX, Keypad, ADC, SYSCON
DCD 0x92B00000, 0x7F000000, 1 ; TZPC, AC97, I2S, I2C, UART, PWM, IrDA, GPIO, PCM, SPI
DCD 0x93000000, 0x00000000, 16 ; 32 MB SROM(SRAM/ROM) BANK 0
DCD 0x94000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1 = DM9000A
DCD 0x00000000, 0x00000000, 0 ; end of table
第一行:DCD 0x80000000, 0x50000000, 256 ; 256 MB DRAM
從這一行可以看出,我這塊開發板用的是256MB的RAM,為什麼物理地址映射的是0x50000000,這可以從S3C6410的資料手冊上找到一個“Device Specific Address Space”表:
從整體上看,g_oalAddressTable表中映射的虛擬位址在0x80000000至0x9FFFFFFF之間,因為這一塊虛擬位址在windows ce作業系統中用作(帶緩衝的)靜態映射。256M的物理RAM首先映射到0x80000000虛擬位址上。
第二行映射的物理地址是0x70000000,從S3C6410的資料手冊中同樣可以找到這是SROM SFR(特殊功能寄存器)的物理地址。
RAM從0x80000000虛擬位址開始,映射的容量大小是256M(256*1024*1024=0x1000000),所以這塊SROM映射的虛擬位址是緊挨著RAM。
看懂了前兩行,後面的也都沒什麼問題了,都是一些SFR或者外設的映射。g_oalAddressTable表是後續BootLoader和OAL構造一級頁表的根據。