CE用*.bib來决定(reloade?) memory layout。

一般的project中會包含兩個 image : bootloader , OS,所以Project中會有 boot.bib和config.bib。

以下大略說明bib的內容:

OEMAddressTable

這個table宣告在code中,用來放置在mmu的位址轉換register中。

所以這個Table的內容是 Virtual - Physical Address,格式:

Virtual, Physical, SizeCE內的code address都是virtual address。藉由這個table,轉換到實體的address。

Config.bib

使用以下SECTION來控制memory的使用

RAMIMAGE - 所有Kernel, conpoment都會被放置在這個區域。(大概就是code,const region?)

RAM - Kernel 會利用這部份的區域作為application或kernel自己需要的RAM 空間(data,stack ?)

RESERVED - Kernel 不會使用這部份區域。programmer可以用hard-coded對此 區域位址存取。

AUTOSIZE - 這是一個option,當設定ON時,builder會把RAMIMAGE和RAM合併成一個region。

EBoot.bib(boot.bib)

和config.bib類似,但是要注意的是,如果我們的bootloader沒有啟動MMU,則這部份的memory range是phyical address,不是virtual address。

Bringing it together

一般來說,bootloader和 OS使用相同的OEMAddressTable,所以他們的virtual address 是相同的,利用RESERVED區域,可以作為bootloader和OS之間傳遞資料的空間,也可以作為DMA的buffer。

其實未在bib中宣告的位址就不會被用來放置component(code,const?)和allocate(data,stack?)。所以RESERVED這個SECTION的用途有點像是comment一樣,用來標示我們coding中自己使用的區域。

Example

在XX platform的 common\startup\startup.asm中宣告了以下 OEMAddressTable:

_OEMAddressTable:

dd 80000000h, 0, 04000000h也就是說,virtual address 0x80000000會對應到實體0x00000000的位置,mapping的size是64MB。

在eboot\boot.bib中有以下section..

MEMORY

; Name Start Size Type

;-----------------------------------

EBOOT 00130000 00020000 RAMIMAGE

RAM 00150000 00070000 RAM

ETHDMA 00200000 00020000 RESERVED

.這個 platform的bootloader沒有啟動mmu,所以以上的定義使用的是physical address。

如果我們把他對應到virtual address,會是 .. 0x80130000 - 0x80220000的區域。

而bootloader的code+const的區域是0x80130000 - 0x80150000。

接下來看OS的config.bib:

MEMORY

; Name Start Size Type

;-----------------------------

NK 80220000 009E0000 RAMIMAGE

RAM 80C00000 00C40000 RAM

DMA 80100000 00030000 RESERVED

BOOTARGS 801FFF00 00000100 RESERVED

EDBG_DMA 80200000 00020000 RESERVED

?"讓"掉bootloader的區域(0x80130000 - 0x80150000)。

請畫一個圖,將兩個bib的使用區域重疊起來..可以看到::

最後的區域是NK 跟NK RAM。這樣確保kernel的工作區域會從0x80220000開始,不會毀損前面的bootloader code/data。

有一個區域是在config.bib和boot.bib中重疊的 : ETHDMA跟EDBGDMA。這樣一來,在由bootloader移轉到os時,這一段變數內容還可以繼續被OS使用。

有一個要小心的地方:0x80100000 - 0x80130000這一個區域,剛好在bootloader之前,如果kernel使用多了一些,就會overwrite掉bootloader code。這樣就沒有辦法在warm reset時,由kernel跳回bootloader去執行

posted on 2010-12-25 17:57  GT_Andy  阅读(261)  评论(0编辑  收藏  举报