固态硬盘SSD学习笔记:SSD主控

一. SSD系统架构

SSD作为数据存储设备,其实是一种典型的单机系统(Soc),有主控CPU,RAM,操作加速器,总线,数据编码译码等模块。操作对象为协议,数据命令,介质。操作目的是写入和读取用户数据。
固态硬盘SSD学习笔记:SSD主控_第1张图片
如这款主控采用ARM CPU,主要分为前端和后端两大部分。前端和主机打交道,接口可以是SATA,PCIe,SAS等。后端跟闪存打交道并完成数据编解码和ECC。除此之外还有缓冲,DRAM。模块之间通过AXI高速和APB低速总线互联互通,完成信息和数据的通信。在此基础上,SSD固件开发统一完成SSD产品需要的功能,调度各个模块,完成数据从主机到闪存的写入和读取。

1.1 前端

主机接口:与主机进行通信(数据交互)的标准协议接口,当前主要代表是SATA,SAS,PCIe)等。
固态硬盘SSD学习笔记:SSD主控_第2张图片
SATA:Serial Advanced Technology Attachment(串行高级技术附件),行业标准的串行硬件驱动接口。
SAS:Serial Attached SCSI,串行连接SCSI,向下兼容SATA。
PCIe:Peripheral Component Interconnect Express,高速串行计算机扩展总线标准,原名3GIO,替代旧的PCI,PCI-X和AGP总线标准。高速串行点对点多通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,支持主动电源管理、错误报告、端对端的可靠性传输、热插拔以及Qos。
从硬件模块看,前端有STAT/SAS/PCIe PHY层,俗称物理层,接收串行比特数据流,转化成数字信号给前端后续模块处理。这些模块处理NVMe/SATA/SAS命令,它们接收并处理一条条命令和数据信息,涉及数据搬移会用到DMA。一般命令信息会排队放到队列中,数据会放到SRAM快速介质中。如果涉及加密和压缩功能,前端会有相应的硬件模块处理。

从协议角度,以一条SATA Write FPDMA命令对上述内容说明。从主机端文件系统发出一条写命令请求,该请求到主板南桥AHCI寄存器后,AHCI寄存器执行请求,进行写操作,忽略文件系统到AHCI路径的操作细节,从SSD前端总线上会看到发生如下交互:
固态硬盘SSD学习笔记:SSD主控_第3张图片
1:主机在总线上发出Write FPDMA命令FIS(Frame Information Structure,帧信息结构,是SATA为了实现异步传输数据块而使用的封包)
2:SSD收到命令后,判断自己内部写缓存(Write Buffer)是否有空间去接收新的数据。如果有,则发出DMA Setup FIS到主机端;否则什么也不发,主机端处于等待状态(流控)。
3:主机端接收到DMA Setup FIS后,发送不大于8KB数据的Data FIS给设备。
4:重复23直到数据发完
5:SSD发送一个状态Status FIS给主机,表示从协议层面这条写命令完成全部操作。当然Status可以是good或error,表示这条命令是正常还是异常。

SSD接受命令和数据并放到SSD内部缓冲区后还需要做什么?任务还没完成,前端固件模块还需要对命令进行解析,并分派给中端FTL。命令解析(Command Decoder)将命令FIS解析成固件和FTL能理解的元素。
这是一条什么命令,命令属性是读还是写;
这条写命令的起始LBA和数据长度;
这条写命令的其他属性,如是否是FUA命令,和前一条命令LBA是否连续。

当命令解析完,放入命令队列等待FTL排队处理。由于已经有了起始LBA和数据长度两大主要信息,FTL可以准确映射LBA空间到物理空间。至此前端硬件和固件模块完成任务。

1.2 主控CPU

SSD控制器SoC模块和其他嵌入式系统SoC模块无本质区别,一般由一颗或多颗CPU核组成,同时片上有I-RAM, D-RAM, PLL, IO, UART, 高低速总线等外围电路模块,CPU负责运算、系统调度,IO完成必要的输入输出,总线连接前后端模块。
通常我们所说的固件就运行在CPU核上,分别有代码存储区I-RAM和数据存储区D-RAM。如果是多核CPU,需要注意软件可以是对称多处理(SMP)和非对称多处理(AMP)。对称多处理多核共享OS和同一份执行代码,非对称多处理是多核分别执行不同代码。前者多核共享一份I-RAM和D-RAM,资源共享;后者每个核对应一份I-RAM和D-RAM,独立运行,没有内存抢占导致代码执行速度变慢的问题。
固件根据CPU的核数进行设计,充分发挥多核CPU的计算能力是固件设计考虑的方面。另外,固件会考虑任务划分,在达到并行处理的同时让所有CPU有合理且均衡的负载,不至于有的CPU忙死有的闲死,这是固件架构设计需要考虑的内容,目标是让SSD输出最大的读写性能。
SSD的CPU外围模块包括UART, GPIO, JTAG, 这些都是程序必不可少的调试端口,另外还有定时器模块Timer及其他内部模块,比如DMA、温度传感器、Power regulator模块等。

1.3 后端

后端两大模块分别为ECC模块核闪存控制器
固态硬盘SSD学习笔记:SSD主控_第4张图片
ECC模块是数据编码单元,由于闪存存储天生存在误码率,为了数据的正确性,在数据写入操作时应给原数据加入ECC校验保护,这是一个编码过程。读取数据时,同样通过解码来检错和纠错,如果错误的比特数超过ECC纠错能力,数据以“不可纠错”的形式上传给主机。这里的ECC编码和解码的过程就是由ECC模块单元来完成的。SSD内的ECC算法主要有BCH和LDPC,其中LDPC正逐渐成为主流。
闪存控制器使用符合闪存ONFI、Toggle标准的闪存命令,负责管理数据从缓存到闪存的读取和写入。
闪存控制器如何和闪存连接和通信?从单个闪存角度看,一个Die/LUN是一个闪存命令执行的基本单元,闪存控制器和闪存连接引脚按照如下操作
固态硬盘SSD学习笔记:SSD主控_第5张图片
外部接口:8个IO接口,5个使能(ALE, CLE, WE#, RE#, CE#),1个状态引脚(R/B#),1个写保护(WP#);
命令、地址、数据都通过8个IO接口输入输出;
写入命令、地址、数据时,都需要将WE#、CE#信号同时拉低,数据在WE#上升沿被锁存;
CLE,ALE用来区分IO引脚上传输的是数据还是地址。

从闪存控制器角度看,为了性能需求需要并发多个闪存Die/LUN,通常配置有多个通道(CH)。一个通道挂多少个闪存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个,对于容量而言选择有一定灵活度。

下一篇: 闪存

你可能感兴趣的:(深入浅出SSD学习笔记,学习)