taoyuetao的个人空间 https://blog.eetop.cn/taoyuetao [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

[转载] Windows CE : bib (Binary Image Builder)

已有 2286 次阅读| 2007-1-4 11:09 |个人分类:【 WinCE & Mobile 】

天气: 晴朗
心情: 高兴
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, Size
CE內的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去執行。

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 0

    粉丝
  • 0

    好友
  • 0

    获赞
  • 1075

    评论
  • 4435

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 06:34 , Processed in 0.024242 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部