关于Flash存储,你应该知道的一些事情

2024-11-28

  Flash 存储问题总是在我们技术支持渠道位列榜首。Toradex 投入了大量资源保证存储尽可能的稳定。然而,了解一些关于存储的基本知识还是十分重要的。首先你需要知道存储是否磨损,当往内置的存储设备上写入大量数据后,你就很容易损坏它。通过这篇博文,我们想要告诉你 Flash 存储可能会遇到的一些问题。我们先简单介绍技术内容。

  Flash 类型:Raw Flash vs Managed Flash

  目前,Toradex 计算机模块采用 NORNAND  eMMC Flash

NOR  NAND  raw 存储设备。NAND  NOR 之间的主要差别是 NOR 允许随机寻址,不需要纠错以及较高的每比特成本。NAND 则只能页读取,每页中的一些位可能出错,因此需要纠错机制。

  eMMC Flash 则结合使用 NAND 和一个内置控制器,后者处理大部分使用 NAND flash 时候,本来需要你自己完成的一些列任务。eMMC 也称为 managed NAND。在另一方面,NAND  NOR 需要有 OS 和驱动来完成对应的处理。我们稍后会在本博文中讨论这两种不同的挑战。

  下面是我们的计算机模块所使用的 Flash 类型概览;

 

Storage Type

Toradex Computer Module

NOR

Colibri PXA270

NAND

Colibri PXA310, PXA320, VF50, VF61, iMX7, T20

EMMC

Colibri iMX6 and T30, Apalis iMX6 and T30

 

 

  NAND Flash 演变:从 SLC  MLC

  NAND 上面的 bit 密度随着时间在不停增长。最早的 NAND 设备是 Single Level Cell (SLC) flash。这意味着每个存单元存储一个bit位信息。借助 Multi Level Cell (MLC),每个存单元可以存储两个或者多个bit位,bit 密度也随之提升。MLC 听起来很不错,但是也有缺点:MLC NAND 也带来更高的bit 错误率以及更低的寿命。所有的 eMMC 都使用 MLC NAND。有些 eMMC 设备可以在部分或者全部存储区域上使用 pseudo-SLC (PSLC)。这将会减少存储容量,但是提高设备上使用寿命。

  这是 SLC  MLC 的简单对比。

 

 

SLC

MLC

Bits per Cell

1

2 and more (TLC)

Erase/Program cycles

100K

3K to 15K

Minimal ECC, bits correctable per 512 Bytes, chip dependent

8 bit

12 bit

Cost per Byte

Higher

Lower

 

 

  使用寿命:有限的擦写次数

  正如上面提到的,关于我们设备上使用的 flash 技术,您需要知道很重要的一点是,您只能有限次地擦写存储设备。往 flash 存储上写入大量的数据,并不是一个好的主意。上面的表格所示,根据所使用的 flash 类型不同,直到数据可能出现损坏或者丢失前,您可以进行 10K  100K 次写操作。擦写周期这一个令人烦恼的事情。Flash 存储的一个限制是,在被擦除之前是无法进行写操作的。而且,不能通过位擦差来完成,而是需要更大的单位,称为块。最糟糕的情况是,如果你只想改变一个字节,但是可能需要擦除整个块。一个块最大可以使 512KB。这种比你想象的要大的多的擦/写比现象称为写放大。并且可能还有 flash 文件系统所需的额外写操作。如果你想要评估你嵌入式设备上的存储的寿命,你应该把这个也考虑进来。

  提高 flash 寿命

  下面的内容向你介绍如何提高 NAND 或者 eMMC 的寿命。不要担心,这些工作都已经由 Toradex 完成,你不需采取任何工作。

  防止磨损:磨损平衡

  我们假设你已经了解 flash 只能被有限次地擦写,并且你只是偶尔小批量地更新数据。如果这些数据总是写在同一个 flash 单元,那么你只能在 MLC flash 上写 15K 次。如果永远不使用其他 flash 单元,你的数据将会丢失,一直在写的存储单元磨损后,flash 也就随着报废。智能的 flash 驱动会采用磨损平衡。这个技术确保所有的 flash 单元被平均磨损,而不是总是使用同一个单元。

  检测和纠正错误:纠错码

  在 NAND flash 设备有可能发生个位的数据发生翻转,你的数据因此损坏。磨损或者其他干扰都有可能引起这个现象。因此,数据需要被纠错码(ECC)保护。根据 Flash 控制器和 NAND / eMMC 的不同,部分错误数据可以被检测和纠正。

  坏块处理

  ECC 使我们能够发现错误的块,我们就可以停止使用这些坏块。根据 ECC 以及纠正的位数,可以设定容错上限,这个范围之内不需要采取进一步行动。一旦达到这个上限,数据被纠正,并转移到正常的块上面。 之前的位置表记为坏块。这些坏块不再被使用,因为它们可能已经损坏。

  掉电保护

  当你的设备在往 flash 写数据的时候突然掉电,这将会发生什么?在嵌入式设备上,你希望设备仍旧可以正常启动,并且数据不受到损坏。为了达到这个目的,所有相关的软件和硬件都需要有能力应对这种情况。你将会在下面的内容中了解我们是如何做到的。

  Toradex 系统模块实施方法

  正如上面提到的,关键是根据存储的类型采用正确配置。我们会分析目前 Toradex BSP 上所使用的技术。

  NAND 设备

  下图展示了在 NAND 设备上行 WinCE  Linux 的配置

 

NAND-based devices

 

存储设备:我们的设备只要使用 NAND,那么都用的是 SLC NAND

硬件驱动:硬件驱动为 NAND 设备和上层系统提供接口。上层系统也负责错误检测和纠正。在 Linux 上我们目前的镜像使用 MTDWinCE 上我们使用 Microsoft Flash PDD 层。也有例外,如 Colibri T20,我们使用了专门的 PDD 层。

Flash 传输层:该层负责写平衡和坏块管理。在 Linux 中由 UBI 子系统完成;而 WinCE 则由 MDD 层完成。同样在 Colibri T20 上我们使用了专门的层,而不是 Microsoft Flash MDD

文件系统:文件系统是实际管理分区以及所存文件的部分。用户通过文件 API 来是用文件系统(Linux 中通过 VFS 层)。在Linux 上,目前我们使用 UBI FSWinCE 使用 Transaction Save exFAT (TexFAT) 。两者都可以应对掉电。基本的文件层通过支持原子操作来应对掉电发生。

eMMC 设备

下图展示了在 eMMC 设备上行 WinCE  Linux 的配置

 

eMMC-based devices

 

存储设备:相对于 raw NAND,绝大多数的工作由 eMMC 本身完成。上层软件不需要处理写平衡、纠错和坏块管理。

硬件驱动:这是 MMC 控制器和文件系统之间的接口.

文件系统:和 NAND 设备一样,WinCE 上仍旧使用 TexFAT;我们的 Linux 镜像使用 ext3 文件系统。同样也是能够应对掉电情况。

结论和建议

  Toradex 尽自己最大的努力提供可靠和持久的 flash 存储。然而,在开发的过程中,你还是需要始终关注 flash 的使用。

·       减少 flash 访问次数

·       了解你最终产品的写操作行为

·       检查在写操作的情况下,你产品使用寿命是否能够达到要求

·       进行压力测试和持久测试

·       避免使用 Flash 全部容量,这可以极大地提高写平衡算法的效率