📜  基于闪存的固态驱动器(SSD)

📅  最后修改于: 2021-06-28 15:21:45             🧑  作者: Mango

如本文所述,固态存储设备(SSD)不包含任何活动部件。它们由晶体管制成,并且可以在断电的情况下保留信息,这与随机存取存储器不同。 Flash是1980年代开发的一种有趣的技术。

存放位:
闪存芯片可以在一个晶体管中存储一个或多个位。晶体管中捕获的电荷量被转换为二进制数。根据存储在单个晶体管中的位数,闪存芯片可以有多种类型:

  • 单级单元(SLC)闪存:
    晶体管中仅存储一位。因此,位值可以为0或1。
  • 多层单元(MLC)闪存:
    两位存储在晶体管中。因此,位的值可以是00、01、10和11 –从最低到最高电荷水平。
  • 三级单元(SLC)闪存:
    三位存储在晶体管中。

SLC芯片具有最高的性能,并且是三者中最昂贵的。

银行和飞机:
显然,仅存储一点是不够的。因此,闪存芯片被分组为由大量单元组成的存储体平面。

银行:
银行被组织成。块大小从128-256 KB不等,页面大小约为4 KB。下图显示了一个示例闪存芯片,包含3个块和每个块4页,即总共3 * 4 = 12页。

块和页面结构对于闪存操作至关重要。

闪存操作:
以下是闪存操作支持的三个低级操作。

  • 读:
    要读取页面,Flash客户端只需指定随read命令发出的页码即可。随机访问设备允许均匀且快速地读取任何信息,而不管其位置如何。
  • 清除:
    您必须先擦除相应的整个块,然后才能在闪存中写入页面。要擦除一个块,将每个位的值设置为1。由于必须再次写入数据,因此在执行擦除命令之前将其复制到缓冲区中。
  • 程序:
    擦除一个块后,程序命令将一些1更改为0。

读取页面是最快的命令,大约需要10微秒的时间才能完成。对页面进行编程是第二快的,耗时100微秒。擦除块最慢,因为在清空块之前需要将内容复制到缓冲区,并且需要几毫秒的时间才能完成。

页面状态:
Flash页面具有与之关联的“状态”。最初,所有页面都处于INVALID状态。如果擦除一个块,则该块内的所有页面都将变为ERASED状态。这样的页面是可编程的,因为它们可以接受写操作。对页面进行编程后,它将变为有效状态。这意味着可以读取页面的内容。

考虑以下包含4页的块的初始方向。由于这些页面中的每一个都已经被编程过并且已经将一些已经存在的数据写入了它们,因此它们都处于VALID状态。

现在,假设Flash客户端希望写入页面0。要写入任何页面,需要擦除整个块。

擦除整个块后,所有4页均处于ERASED状态,并且所有位均设置为1。最后,我们可以写入页0。

由于新数据已被写入页面0并且可以从中读取,因此页面0现在处于有效状态。其他页面仍处于ERASED状态。最后,从临时存储器中读取先前存储在页面1、2和3中的数据,并将其写回到页面中。

可靠性问题:
频繁的写入和擦除操作会导致闪存芯片磨损。发生这种情况是由于积聚在闪光灯块表面上的多余电荷所致。随着越来越多的电荷累积,很难区分0和1。此块将变得不可用,需要丢弃。第二个可靠性问题是干扰。发生这种情况的原因是,当尝试在特定页面上读取/写入数据时,相邻页面中的位发生了翻转。这些也称为读取干扰程序干扰

基于闪存的SSD:
基于闪存的固态硬盘在闪存芯片的顶部提供了一个接口,用于读取/写入数据。 SSD包含用于持久存储的闪存芯片;非永久性存储器,例如用于缓存和缓冲的SRAM;和控制逻辑来处理闪存操作。 Flash Translation Layer(FTL)将客户端的读写请求转换为Flash操作,这是低级操作。它实质上将逻辑操作转换为具有高可靠性的物理操作。 FTL还有助于解决上面提到的一些可靠性问题。

  • 处理磨损:
    FTL尽可能分散并均匀分布闪存块,以使所有闪存块在同一时间磨损。
  • 处理干扰:
    为了在对芯片进行编程时处理干扰,FTL采用了顺序编程方法。从最低页面到最高页面按顺序对擦除的块进行编程,从而覆盖过程中翻转的所有位。

对数结构的FTL:
与日志结构的文件系统类似,当今的大多数FTL都是日志结构的,这意味着在物理上执行写入闪存块之前,将写操作在缓冲区中分组在一起。