• 采用NAND Flash启动时出现Kernel panic not syncing: No init found错误


    通过NFS加载根文件系统的方式已经能够成功挂载根文件系统root422,并正常进入shell界面。

    然后,尝试将根文件系统写到Flash中,让Nand Flash自身启动后能挂载根文件系统。


    问题:

    首先,将root422制作成yaffs2镜像文件:

    mkyaffs2 -c 2048 root422 rootfs-20120625.yaffs2
    生成的rootfs-20120625.yaffs2大小为24,805,440字节。
    在U-Boot命令行模式将yaffs2镜像文件烧写到Flash中:

    #nand erase 800000 2000000
    其中,0x800000是根文件系统的起始地址,因为24,805,440小于32M,所以,擦除32M的地址空间;

    #tftp 22000000 rootfs-20120625.yaffs2
    rootfs-20120625.yaffs2镜像文件通过tftp方式从服务器下载到本地SRAM从0x22000000开始的地址空间中;

    #nand write.yaffs 22000000 800000 $(filesize)
    将从0x22000000开始的连续$(filesize)个字节的数据写到nand flash从0x800000开始的空间中。
    写入完成后,重启目标板。

    VFS: Mounted root (yaffs filesystem) on device 31:0.
    Freeing init memory: 120K
    Warning: unable to open an initial console.
    Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
    Console中观察到,在启动的最后,出现无法打开原始console的警告,并报告No init found的Kernel Panic。


    而且,在写完Flash后,启动过程中出现了大量的坏块提示:

    从block33开始错起,全是下面这种错误:
        block 33 is bad
        block 34 is bad
        block 35 is bad
        。。。
        。。。
    
        。。。
        。。。
    
        。。。
        。。。
    
        。。。
        。。。
        block 550 is bad
        block 551 is bad
        block 552 is bad
        block 553 is bad
        block 554 is bad
        block 693 is bad
        block 972 is bad
        block 1029 is bad
        block 1218 is bad
        block 1391 is bad
        block 1659 is bad
        block 1756 is bad
        yaffs_read_super: isCheckpointed 0
    

    解决办法:

    1. 不明白问题出在什么地方,google了一下,看到这篇文章http://tianxiaolin.blog.51cto.com/1810342/418412讲是由于内核中未打开Device Drivers  ---> Character devices  --->  Serial drivers  ---><*> 8250/16550 and compatible serial support,

    按照文中所述,选中8250/16550 and compatible serial support,重新编译,将uImage烧写到Flash中,问题依旧,而且,更严重的是,在我所用的2.6.30内核情况下,通过NFS加载根文件系统也不行了。

    由于自己所做的改动并不多,将此处改动重新复原,也就是不选中8250/16550 and compatible serial support,重新编译,再次将uImage烧写到Flash中,观察到通过NFS可以加载根文件系统了,说明了通过NFS不能加载根文件系统的原因确实是由于8250/16550 and compatible serial support被选中所导致的。

    2. 由于烧写完Flash后出现了居多的坏块,怀疑是页大小设定有问题,于是查找所用Flash的芯片资料k9f2g08x0a_rev13.pdf,看到其中写明Page的program和Read的大小都是(2K+64)字节,这说明原来设定的2048是正确的。

    当然,中间曾经怀疑过,是否要将页大小设为2048+64=2112字节,在问过开发板的技术支持后确认不需要写附加位的位数;

    3. 中间,开发板技术支持小伙儿,认为我没有修改分区表,导致系统找不到根文件系统,所以才出现上述问题。

    于是,修改arch/arm/mach-at91/board-sam9260ek.c文件,将其中的根文件系统的起始地址从0x400000改为0x800000。

    重新编译内核,并烧写到Flash中0xa0000起始的地址,重启目标板后问题未能解决。

    4. 突然,我冒出一个念头,会不会是由于制作yaffs2镜像文件的程序本身有问题,开发板的技术支持说这种可能性几乎为0,但是把他们所用的工具程序mkyaffs2image发给了我。

    使用新的制作yaffs2镜像的工具程序,重新制作了根文件系统的镜像,通过tftp方式上传到本地的sram中,烧写到Flash,然后重启目标板。

    到最后,啊?!

    竟然进入shell界面了。哦,买糕的,竟然是这么弱智的问题导致我基本上浪费了一颗Nand Flash芯片,才知道原来网上下载的工具程序竟然也有不适用的时候。

    本来,mkyaffs2image是想自己编译的,但一个时间比较紧张,另一个编译过程中出现了很多错误。没时间去查错了,所以使用了现成的。

    5. 不管怎么说,能解决问题,就该万分高兴了,哈哈。




  • 相关阅读:
    @font-face
    闭包
    DOM事件
    DOM属性
    使用谷歌chrome浏览器查看任何标签的固有属性
    chmod命令
    C++笔记之零碎点
    C++学习之 —— 输入输出
    常见素数筛选方法原理和Python实现
    Django的MVT模型
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218565.html
Copyright © 2020-2023  润新知