2013-12-12 424 views
4

我正在使用嵌入式ARM平台和内置的NAND闪存。我的屋顶隔断是squashfs。 u-boot和内核都使用OMAP_ECC_BCH8_CODE_HW。问题在于一些电路板(不仅仅是一个)在停电后停止工作(它们被使用约2个月)。SQUASHFS错误:无法读取页面,...,大小

这些错误可以同时启动可以看出:

[ 8.270507] end_request: I/O error, dev mtdblock9, sector 25184 
[ 8.278930] SQUASHFS error: squashfs_read_data failed to read block 0xc40396 
[ 8.286376] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.293579] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.300628] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.307647] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.314819] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.321838] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.328887] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.335906] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.343017] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.350006] SQUASHFS error: Unable to read page, block c40396, size d696 
/usr/sbin/lighttpd: '/usr/lib/libpcre.so.1' is not an ELF file 
/usr/sbin/lighttpd: can't load library 'libpcre.so.1' 

我应该如何调试呢?我没有擦除闪存,所以仍然可以对其进行一些测试。

什么我迄今所做的:

  1. 我用nanddump(使用-o,读OOB数据)上的坏分区,我注意到3个ECC校正警告。当我将这个转储写入另一个电路板时,它可以毫无问题地启动。

  2. 当我用附加选项-n(--noecc,Read without errors correction)使用nanddump并将其写入另一个板(使用nandwrite -n)时,第二块板无法启动。

在我看来,这些错误是可以恢复的,这就是为什么nanddump在第一种情况下纠正了它们。我比较了这2个转储和他们只有三个差异(由nanddump报道3个ECC纠错?)

# diff mtd_without_ecc.hex mtd_with_ecc.hex 

486347c486347 
< 076bca0: 59d2 d8bc 3e89 1c67 a6c2 74a0 bc38 4873 Y...>..g..t..8Hs 
--- 
> 076bca0: 59d2 d8bc 3e09 1c67 a6c2 74a0 bc38 4873 Y...>..g..t..8Hs 
783769c783769 
< 0bf5980: e31e f50a e5b5 6ae5 5a67 8be1 7636 9cf2 ......j.Zg..v6.. 
--- 
> 0bf5980: e31e f50a e5b5 6aa5 5a67 8be1 7636 9cf2 ......j.Zg..v6.. 
1315929c1315929 
< 1414580: a9ec ef89 ac52 c8a5 61f5 5d0b 6ee2 af41 .....R..a.].n..A 
--- 
> 1414580: a9ec af89 ac52 c8a5 61f5 5d0b 6ee2 af41 .....R..a.].n..A 

的问题是:为什么这些错误不是由系统自动修正?是否因为squashfs不是“mtd-aware”文件系统,而不应该在mtd设备上使用它?如果是这样,我应该使用squashfs而不是UBI吗?那么内核怎么样(据我所知它必须是原始映像才能从u-boot启动)?

感谢您的帮助!

回答

0

事实上,Linux MTD层不会对NAND/NOR内存进行任何维护。

例如,当你的NAND发生bitflip时,它会被ECC纠正。 MTD层意识到这一点,但它没有做任何事情。它只是返回错误。

因此,您需要MTD上的另一层来照顾这一点。

一个解决方案是使用UBI,它旨在解决这类问题。看看linux-mtd上的UBI documentation。如果你想坚持使用squashfs,可以在UBI(gluebi)之上添加另一个MTD抽象,然后在其上运行squashfs。结果看起来像这样:

--------------------- 
|  SquashFS  | 
--------------------- 
|  MTD block  | 
--------------------- 
| MTD API (gluebi) | 
--------------------- 
|  UBI  | 
--------------------- 
|  MTD driver | 
--------------------- 
|  Flash Chip | 
--------------------- 

它使一个可怕的画面,但它工作得很好;)

看一看this slides from free-electrons更多信息(图片来自第47页)。

关于内核,我不确定,但我认为U-Boot确实支持UBI。从来没有尝试过,但...