UBI中NAND Flash坏快管理 - KBA224229

Version: **

问题: Linux系统中,UBIUnsorted Block Images)是如何管理坏块?在Linux中使用UBI时,NAND Flash的总可用空间缩小的原因是什么?

答案: 在管理坏块前,需要先了解UBI如何识别和标记坏块。通常情况UBI在以下两种情况会标记物理块为坏块:

  • 块写操作失败。在这种情况下,UBI将数据移至另一块(数据恢复)并安排失败块进行torturing
  • EIO错误导致擦除操作失败。在这种情况下,擦除块直接标记为坏。

在后台进行Torturing以检测物理块是否为坏。导致写失败会有很多种原因,包括驱动中的错误或文件系统等上层软件中的错误(例如,文件系统错误地多次写入同一NAND页)。Torturing期间,UBI会做以下事情:

  • 擦除块
  • 将其读回确保块仅包含0xFF字节
  • 写入测试样式字节(0xA5, 0x5A, 0x00
  • 读回块并检查样式

如果块在torture测试中幸存下来,该块将不会被标记为坏。注意torture测试中的位翻转被视为将块标记为坏的一个很好的理由。Torturing是在torture_peb()函数中实现的。

UBI标记块为坏,它将坏块的内容拷贝到预留块中。NAND器件通常会有2%的坏块预留。

UBIUBI设备预留20/1024比率的默认块数。这表示如果4096物理擦除块(Physical Erase Block, PEB)的NAND上有2UBI设备,则会给每个设备预留40 PEB。这可能看起来是浪费空间,但是因为坏块可能出现在NAND Flash的任何地方,并且在整个设备上没有平均分配,所以它是更安全的方式。 因此,不是在NAND Flash设备上使用多个UBI设备,而是仅使用一个UBI设备和几个UBI卷更节省空间。

1024 PEB保留的默认值20 PEB是内核配置选项。针对每个UBI设备,此值可以通过ubiattach参数(Linux内核3.7及更高版本)调整。

使用默认保留块,每个UBI设备上的总可用空间将小于NAND Flash密度。 UBI动态地维护和管理坏块,并通过使用这种机制使系统保持健康和健壮的状态。

Linux中使用带有旧版本UBI驱动程序的多位ECC Error Correction Code NAND Flash(例如,S34ML0xG2)时,您可能仍会遇到问题。 在早期的Linux内核版本中,如果NAND控制器发现并纠正了单比特错误,UBI很容易触发块torture操作。 S34ML0xG2需要4ECC,每个528B部分页面最多可纠正4位错误。 由于标准UBI配置将使具有多于一位错误的块失败,因此具有可纠正错误的块将被视为坏块并在块torture操作之后替换为新的保留块; 这可能会快速消耗备用块。 如果此错误配置识别出足够的坏块,则UBI将耗尽替换块,并且卷将停止运行。

为了避免过早消耗备用块,内核驱动程序引入了一个新的变量bitflip_threshold来触发块torture操作,其操作级别与Flash使用的ECC功率相匹配。 此变量出现在Linux内核版本3.3.1及更高版本中。 /drivers/mtd/mtdcore.c中定义mtd_read()函数中,只有位翻转位计数值大于bitflip_threshold的值才会报告给UBI并触发块torture操作。 默认情况下,bitflip_threshold设置为ecc_strength(系统上使用的NAND FlashECC可纠正位)。关于这部分的更多信息,请查看Linux MTD mailthreads

因此,使用多位ECC NAND Flash设备时,请使用最新的UBI驱动程序和Linux内核。

有关UBI的更多信息,请访问UBI网站。