您的位置:首页 > 运维架构 > Linux

uboot启动linux内核时输出Verifying Checksum ... Bad Data CRC解决方法

2014-11-23 22:49 441 查看
先贴出笔者在uboot启动linux时的错误输出

<span style="font-size:18px;">NAND read: device 0 offset 0xa0000, size 0x400000
size adjusted to 0x200000 (16 bad blocks)
2097152 bytes read: OK
## Booting kernel from Legacy Image at 30000000 ...
Image Name:   Linux-3.17.2
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2624776 Bytes = 2.5 MiB
Load Address: 30008000
Entry Point:  30008000
Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!</span>
在内核中搜索Verifying Checksum ,在image.c中有这样一段:

<span style="font-size:18px;">if (verify) {
puts("   Verifying Checksum ... ");
if (!image_check_dcrc(rd_hdr)) {
puts("Bad Data CRC\n");
bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM);
return NULL;
}
puts("OK\n");
}</span>
这里的image_check_dcrc的函数是将内核映像的头部64字节的校验信息跟实际得到的内核的参数进行对比,很明显是烧写内核的数据出了差错!

笔者的内核是没问题的,那么问题就应该是在烧写nand flash上了

再回过头看输出的信息,

NAND read: device 0 offset 0xa0000, size 0x400000
size adjusted to 0x200000 (16 bad blocks)
<span style="color:#ff0000;">2097152 bytes read: OK</span>我给内核(实际大小是2.7M)分的空间是从0xa0000开始的4M空间,但是只是读了2097152 bytes,就是2M,这里就奇怪了!!
那么问题出在哪里呢,可以看到size adjusted to 0x200000 (16 bad blocks)---->适合的大小是2M(16个坏块)在uboot中输入nand info命令,可以看到Erase size   131072
b,意思是一个擦出块是128k,那么16个坏块就占了2M!!!!!(这样就浪费了2M空间)修改uboot参数,将kernel分区扩大为12M,重新烧写,启动就没问题了

</pre><pre name="code" class="objc">
</pre><pre name="code" class="objc">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐