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去執行