大家在看Nboot与Eboot的源程序时,会发现里面有两种地址:虚拟地址与物理地址,虚拟地址是你在程序中用的地址,而物理地址则是RAM中的实际地址。在Bootloader里,可以直接使用物理地址,但当WinCE启动之后,则只能使用虚拟地址了。
在Bootloader中,一般通过一个宏定义函数来互相转换,如:
#define VIRTUAL_TO_PHYSICAL(va) ((va) - VA_BASE + _RAM_STARTADDRESS)
其中的参数定义为:(基于S3C2410A的例子)
#define _RAM_STARTADDRESS 0x30000000 #define VA_BASE 0x8C000000 // defined in OEMAddressTable
_RAM_STARTADDRESS为RAM的实际物理起始地址。
VA_BASE是定义在OEMAddressTable中的。这个OEMAddressTable,在WinCE4.2中,定义在map.a(位于$(_WINCEROOT)/PLATFORM/USERPLATFORM/KERNEL/HAL/ARM/)这个文件中,在WinCE5.0则定义于oemaddrtab_cfg.inc(位于$(_WINCEROOT)/PLATFORM/USERPLATFORM/SRC/INC/)。
如:
虚拟地址 物理地址 大小
OEMAddressTable:
dd 0x8C000000 0x30000000 64M
dd 0 0 0
有两点注意:
虚拟地址不是随便定义的,WinCE中有规定,必须在0x80000000 - 0x9FFFFFFF。实际上WinCE创建了两套虚拟地址空间,一个是0x80000000 - 0x9FFFFFFF,是Cache Enabled。另一个是0xA0000000---0xBFFFFFFF,是Cache Disabled。
如果我们访问的这个空间只是一段内存空间(比如SDRAM),那么就可以用Cache Enabled的空间来访问,这样存取数据的速度会比较快,因为数据被保存在Cache中。
如果我们访问的这个空间是一个外设的地址,那么我们就要使用Cached Disabled的空间来访问,这样才能使CPU与外设同步。
下面介绍S3C2410芯片的的内存控制器物理地址分配:
来看一个g_oalAddressTable的例子:
; Export Definition EXPORT g_oalAddressTable[DATA] ;------------------------------------------------------------------------------ ; ; TABLE FORMAT ; cached address, physical address, size ;------------------------------------------------------------------------------ g_oalAddressTable DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6 DCD 0x84000000, 0x10000000, 32 ; PCMCIA/PCCARD BANK 2 DCD 0x86000000, 0x18000000, 32 ; NETCARD BANK 3 DCD 0x88000000, 0x00000000, 96 ; 96 MB NOR Flash DCD 0x90800000, 0x48000000, 1 ; Memory control register DCD 0x90900000, 0x49000000, 1 ; USB Host register DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register DCD 0x90B00000, 0x4B000000, 1 ; DMA control register DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register DCD 0x90D00000, 0x4D000000, 1 ; LCD control register DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register DCD 0x91000000, 0x50000000, 1 ; UART control register DCD 0x91100000, 0x51000000, 1 ; PWM timer register DCD 0x91200000, 0x52000000, 1 ; USB device register DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register DCD 0x91400000, 0x54000000, 1 ; IIC control register DCD 0x91500000, 0x55000000, 1 ; IIS control register DCD 0x91600000, 0x56000000, 1 ; I/O Port register DCD 0x91700000, 0x57000000, 1 ; RTC control register DCD 0x91800000, 0x58000000, 1 ; A/D convert register DCD 0x91900000, 0x59000000, 1 ; SPI register DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register ; 0x92000000, 0x00000000, 32 ; original location of 32MB of NOR flash DCD 0x94000000, 0x34000000, 192 ; 192MB bank 6&7 - Extended RAM DCD 0x00000000, 0x00000000, 0 ; end of table
按照S3C2410芯片内置的内存控制器的设计,从0x48000000到0x5FFFFFFF范围内的系统物理地址空间被命名为SFR(Special Function Register)的片内外设寄存器(包括控制寄存器、状态寄存器、数据缓冲区等),由上表可以看出,有USB、LCD等外设。
可供CPU芯片外接的外设控制器或者存储设备使用的物理地址范围是0x00000000到0x3FFFFFFF这1GB的地址空间。这1GB共被分为8个Bank,每个Bank享有128MB的物理地址空间。其中只有Bank6和Bank7可以支持RAM存储类型。
物理地址0x30000000到0x3FFFFFFF这一块长达256MB的区域被物理RAM使用,这实际上是用满了S3C2410内存控制器的Bank6和Bank7。由上表可以看出,尽管物理地址是连续的,但是虚拟地址可以不连续,即分为了64MB和192MB的两块。
物理地址0x00000000到0x05FFFFFFF区域被Nor Flash存储占用,其总容量为96MB。
存储控制器的Bank2被一块32MB的存储类型PC卡外设占据。
存储控制器的Bank3被外置的以太网控制器芯片占用。