大家在看Nboot與Eboot的源程式時,會發現裡面有兩種地址:虛擬地址與實體地址,虛擬地址是你在程式中用的地址,而實體地址則是RAM中的實際地址。在Bootloader裡,可以直接使用實體地址,但當WinCE啟動之後,則只能使用虛擬地址了。

在Bootloader中,一般通過一個巨集定義函式來互相轉換,如:

 

其中的引數定義為:(基於S3C2410A的例子)

_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

有兩點注意:

  1. S3C2410的RAM被定義到從0x30000000開始的地址;
  2. 虛擬地址不是隨便定義的,WinCE中有規定,必須在0x80000000 - 0x9FFFFFFF。實際上WinCE建立了兩套虛擬地址空間,一個是0x80000000 - 0x9FFFFFFF,是Cache Enabled。另一個是0xA0000000---0xBFFFFFFF,是Cache Disabled。
          如果我們訪問的這個空間只是一段記憶體空間(比如SDRAM),那麼就可以用Cache Enabled的空間來訪問,這樣存取資料的速度會比較快,因為資料被儲存在Cache中。

    如果我們訪問的這個空間是一個外設的地址,那麼我們就要使用Cached Disabled的空間來訪問,這樣才能使CPU與外設同步。

下面介紹S3C2410晶片的的記憶體控制器實體地址分配:

來看一個g_oalAddressTable的例子:

按照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被外接的乙太網控制器晶片佔用。