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码一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值