正文内容 评论(0

2011固态硬盘终极横评、选购指南
2011-11-21 17:17:26   编辑:上方文Q     评论(0)点击可以复制本篇文章的标题和链接

闪存逻辑转换层(FTL)

为了使 SSD 让操作系统看起来一个标准的硬盘设备,就需要将 ATA 指令(以 ATA-8 为例,有超过 50 条指令,其中还有一些 SSD 根本不会用到的指令,例如 PIO 模式的读写指令)转换为闪存芯片能明白的指令,这就需要在 SSD 中引入被称作 FTL(闪存转换层)的界面,这个界面目前由闪存主控芯片实现,不过以后可能会被直接跳过,例如 NVM Express 标准接口的 SSD。

现在的操作系统其实大都属于“DOS”,即磁盘操作系统,操作系统本身被设计为存放在“旋转”盘体的存储器上,电脑经过 BIOS 引导、初始化后,才会启动操作系统。

操作系统每次存储的最小尺寸单位是一个“块”(在 MS-DOS、Windows 中,这个“块”的名称是“扇区”(sector)),存储设备因此也被称作存储块设备(block device)。扇区的大小一般为 512 个字节,但是这个尺寸的管理相当不便,特别对大文件来说更是如此。因此在实际中扇区会被打包成一个被称作“簇”的分配单位,对 FAT 文件系统来说,簇的大小取决于文件结构及驱动器的容量,而对 NTFS 文件系统来说簇的大小一般是 4KB(相当于 8 个扇区)。

而 NAND 闪存这边是以存储块(Block)、存储页(page)、存储列(columns,8 个位元)来组织的,这取决于制造工艺,例如上面所说的 25nm IMFT 64Gb 闪存芯片里,存储页大小是 4KB,每个存储块有 256 个页面或者说 1MB。

闪存需要透过 FTL 将自己模拟成一个基于扇区的设备,使得操作系统的逻辑地址(LBA)重新映射成闪存的物理地址(PBA)。经过 FTL 后,SSD 里各个前后物理页面对应的逻辑地址不一定是连续的。当然,像 JFFS、YAFFS 等文件系统是可以直接跳过 FTL 直达下一层的 MTD。

对操作系统来说,FTL 的作用就是从文件系统在指定的位置(扇区)取得、写入数据;

对闪存来说 FTL 的首要功能是把数据存放在闪存中空闲或者已被擦除的位置并标记出真实的数据位置,在数据更新了的时候将包含旧数据的存储块标记为无效,这步被称作 “Garbage Collection(废物回收或者更简单一点:清除)”。地址转换和 GC 是所有 FTL 必备的特性。

除此以外,FTL 还需要实现掉电恢复、坏块管理、损耗平衡、错误码纠正等任务。

2011固态硬盘终极横评、选购指南

上图就是美光 NFTL 4.60 的架构图。

常见的闪存闪存管理机制有三种:FTL、BL、NFTL。

FTL 是依靠一个地址转换表来映射任何给定的 LBA 到 SSD 里的 PBA,属于细粒度的地址转换。

BL 则是采用块级别的粗粒度地址转换机制,在 BL 中的 LBA 会成为一个虚拟块地址(VBA)的若干部分,偏移量就是闪存的存储页,转换表中存放的是来自每个给定 VBA 至对应 PBA 的映射信息,数据会被写入到 PBA 中对应的块偏移地址中,如果对应的页已经被使用,数据就会被安排到一个新的块中,原块中的有效数据和更新的数据也会复制到新块中。

NFTL 采用 BL 的映射机制,但是 NFTL 采用了一个更换块来处理后续的写入请求。重写请求的内容会被持续地写入到一个更换块中,因此在 NFTL 中的地址表存放着两个物理块地址入口,即元块和更换块。当更换块写满后,更换块和它对应的元块会合并到一个新的元块中,在这个合并操作中,更换块和元块中的所有有效数据都会分配到新的元块中,原来的更换块和元块都会被擦除掉。

写入放大率(主机写入 vs. NAND 写入)

闪存芯片的位宽一般都是 8 位,以美光 MT29F64G08CFACBWP-12 为例,它支持两种运作模式,即同步模式(数据包之间的时间片是固定的)和异步模式(数据包之间的时间片并不固定),传输速率分别为最高 166MT/s 和最高 50MT/s,理论带宽分别为最高 166MB/s 和 50MB/s。

不过受制于当前大多数 SSD 采用 SATA 界面的限制以及异步模式采用多通道等带宽延伸技术,实际应用中两者的带宽并无多大区别。例如 Crucial M4 128GB 采用的是 8 条存储通道,同步模式和异步模式的理论带宽分别为 1328MB/s 和 400MB/s,但是 Crucial M4 采用的界面不过是最高 6Gbps 的 SATA 3.0,即使运行于同步模式下顶多也就是 750MB/s,远低于 166MB/s*8 vs 50MB/s*8 的差别。除此以外,闪存控制器等环节本身也会吃掉一部分的性能。当然,同步模式的性能优势的确是存在的,而且从芯片本身来说这个优势是免费的。

有些早期的 SSD 采用固定通道存取系统,也就是说如果 SSD 的闪存通道是 8 条,那么这些 SSD 每次存取操作的大小都是固定的 4KB*8 = 32KB,或者说不管是读取还是写入,最小的存储块都是 32KB大小。

如果这个操作中的部分数据是空白的,这些空白数据对应的位址会被写入以“FF”,而这个“FF”在 NAND FLASH 中是“已擦除”的标记,这将导致一次擦除动作:一个包含有空白数据的写入操作,会导致至少一个存储块或者说 8MB 字节(1MB per Block*8Block)的擦除操作。

这样的设计无论是对控制器、闪存矩阵都是存在浪费问题的,更重要的是这样的设计会对整个驱动器(而不仅仅是某个闪存芯片)的耐用性产生严重的影响,因此现在的闪存控制器都采用了独立的读写通道控制器来尽量将每次存取操作中发生的擦除操作最小化。

有一个和最小可擦除尺寸类似的尺度被称作写入放大率(Write Amplification),当然两者不不一样。写入放大率本身只是指文件系统对存储设备的写入操作大小和存储设备向存储媒体实际写入操作大小之间的比率,并不仅仅限于描述某种存储机制下的情况。

比如闪存控制器足够聪明的话,在操作系统向 SSD 只写入 1KB数据的情况下时,应该只会占用一条通道,但是 MLC NAND FLASH 的最小写入单位是 page,如果 page 的大小是 4KB,那么写入放大率就是 4 倍,如果 page 是 8KB,那么写入放大率就是 8 倍。

SLC 闪存允许局部页写入,所以在这样的情况下可以将写入放大倍率降低 50%;MLC 虽然是同一个晶体管存放两个位元,但是这两个位元其实是分属不同的存储页(如果是 3 位元的 MLC,则每个晶体管内存放的三个位元其实分属三个不同的 Page,可避免出现 6KB 这类看上去有些古怪的 Page 大小),所以无法做到局部页写入。

此外如果写入的数据是可压缩并且 SSD 主控支持压缩写入的话,写入放大倍率也能有所缩小,例如 SandForce 的主控器。

但是像上面举的早期固定式存储通道设计,那就是 32 倍的写入放大倍率,操作系统每写入一个字节,就会导致 32 个字节的存储媒体实际写入操作。

责任编辑:

  • 支持打赏
  • 支持0

  • 反对

  • 打赏

文章价值打分

当前文章打分0 分,共有0人打分
  • 分享好友:
  • |
本文收录在
#快讯

  • 热门文章
  • 换一波

  • 好物推荐
  • 换一波

  • 关注我们

  • 微博

    微博:快科技官方

    快科技官方微博
  • 今日头条

    今日头条:快科技

    带来硬件软件、手机数码最快资讯!
  • 抖音

    抖音:kkjcn

    科技快讯、手机开箱、产品体验、应用推荐...