1. 程式人生 > >Linux核心及檔案系統移植之jffs2燒錄後無法啟動

Linux核心及檔案系統移植之jffs2燒錄後無法啟動

近一週的時候都在玩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擦除的大小要對應,否則會出現:系統雖然可以啟動,但同時會列印以下資訊:


記錄一下,聊以慰藉!