第2章 SSD主控和全闪存阵列
# 第2章 SSD 主控和全闪存阵列
SSD 主要由两大模块构成——主控和闪存介质。其实除了上述两大模块外,可选的还有缓存单元。
主控是 SSD 的大脑,承担着指挥、运算和协调的作用:
- 一是实现标准主机接口与主机通信;
- 二是实现与闪存的通信;
- 三是运行 SSD 内部 FTL 算法。
可以说,一款主控芯片的好坏直接决定了 SSD 的性能、寿命和可靠性。
# 2.1 SSD 系统架构
SSD 作为数据存储设备,是一种典型的(System on Chip)单机系统,有主控 CPU、RAM、操作加速器、总线、数据编码译码等模块。
- 操作对象:协议、数据命令、介质
- 操作目的:写入和读取用户数据
SSD 系统架构的概略图(见下图 2-1)
这款主控采用 ARM CPU,主要分为前端和后端两大部分。
- 前端(Host Interface Controller,主机接口控制器): 跟主机打交道,接口可以是 SATA、PCIe、SAS 等。
- 后端(Flash Controller,闪存控制器): 跟闪存打交道并完成数据编解码和 ECC。
- 除此之外还有缓冲(Buffer)、DRAM。
- 模块之间通过AXI高速和APB低速总线互联互通,完成信息和数据的通信。
在此基础之上,由 SSD 固件开发者构筑固件(Firmware)统一完成 SSD 产品所需要的功能,调度各个硬件模块,完成数据从主机端到闪存端的写入和读取。
# 2.1.1 前端
主机接口:与主机进行通信(数据交互)的标准协议接口,当前主要代表为 SATA、SAS 和 PCIe 等。表2-1所示是三者的接口速率。
表 2-1 SATA、SAS、PCIe 接口速率
接口 | 速率(Gbps) |
---|---|
SATA | 6/3/1.5 |
SAS | 12/6 |
PCIe | 通道数 × 8(PCIe3.0) |
- SATA(Serial Advanced Technology Attachment(串行高级技术附件)): 是一种基于行业标准的串行硬件驱动器接口,是由 Intel、IBM、Dell、APT、Maxtor 和 Seagate 公司共同提出的硬盘接口规范(见下图2-2)。
SAS(Serial Attached SCSI): 即串行连接 SCSI,是新一代的 SCSI 技术,和现在流行的 Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连接线改善内部空间等(见下图2-3)。
SAS 是并行 SCSI 接口之后开发出的全新接口,此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与 SATA 硬盘的兼容性。SAS 的接口技术可以向下兼容 SATA。
具体来说,二者的兼容性主要体现在物理层和协议层。
- 在物理层,SAS 接口和 SATA 接口完全兼容,SATA 硬盘可以直接用在 SAS 的环境中;从接口标准上而言,SATA 是 SAS 的一个子标准,因此 SAS 控制器可以直接操控 SATA 硬盘,但是 SAS 却不能直接用在 SATA 的环境中,因为 SATA 控制器并不能对 SAS 硬盘进行控制。
- 在协议层,SAS 由3种类型的协议组成,根据连接设备的不同使用相应的协议进行数据传输。
- 其中串行 SCSI 协议(SSP)用于传输 SCSI 命令;
- SCSI 管理协议(SMP)用于对连接设备的维护和管理;
- SATA 通道协议(STP)用于 SAS 和 SATA 之间数据的传输。
PCIe(Peripheral Component Interconnect Express): 是一种高速串行计算机扩展总线标准,它原来的名称为3GIO。PCIe 属于高速串行点对点多通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,主要支持主动电源管理、错误报告、端对端的可靠性传输、热插拔以及服务质量(QoS,Quality of Service)等功能。PCI Express 也有多种规格,从 PCI Express 1X 到 PCI Express 32X,意思就是1个通道到32个通道,能满足将来一段时间内出现的低速设备和高速设备的需求。PCI-Express 最新的接口是PCIe 4.0接口。
主要优势:
- 数据传输速率高,目前最高的4.0版本可达到2GB/s(单向单通道速率)
- 发展潜力大
图 2-4 PCIe 接口式插卡(AIC)
图 2-5 U.2 接口
前端是负责主机和 SSD 设备通信的接口,命令和数据传输通过前端总线流向或流出 SSD 设备。从硬件模块上来看,前端有 SATA/SAS/PCIe PHY 层,俗称物理层,接收串行比特数据流,转化成数字信号给前端后续模块处理。这些模块处理 NVMe/SATA/SAS 命令,它们接收并处理一条条命令和数据信息,涉及数据搬移会使用到 DMA。一般命令信息会排队放到队列中,数据会放到 SRAM 快速介质中。如果涉及加密和压缩功能,前端会有相应的硬件模块来做处理,若软件无法应对压缩和加密的快速需求,则会成为性能的瓶颈。
从协议角度,以一条 SATA Write FPDMA 命令为例对上述内容进行说明。
从主机端文件系统发出一条写命令请求,该请求到主板南桥 AHCI 寄存器后,AHCI 寄存器执行请求,即进行写操作,忽略文件系统到 AHCI 路径的操作细节,从 SSD 前端总线上看会发出如下的写交互操作(见图2-6):
- 步骤1:主机在总线上发出 Write FPDMA 命令 FIS(Frame Information Structure,帧信息结构,是 SATA 为了实现异步传输数据块而使用的封包)。
- 步骤2:SSD 收到命令后,判断自己内部写缓存(Write Buffer)是否有空间去接收新的数据。如果有,则发出 DMA Setup FIS 到主机端;否则什么也不发,主机端处于等待状态(这叫流控:数据流量控制)。
- 步骤3:主机端收到 DMA Setup FIS 后,发送不大于 8KB 数据的 Data FIS 给设备。
- 步骤4:重复步骤2和步骤3直到数据全部发送完毕。
- 步骤5:设备(SSD)发送一个状态 Status FIS 给主机,表示从协议层面这条写命令完成全部操作。当然 Status 可以是一个 good status 或者一个 bad/error status,表示这条 Write FPDMA 命令操作正常或者异常完成。
# 2.1.2 主控 CPU
SSD 控制器 SoC 模块一般由一颗或多颗 CPU 核组成,同时片上有 I-RAM、D-RAM、PLL、IO、UART、高低速总线等外围电路模块。CPU 负责运算、系统调度,IO 完成必要的输入输出,总线连接前后端模块。
- 固件运行在 CPU 核上
- I-RAM: 代码存储区
- D-RAM: 数据存储区
- 多核CPU,软件可以是对称多处理(SMP)和非对称多处理(AMP)
- 对称多处理(SMP): 共享 OS 和同一份执行代码,共享一份 I-RAM 和 D-RAM,资源共享;
- 非对称多处理(AMP): 多核分别执行不同代码,每核对应一份 I-RAM 和 D-RAM,每核独立运行,没有内存抢占导致代码速度执行变慢的问题。
当 SSD 的 CPU 要求计算能力更高时,除增加核数和单核 CPU 频率外,AMP 的设计方式更加适应计算和任务独立的要求,消除了代码和数据资源抢占导致执行速度过慢的问题。
SSD 的 CPU 外围模块包括 UART、GPIO、JTAG,这些都是程序必不可少的调试端口,另外还有定时器模块 Timer 及其他内部模块,比如 DMA、温度传感器、Power regulator 模块等。
# 2.1.3 后端
后端两大模块分别为 ECC 模块和闪存控制器(见图2-7)。
ECC 模块是数据编解码单元,由于闪存存储天生存在误码率,为了数据的正确性,在数据写入操作时应给原数据加入 ECC校验保护,这是一个编码过程。读取数据时,同样需要通过解码来检错和纠错,如果错误的比特数超过 ECC 纠错能力,数据会以“不可纠错”的形式上传给主机。这里的 ECC 编码和解码的过程就是由 ECC 模块单元来完成的。SSD 内的 ECC算法主要有 BCH 和 LDPC,其中 LDPC 正逐渐成为主流。
闪存控制器使用符合闪存 ONFI、Toggle 标准的闪存命令,负责管理数据从缓存到闪存的读取和写入。
闪存控制器如何和闪存连接和通信?
从单个闪存角度看,一个 Die/LUN 是一个闪存命令执行的基本单元,闪存控制器和闪存连接引脚按照如下操作(见图2-8):
- 外部接口:8个 IO 接口,5个使能信号(ALE、CLE、WE#、RE#、CE#),1个状态引脚(R/B#),1个写保护引脚(WP#);
- 命令、地址、数据都通过8个 IO 接口输入输出;
- 写入命令、地址、数据时,都需要将 WE#、CE# 信号同时拉低,数据在 WE# 上升沿被锁存;
- CLE、ALE 用来区分 IO 引脚上传输的是数据还是地址。
从闪存控制器角度看,为了性能需求需要并发多个闪存 Die/LUN,通常配置有多个通道(channel)。一个通道挂多少个闪存 Die/LUN,取决于 SSD 容量和性能需求,Die/LUN 个数越多,并发的个数越多,性能越好。
Die/LUN是闪存通信的最小基本管理单元,配有上述的一套总线,即8个I/O口,5个使能信号(ALE、CLE、WE#、RE#、CE#),1个状态引脚(R/B#),1个写保护引脚(WP#)……
如果一个通道上挂了多个闪存 Die/LUN,每个 Die 共用每个通道上的一套总线,那闪存控制器如何识别和哪个 Die 通信呢?答案是通过选通信号 CE# 实现。在闪存控制器给特定地址的闪存 Die 发读写命令和数据前,先选通对应 Die 的 CE#信号,然后进行读写命令和数据的发送。一个通道上可以有多个 CE,SSD 主控一般设计为4~8个,对于容量而言选择有一定的灵活度。
# 2.2 全闪存阵列 AFA
U 盘是一两个闪存芯片和控制器封装,SSD 是很多 U 盘的阵列,全闪存阵列是很多 SSD 的阵列,只不过 U 盘是最差的闪存,SSD 好一点,AFA 用得更好。