我使用 ubi 文件系统和 mtd 子系统在 NAND 闪存上工作。它工作正常。
但现在我发现以下错误:
UBI 错误:ubi_io_read:从 PEB 2701:8192 读取 516096 字节时出现错误 -74,读取 516096 字节
end_request:I/O 错误,开发 mtdblock5,扇区 49160
我上面提到的那些错误的原因是什么?如何从这些错误中恢复?
我使用 ubi 文件系统和 mtd 子系统在 NAND 闪存上工作。它工作正常。
但现在我发现以下错误:
UBI 错误:ubi_io_read:从 PEB 2701:8192 读取 516096 字节时出现错误 -74,读取 516096 字节
end_request:I/O 错误,开发 mtdblock5,扇区 49160
我上面提到的那些错误的原因是什么?如何从这些错误中恢复?
错误 -74 是EBADMSG
. 查看ubi.h我们可以看到,
每个 UBI 块是一个闪存擦除块(通常为 128K),这些块有两个 UBI 标头,它们是一个页面大小(通常为 2k)。读取此页时,出现错误。无法通过纠错码或 ECC 恢复。
如果您在UbiF之上使用UBI,则应安排对这些块进行折磨。这涉及擦除和重写擦除块。如果多次读取Flash,它可能会过时。这些位可以翻转并要求重新写入数据。事实证明,UBI标头只需要重新编程,flash 就可以了。
如果没有,所有 NAND mtd驱动程序都有一个坏块表。如果数据确实不可恢复,擦除块将在此表中标记为坏,Ubi不应再使用该扇区。
如果错误仍然存在,那么这可能是一个问题。但是,在正常使用 NAND 闪存的情况下,这是有些意料之中的。NAND 闪存的典型周期为 1,000 到 100,000。经过一定程度的磨损后,闪光灯可能完全无法使用。这取决于闪存类型、文件系统(和磨损均衡)以及系统上的应用程序。
错误配置的闪存驱动程序可能会导致这些错误。不正确的闪存 ECC 代码可能会导致过早的错误(闪存为 4 位 ECC 提供空间,但驱动程序仅实现 1 位)。也可能是由于应用程序fsync()
每隔 1ms-100ms 不断磁盘而导致的;即使所有其他组件都处于最佳状态,这种行为也会在几年内磨损闪光灯。 Ubi应该有一些最好的磨损均衡。如果您经常重新刷新图像,则可以打折ubi磨损平衡并导致此类问题。
两者都显示与 NAND 闪存损坏或坏块有关的 I/O 错误,尝试使用另一个闪存并使用它。您也可以尝试擦除闪存并重试。
谢谢和问候,
阿洛克·塔克