您的位置:首页 > 编程语言 > PHP开发

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

2013-03-21 21:40 567 查看
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码一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐