Skip to the content.

深入浅出 SSD

请阅读完成下面的内容,然后再去看别的东西

https://github.com/spdk/spdk : 配合 dpdk 了解一下,还可以分析一下 build your own x 的 tcp stack 的构建过程

https://link.springer.com/chapter/10.1007/978-94-017-7512-0_10

Introduction

·FTL 闪存转换层:作为 SSD 固件的核心部分,FTL 实现了例如映射管理、磨损均衡、垃圾回收、坏块管理等诸多功能,本书将一一介绍。 ·NAND Flash:NAND Flash 作为 SSD 的存储介质,具有很多与传统磁介质不同的特性,本书将从器件原理、实战指南、闪存特性及数据完整性等方面展开。 ·NVMe 存储协议:作为专门为 SSD 开发的软件存储协议,NVMe 正在迅速占领 SSD 市场。本书将从其优势、基础架构、寻址方式、数据安全等方面展开。为了让读者对 NVMe 命令处理有更加直观的认识,本书结合实际的 PCIe trace 进行阐述。同时,本书也介绍了 NVMe Over Fabric 的相关知识,让读者能够对未 [……] ·PCIe 协议:PCIe 作为目前主流的 SSD 前端总线,与之前的 SATA 接口相比有着极大的性能优势。本书将从 PCIe 总线拓扑结构、分层结构、TLP 类型与路由、配置和地址空间等方面进行介绍。 ·电源管理:本书详述了 SSD 前端总线(包括 SATA 和 PCIe)的各种节能模式、NVMe 协议的电源管理方案及在 SSD 里常用的整体电源管理架构——Power Domain。 ·ECC:本书介绍了 ECC 的基本概念,重点介绍了 LDPC 的解码和编码原理,以及在 NAND 上的应用。

SSD 是用固态电子存储芯片阵列制成的硬盘,主要部件为控制器和存储芯片,内部构造十分简单。详细来看,SSD 硬件包括几大组成部分:主控、闪存、缓存芯片 DRAM(可选,有些 SSD 上可能只有 SRAM,并没有配置 DRAM)、PCB(电源芯片、电阻、电容等)、接口(SATA、SAS、PCIe 等),其主体就是一块 PCB,如图 1-3 所示。软件角度,SSD 内部运行固件(Firmware,FW)负责调度数据从接口端到介质端的读写,还包括嵌入核心的闪存介质寿命和可靠性管理调度算法,以及其他一些 SSD 内部算法。SSD 控制器、闪存和固件是 SSD 的三大技术核心

SSD 通过诸如 SATA、SAS 和 PCIe 等接口与主机相连,实现对应的 ATA、SCSI 和 NVMe 等协议

补充一下表格 1-5

主要有以下几种原因导致:

SSD 上电加载后,主机 BIOS 开始自检,主机中的 BIOS 作为第一层软件和 SSD 进行交互:第一步,和 SSD 发生链接,SATA 和 PCIe 走不同的底层链路链接,协商(negotiate)到正确的速度上(当然,不同接口也会有上下兼容的问题),自此主机端和 SSD 连接成功;第一步,发出识别盘的命令(如 SATA Identify)来读取盘的基本信息,基本信息包括产品 part number、FW 版本号、产品版本号等,BIOS 会验证信息的格式和数据的正确性,然后 BIOS 会走到第三步去读取盘其他信息,如 SMART,直到 BIOS 找到硬盘上的主引导记录 MBR,加载 MBR;第四步,MBR 开始读取硬盘分区表 DPT,找到活 动分区中的分区引导记录 PBR,并且把控制权交给 PBR……最后,SSD 通过数据读写功能来完成最后的 OS 加载。完成以上所有这些步骤就标志着 BIOS 和 OS 在 SSD 上电加载成功。任何一步发生错误,都会导致 SSD 交互失败,进而导致系统启动失败,弹出 Error window 或蓝屏。

主控

主控是 SSD 的大脑,承担着指挥、运算和协调的作用,具体表现在:一是实现标准主机接口与主机通信;二是实现与闪存的通信;三是运行 SSD 内部 FTL 算法。

Flash

一个 Block 当中的所有这些存储单元都是共用一个衬底的。

一个 Wordline 对应着一个或若干个 Page,具体是多少取决于是 SLC、MLC 或者 TLC。对 SLC 来说,一个 Wordline 对应一个 Page;MLC 则对应 2 个 Page,这两个 Page 是一对(Lower Page 和 Upper Page);

MLC 可以包含两个 bit 的信息,对应 lower page 和 uppper page

读干扰会导致浮栅极进入电子。由于有额外的电子进入,会导致晶体管阈值电压右移(Data Retention 问题导致阈值电压左移)

PCIe

PCI 使用并口传输数据,而 PCIe 使用的是串口传输

PCI 采用的是总线型拓扑结构,一条 PCI 总线上挂着若干个 PCI 终端设备或者 PCI 桥设备,大家共享该条 PCI 总线,哪个人想说话,必须获得总线使用权,然后才能发言

图 5.6 和 5.7 很有,补充一下

Root Complex(RC)是树的根,它为 CPU 代言,与整个计算机系统其他部分通信,比如 CPU 通过它访问内存,通过它访问 PCIe 系统中的设备。 RC 的内部实现很复杂,PCIe Spec 也没有规定 RC 该做什么,不该做什么。我们也不需要知道那么多,只需清楚:它一般实现了一条内部 PCIe 总线(BUS 0),以及通过若干个 PCIe bridge,扩展出一些 PCIe Port,如图 5-8 所示。

PCIe 定义了下三层:事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer,包括逻辑子模块和电气子模块)

事务层的主要职责是创建(发送)或者解析(接收)TLP(Transaction Layer Packet)、流量控制、QoS、事务排序等。 数据链路层的主要职责是创建(发送)或者解析(接收)DLLP(Data Link Layer Packet)、Ack/Nak 协议(链路层检错和纠错)、流控、电源管理等。 物理层的主要职责是处理所有的 Packet 数据物理传输,发送端数据分发到各个 Lane 传输(Stripe),接收端把各个 Lane 上的数据汇总起来(De-stripe),每个 Lane 上加扰(Scramble,目的是让 0 和 1 分布均匀,去除信道的电磁干扰 EMI)和去扰(De-scramble),以及 8/10 或者 128/130 编码解码等。

Switch 的主要功能是转发数据,为什么还需要实现事务层?Switch 必须实现这三层,因为数据的目的地信息是在 TLP 中的, 如果不实现这一层,就无法知道目的地址,也就无法实现数据寻址路由。

根据软件层的不同请求,事务层产生四种不同的 TLP 请求:

每个 PCIe 设备都有这样一段空间,主机软件可以通过读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就称为 PCIe 的配置空间。 整个配置空间就是一系列寄存器的集合,由两部分组成:64B 的 Header 和 192B 的 Capability 数据结构。

具体实现就是上电的时候,系统把 PCIe 设备开放的空间(系统软件可见)映射到内存地址空间,CPU 要访问该 PCIe 设备空间,只需访问对应的内存地址空间。RC 检查该内存地址,如果发现该内存空间地址是某个 PCIe 设备空间的映射,就会触发其产生 TLP,去访问对应的 PCIe 设备,读取或者写入 PCIe 设备。

FTL

根据映射粒度的不同,FTL 映射有基于块的映射,有基于页的映射,还有混合映射(Hybrid Mapping)。

FTL 都是基于页映射的,因为现在 SSD 基本都是采用这种映射方式。

对于绝大多数 SSD,我们可以看到上面都有板载 DRAM,其主要作用就是存储这张映射表

映射表在 SSD 掉电前,是需要把它写入到闪存中去的。下次上电初始化时,需要把它从闪存中部分或全部加载到 SSD 的缓存(DRAM 或者 SRAM)中。随着 SSD 的写入,缓存中的映射表不断增加新的映射关系,为防止异常掉电导致这些新的映射关系丢失,SSD 的固件不仅仅只在正常掉电前把这些映射关系刷新到闪存中去,而是在 SSD 运行过程中,按照一定策略把映射表写进闪存。这样,即使发生异常掉电,丢失的也只是一小部分映射关系,上电时可以较快地重建这些映射关系

如果用户顺序写的话,垃圾比较集中,利于 SSD 做垃圾回收;如果用户是随机写的话,垃圾产生比较分散,SSD 做垃圾回收相对来说就更慢

Trim 对于写放大影响很大.

文件系统的删除,将特定的区域标记为 free,当文件系统这些地方分配出去,重新写的时候, 那么,这些地方被标记为无效, 如果对于 free 的写,不是连续,那么其实是 free 的空间就会被 搬运一遍。

f2fs 的连续写可以防范 ssd 的碎片化

FTL 映射表记录每个 LBA 对应的物理页位置。Valid Page Bit Map(VPBM)记录每个物理块上哪个页有有效数据,Valid Page Count(VPC)则记录每个物理块上的有效页个数。通常 GC 会使用 VPC 进行排序来回收最少有效页的闪存块;VPBM 则是为了在 GC 时只读有用的数据,也有部分 FTL 会省略这个表。

动态磨损平衡算法的基本思想是把热数据写到年轻的块上,即在拿一个新的闪存块用来写的时候,挑选擦写次数小的;静态磨损平衡算法基本思想是把冷数据写到年老的块上,即把冷数据搬到擦写次数比较多的闪存块上。

问题

  1. erase 和 write 的 granularity 的为什么是 block 和 page
    1. 为什么划分为 block 和 page 的级别 ?
  2. nvme 和 PCIe 的关系是相互替代 ?
    1. 所在的层次是什么 ?
    2. 能不能对其编程
  3. github 上 nvme 的工具的实现说明这些 SSD 都是存在相同的接口的,那么能不能写一个程序,类似的 瞎几把操作 ssd
    1. 系统中间的
  4. FTL 的映射表:
    1. FTL 的映射表放在那里啊! 如果也是使用 nand 进行存储,那么,
  5. SSD 的缓存
    1. 冷热数据的区分为什么可以更好的处理 flash 特性
  6. nand : 写的粒度和 erase 的粒度 ?

  7. 操作写放到的因素是什么 ?

  8. M.2 的关系是什么 ?
  9. PCIe 和 USB 的关系 ?

  10. PCIe 的 RC 可以自动将读写设备的空间转化为 设备的访问,那么 IOMMU 做啥的 ?
    1. PCIe 的空间相互冲突,怎么办 ? 那些驱动似乎是将 PCIe 映射的空间在软件重点写死的
    2. PCIe 是如何和 DMA 相互交互的, 存在 PCIe 控制器这种东西吗 ? 那么 DMA 控制器放在那里了 ?

看看

https://pages.cs.wisc.edu/~remzi/OSTEP/file-ssd.pdf

https://news.ycombinator.com/item?id=39908146

有趣的

https://mp.weixin.qq.com/s/_1Ih5C-r07-DM2T-5ntXSw

看看这些产品吧,还是很有趣的

https://semiconductor.samsung.com/cn/ssd/datacenter-ssd/pm9a3/mzql21t9hcjr-00a07/

nvmecli 的简单使用

https://metebalci.com/blog/a-quick-tour-of-nvm-express-nvme/

这里的测试方法,测试工具学习一下

https://mp.weixin.qq.com/s/MGazZjYVcUuuqbL7pOlpew

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。