星期四, 12月 15, 2005

解決問題的log : romfs signature 與romfs auto probe..

環境:loader + linux kernel in ROMFS.

flash 中:
46000000 LOADER
46010000 STAGE2
46030000 ROMFS
ROMFS 中有linux kernel image (gzipped),這個bootloader是將kernel image 放在romfs中,bootloader要"認識"romfs,所以可以在romfs中找到linux image,把他解開。放到ram中,執行。

bootloader : 在flash的特定區域找romfs 的開頭字串(signature),loader內涵romfs filesystem,找到romfs 中的linux image。

Linux boot後,從boot argument中知道是從/dev/blkmem0中找rootfs。(blkmem driver內建flash的address map),所以kernel 啟動後也一樣在flash 中找romfs 的signature,,但是bootloader知道romfs真的起始位置(因為romfs也是他燒進flash的)。linux kernel 就不知道,所以他是從flash的開始位置開始找.......
這樣就有問題了: 如果我在bootloader內含一個romfs signature字串?
如果loader的code image真的很巧的包含一個romfs signature ?
linux kernel就會搞錯了。

以下就是這個問題:

因為在bootloader中enable network功能,所以size增加了,0x10000不夠,所以我重新規劃
46000000 LOADER
46020000 STAGE2
46040000 ROMFS
bootloader boot OK。但是kernel boot時卻找錯romfs...他認為romfs在46030000....
這就是上一次燒錄的romfs 起始位置,
<STAGE2是空的>
因為bootloader在燒錄loader自己和ROMFS時,只有erase需要的部份。所以才造成這個"殘留"問題。
--- 後來手動(在loader中enable all function,增加了erase arbitrary region)erase 了46030000 - 4603FFFF這一個sector後,就正常boot 了。

沒有留言:

網誌存檔