Nboot和Eboot中的虛擬地址與實體地址的關係
大家在看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
有兩點注意:
- S3C2410的RAM被定義到從0x30000000開始的地址;
-
虛擬地址不是隨便定義的,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被外接的乙太網控制器晶片佔用。