近一周的時候都在玩linux 核心及檔案系統移植,使用的版本如下:
Bootloader: u-boot-2010.06.tgz
Kernel: linux-3.0.y.tgz
BusyBox: busybox-1.16.1.tgz
搜集相應介紹文檔後分別編譯出U-boot.bin,uImage和rootfs.jffs2鏡像檔案(稍後抽空整理相應製作過程),當燒寫進16M SPI Flash中,上電重啟後卻進不了系統。
串口輸出以下資訊:
困擾了近兩天時間。。。。
期間作過很多嘗試和測試,確定了我的u-boot可以成功引導別人的可用的核心及檔案系統;而燒錄我自己的u-boot及uImage之後,核心引導及初始化完畢,掛載檔案系統後將要載入必要的核心模組的時候,出現Kernel panic,如下圖:
發現問題出在我的根檔案系統這裡。開始以為是我在鏡像燒錄的時候沒有規劃好分區導致燒錄的檔案系統資料不完整,又對照著文檔步驟重新製作了根檔案系統,調整分區結構,再次仔仔細細地燒錄進去,依舊出現以上錯誤。
後來在查看製作根檔案系統的時候,看到mkfs.jffs2這個產生JFFS2格式檔案系統的工具,搜尋它的用法,發現它有一個“-e”參數(設定擦除塊的大小為(預設: 64KiB)),突然想到上面串口輸出的資訊中有這麼一句:
Further such events for this erase block will not be printed
Node at 0x0024ff48 with length 0x000001bc would run over the end ofthe erase block
Perhaps the file system was created with the wrong erase size?
然後在指令碼中找到組建檔案系統的命令:
mkfs.jffs2-l -e 0x20000 -d $rootfs_dir -o $target_fs
發現該命令在製作檔案系統時塊擦除大小設定為128K。於是,當我回過頭檢查串口輸出的系統引導啟動資訊的時候,終於發現了問題所在:
此處顯示該SPI Flash的Block大小為64K。原來是我在製作根檔案系統時把塊擦除大小設定成了128K,與晶片實際的參數不相符導致檔案系統不能正常運行。
果斷修改mkfs.jffs2後-e參數後面的值為64K:
mkfs.jffs2-l -e 0x10000 -d $rootfs_dir -o $target_fs
重新燒錄了檔案系統後,問題得到解決。。。
另外,在設定U-boot啟動參數的時候,也要注意rootfs分區大小和後面燒錄rootfs.jffs2映像的時候erase擦除的大小要對應,否則會出現:系統雖然可以啟動,但同時會列印以下資訊:
記錄一下,聊以慰藉。