之前通过弄好了G-Bios启动linux,但是上次我并不是通过g-bios提供的tftp将根文件下载到相应的分区的的,而且通过其他途径下载根文件的系统的,但是昨天通过g-bios命令下载根文件系统的时候出现了问题,就是在擦除nand flash的时候出现了错误,也就是擦除失败,然后看了半天最后才弄明白原来对nand flash的坏块是不能进行擦除的。知道了原因就去看源码中关于nand flash部分的代码,并且和uboot中的代码进行的了比较,发现了原来这两个项目的源码很雷同的,套用电视剧上经常看到的就是“如有雷同纯属巧合”,在这就不说这个问题了。 G-bios对于nand flash下载内核和文件系统没有考虑到坏块的情况,也就是当你将内核烧写到一个有坏块的地址空间的时候,它不会跳过坏块继续烧写,而是直接返回错误的,这就和uboot中的nand flash的操作有差别了,在uboot中nand命令会自动跳过坏块继续对flash进行读、写和擦动作,而g-bios中并没有这么做。那么要实现uboot中nand flash那样的功能其实也非常的简单,我在看过uboot的源码发现它对于nand flash写操作的时候会先调用一个get_len_incl_bad函数,这个函数的作用就是计算包含了坏块的总的长度,而且它在执行读、写和擦除的时候都会检查当前要执行的block是否是坏的,如果是坏的那么就跳过,否则执行相应的动作,因此在G-bios中只要稍微修改一下nand flash的相关代码即可。
还有就是关于linux内核中的mtd分区的问题,我使用的linuxmtd的分区中rootfs是在地址0x560000到最后的但是我将文件系统下载到0x580000的地方也是能够启动的,难道只要真正的文件系统的起始地址是在mtd中规定的地址后面的就可以吗?对于这个东西的疑问已经有很久了,希望高人能够帮我解答。。。。
阅读(1535) | 评论(0) | 转发(0) |