Kernel panic - not syncing: No init found. yaffs2文件系統掛上找不到init

yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:4.
Freeing init memory: 148K
Warning: unable to open an initial console.
Failed to execute /sbin/init.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
以上是通過U-BOOT引導內核,內核掛載yaffs2文件系統出現的問題
這是啓動信息,可以發現文件系統已經掛上來,在內核初始化調用時找不到init進程。
初步判斷:
1.傳遞的參數不對
2.文件系統製作不正確
3.文件權限不夠

檢查傳遞參數:
bootargs= noinitrd root=/dev/mtdblock4 init=/linuxrc rootfstype=yaffs2
console=ttyS2,115200n8 mem=128M

文件系統的製作主要是busybox的編譯,使用的是1.16.0
配置選項:選擇靜態編譯 等
這個配置單,是以前配置過的。並且編譯使用成功的
檢查文件權限:
主要是文件系統下的/etc/inittab 和/etc/init.d/rcS
權限都爲rwx
而所有的命令也爲可讀可寫可執行,並且軟鏈接到/bin/busybox
發現這三個沒有問題。
也確認內核對yaffs2支持
查閱了一些資料後,發現可能是yaffs2文件製作工具的問題
我使用的mkyaffsimage是針對128M-1GB NANDflash,在網上找了一個mkyaffs2image-128m專門針對128MNAND,重新制作後依舊是上面的問題

現在可以把問題鎖定在這裏:
觀察啓動信息後,發現在啓動過程中由UBL打印的部分,NAND中出現很多壞塊信息,明顯是假壞塊。而在KERNEL啓動後初始化MTD分區時也打印出來很多壞塊信息,問題終於浮出水面。
UBL U-BOOT KERNEL YAFFS2操作NAND不相同所致
具體的說是操作OOB(spare)區不一致所致,而本身的U-BOOT是不支持YAFFS2燒寫的
,燒寫命令是我添加的。就出現OOB區數據不一樣所致。
針對OMAPL138這個CPU,NAND控制器硬件爲每512B產生4B的ECC校驗碼,而標準YAFFS2是每256B產生3B校驗碼,這裏就產生了衝突。

啓動過程:
UBL啓動U-BOOT這裏沒有操作OBB區
U-BOOT啓動kernel,由於U-BOOT和KERNEL採用一樣的硬件產生ECC,並且U-BOOT燒寫和搬運KERNEL都是使用簡單的nand read 和write 在遇到壞塊時直接報錯,並未進行校驗等。所以啓動沒有問題
KERNEL掛載yaffs2,由於燒寫yaffs2是使用的nand write.yaffs2 進行來校驗並操作了對應OBB區,在kernel掛上yaffs2以後會進行初始化,去檢查OOB區。所以U-BOOT燒寫yaffs2產生的ECC必須和yaffs讀的ECC一樣。否則就會出現類似上面程序找不到的情況。

問題鎖定代解決:
最簡單的方法禁止硬件ECC,使用軟件ECC,至於yaffs2有沒有在識別到ECC錯誤的情況下還能讀寫的機制不瞭解。保證燒寫的ECC和yaffs2軟件計算得到的是一致的。
還有比較麻煩的也是比較可靠的是,修改ECC算法,保證在U-BOOT和YAFFS2操作OOB的參數分佈一樣。
上述方法比較困難,保證OOB區參數位置一致,這個比較容易修改MTD中對應的OOB區結構體就行,難點在於若採用硬件ECC,是每512B產生4B的校驗,需要將校驗碼轉化爲與yaffs2每256B產生3BECC碼一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章