wince的記憶體(包括sdram及flash)的配置包含兩個方面:源**(包括c和彙編)中的定義,及系統配置檔案config.bib中的定義。源**中需要定義記憶體的物理及虛擬位址,大小,並初始化名為oemaddresstable的結構陣列,以告知系統實體地址與虛擬位址的對應關係,系統根據其設定生成mmu頁表。而config.bib中一般會將記憶體定義成不同的段,各段用作不同的用途。
config.bib檔案
config.bib檔案分兩個部分,我們且稱之為段,memory段和config段。memory段定義記憶體的分片方法,config段定義系統其它的一些屬性。以下是乙個config。bib檔案memory段的例子:
memory
; 名稱 起始位址 大小 屬性
reserved 80000000 00008000 reserved
drv_glb 80008000 00001000 reserved
cs8900 80010000 00030000 reserved
edbg 80040000 00080000 reserved
nk 800c0000 00740000 ramimage
ram 81000000 00800000 ram
名稱原則上可以取任意字串,romimage通過乙個記憶體片的屬性來判斷它的用途。reserve屬性表明該片記憶體是bsp自己使用的,系統不必關心其用途;ramimage說明它是一片存放os image的記憶體;而ram則表示些片記憶體為ram,系統可以在其中分配空間,執行程式。
但存放rom的這片記憶體的名稱,即nk一般不要改動。因為bib檔案中定義將乙個檔案加入到哪個rom片(wince支援將rom image存放在不連續的幾個記憶體片中)中時會用到這個名稱,如下現這行bib檔案項就定義將touch.dll放在名稱為nk這片rom中,
touch.dll $(_flatreleasedir)/touch.dll nk sh
因而,如果將nk改為其它名稱,則系統中所有的bib檔案中的這個nk串都需要改動。
注意:保證各片記憶體不要重疊;而且中間不要留空洞,以節約記憶體;兩種裝置如果不能同時被載入,就應該只為其保留一片從而節約記憶體,例如,本例中的cs8950是為網絡卡驅動程式保留的,edbg是為網絡卡作除錯(kitl)用時保留的,而系統設計成這兩個程式不會同時載入(cs8950在啟動時判斷如果edbg在執行就會自動退出),這樣為這兩個驅動程式各保留一片記憶體實在浪費而且也沒有必要。
ram片必須在物理上是連續的,如果系統的物理記憶體被分成了幾片,則在ram片只能宣告一片,其它的內存在啟動階段由oemgetextensiondram報告給系統,如果有多於乙個的記憶體片,應該用oemenumextensiondram報告。nk片則沒有此限制,只是nk跨越兩個以上物理記憶體片時,系統啟動時會顯示這個os包跨越了多個物理記憶體片,認為是個錯誤,但並不影響系統的執行與穩定性,因為系統啟動之時便會開啟mmu而使用虛擬位址,從而看到連續的記憶體空間。當然,如果核心自己都被放在了兩個記憶體片上,那系統應該就無法啟動了。而其它保留起來的記憶體片是一般是給驅動程式dma用,應該保證它們在物理上的連續性,因為dma是直接用實體地址的。
config段中以下幾個需要格外注意:
romstart,它定義rom的起始位置,應該和nk片的起始位置相同。
romsize,定義rom的大小,應該和nk片的大小相同。
如果不需要nk。bin檔案,則可以不設這兩個值。
romwidth,它只是定義romimag生成rom包時如何組織檔案,而非其字面含義:rom的寬度,所以一般都應該為32
compression,一般定義為on,以開啟壓縮功能,從而減小bin檔案的尺寸。
autosize,一般應該設為on,以使系統將定義給rom但沒有用掉的記憶體當做ram使用,而提高ram的使用率。注意,如果rom是flash,則不能設為on,因為flash不能當作ram使用。
romoffset,它定義os起始位置(即romstart)的實體地址和虛擬位址的差值,有些bsp中並沒有使用這個定義。
oemaddresstable及其它
oemaddresstable用來初始化系統中各種裝置的虛擬位址與實體地址的對映關係。在我使用的bsp中,它是這樣定義並初始化的:
typedef struct
addresstablestruct;
#define meg(a) (((a - 1)>>20) + 1)
const addresstablestruct oemaddresstable =
,………………………
};如例子所示,oemaddresstable為乙個結構陣列,每項的第乙個成員為虛擬位址,第二個成員為對應的實體地址,最後乙個成員為該段空間的大小。這個陣列的最後一項必須全部為0,以示整個陣列的結束。核心啟動時會讀取這個陣列的內容以初始化mmu頁表,啟用mmu,從爾使程式可以用虛擬位址來訪問裝置。當然,oemaddresstable中所用到的每個實體地址及虛擬位址都需要在標頭檔案中定義,每個bsp中定義這些值的檔案不盡相同,所以,在此不能說明具體在哪個檔案,讀者朋友可以參考具體bsp的文件及**。
不連續記憶體的處理
如果內存在物理上是連續的,則oemaddresstable中只需要一項就可以完成對記憶體的位址對映。但如果bsp執行在sdram物理上不連續的系統上時,oemaddresstable中需要更多的項來將sdram對映到連續的虛擬位址上,當然也可以將它們對映到不連續的虛擬位址上,但似乎沒有理由那麼做。而且,當其實體地址不連續時系統需要做更多的工作。例如,我有這樣乙個系統:32m sdram,16m flash,sdram在物理上不連續,被分成了4個8m的記憶體塊,我的sdram的使用情況如下圖所示:
config。bib檔案的memory段如下所示:
memory
reserved 80000000 00008000 reserved
drv_glb 80008000 00001000 reserved
cs8900 80010000 00030000 reserved
edbg 80040000 00080000 reserved
nk 800c0000 00940000 ramimage
ram 81800000 00800000 ram
在這32m的空間中,bsp保留了前0x80000位元組,接下來是nk,它占用了0x940000位元組,而且它跨越了兩個記憶體片,這些和其它bsp的設定都沒有多大差別,接下來看ram片,它只占用了最後的8m空間,前面說過,在這種物理記憶體不連續的系統中,ram片不能跨越兩個物理記憶體塊,所以它被設計成只占用該系統中的最後乙個物理記憶體片,而其它兩片則由oemenumextensiondram在執行時刻報告給系統,該函式的內容如下:
pmemsections[0].dwflags=0;
pmemsections[0].dwstart=(sdram_virtual_memory + 0x1000000);
pmemsections[0].dwlen=0x800000;
pmemsections[1].dwflags=0;
pmemsections[1].dwstart=(sdram_virtual_memory + 0x0a00000);
pmemsections[1].dwlen=0x600000;
return 2;
這樣,系統所有的記憶體都被啟用,系統可用記憶體就變成了8+8+6=24m,可以將ram定義為這三片中的任意一片,而在oemenumextensiondram中報告其它兩片。但把ram放在最後一片物理記憶體上有乙個很大的好處,即如果nk變大,例如編譯乙個debug版的系統時,這時,只需要將oemenumextensiondram中的內容注釋掉,config.bib檔案不用做任何改動,系統就可執行,只是在makeimg時會有乙個警告說系統包太大,可能無法執行,但實際不會影響系統的執行與穩定性,因為nk之後的那段記憶體並沒有被使用,正好被漲大的系統占用,這在除錯時極其方便。
而如果系統物理記憶體是連續的,那將變得簡單的多,還以上面的設定為例,如果這32m的sdram是物理上連續的,記憶體的使用情況就可以表示如下圖:
所有者系統可用記憶體都可以定義在ram片中。
對硬體知識了解不多的朋友請注意:sdram是否在物理上連續,與我們的板上有幾片sdram沒有關係,應該向硬體工程師了解sdram的位址分布情況。
WINCE的記憶體配置
原文 http www.360doc.com content 10 1021 11 4026366 62690896.shtml wince的記憶體配置 wince的記憶體 包括sdram及flash 的配置包含兩個方面 源 包括c和彙編 中的定義,及系統配置檔案config.bib中的定義。源 中...
WINCE的記憶體配置
wince 的記憶體配置 wince的記憶體 包括sdram及flash 的配置包含兩個方面 源 包括c和彙編 中的定義,及系統配置檔案config.bib中的定義。源 中需要定義記憶體的物理及虛擬位址,大小,並初始化名為oemaddresstable的結構陣列,以告知系統實體地址與虛擬位址的對應關...
WINCE的記憶體配置
發 布 時 間 2008 11 19 來 源 作 者 microsun 瀏 覽 1418 wince的記憶體 包括sdram及flash 的配置包含兩個方面 源 包括c和彙編 中的定義,及系統配置檔案config.bib中的定義。源 中需要定義記憶體的物理及虛擬位址,大小,並初始化名為oemaddr...