闪存NAND Flash学习笔记(一):SSD基础知识总结

最近在入门NAND Flash,主要参考的三本入门是《Inside NAND Flash Memories》、《深入浅出SSD》、《固态存储技术及应用》,下面是关于闪存知识的一些总结。

1 SSD系统架构

SSD主要由两大模块构成——主控和闪存介质。其实除了上述两大模块外,可选的还有缓存单元。主控是SSD的大脑,承担着指挥、运算和协调的作用,具体表现在:一是实现标准主机接口与主机通信;二是实现与闪存的通信;三是运行SSD内部FTL算法。可以说,一款主控芯片的好坏直接决定了SSD的性能、寿命和可靠性。接下来将侧重介绍下SSD的主控。

SSD作为数据存储设备,其实是一种典型的(System on Chip)单机系统,有主控CPU、RAM、操作加速器、总线、数据编码译码等模块,如下图所示,操作对象为协议、数据命令、介质,操作目的是写入和读取用户数据。
在这里插入图片描述
上图所示仅是一个SSD系统架构的概略图,这款主控采用ARM CPU,主要分为前端和后端两大部分。

  • 前端(Host Interface Controller,主机接口控制器)跟主机打交道,接口可以是SATA、PCIe、SAS等
  • 后端(Flash Controller,闪存控制器)跟闪存打交道并完成数据编解码和ECC。
  • 除此之外还有缓冲(Buffer)、DRAM。模块之间通过AXI高速和APB低速总线互联互通,完成信息和数据的通信。

在此基础之上,由SSD固件开发者构筑固件(Firmware)统一完成SSD产品所需要的功能,调度各个硬件模块,完成数据从主机端到闪存端的写入和读取。

1.1 前端

SSD系统架构前端所涉及的组件主要负责与主机进行通信,包括协议、总线、接口三个部分,下面这张图是协议、总线、接口三者匹配的关系图。
在这里插入图片描述
一、协议
AHCI和NVME协议民用很多,而SCSI协议大多用在服务器上。

二、总线
  总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。
三、接口

  1. SATA接口,总线使用的是SATA总线,协议使用的是AHCI协议。常用在硬盘上。
  2. MSATA接口,如果打开2.5寸的固态硬盘会发现,大大的盒子里面只有一小块电路板,这个接口的出现只是为了缩小SATA硬盘的体积。速度性能和SATA一样。在笔记本中用的多。后来M.2出现后就被淘汰了。
  3. M.2接口,既可以走SATA总线AHCI协议,也可以走PCIe总线AHCI协议,还可以走PCIe总线NVME协议。这三种组合的速度由总线和协议共同决定,如下:
    • SATA总线、AHCI协议,速度和SATA接口一样。
    • PCIe总线、AHCI协议,这个比较少见。
    • PCIe总线、NVME协议,这个是最常见的。如果是PCIe3.0x4,那速度上限为4GB/S。如果是PCIe4.0x4,那速度上限为8GB/S。

M.2接口分为B-Key和M-Key。B-Key又称为socket2,支持SATA总线和PCIex2总线。M-Key又称为socket3,支持SATA总线和PCIex4总线。

  1. PCIe接口,可以走PCle总线NVME协议或者SCSI协议,PCIex1的卡可以插到x2、x4、x8、x16的插槽内,PCIex2的卡可以插到x4、x8、x16的插槽内

1.2 主控CPU

SSD控制器一般由一颗或多颗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,每核独立运行,没有内存抢占导致代码速度执行变慢的问题。当SSD的CPU要求计算能力更高时,除增加核数和单核CPU频率外,AMP的设计方式更加适应计算和任务独立的要求,消除了代码和数据资源抢占导致执行速度过慢的问题。

固件根据CPU的核数进行设计,充分发挥多核CPU的计算能力是固件设计考虑的一方面。另外,固件会考虑任务划分,会将任务分别加载到不同CPU上执行,在达到并行处理的同时让所有CPU有着合理且均衡的负载,不至于有的CPU忙死有的CPU闲死,这是固件架构设计要考虑的重要内容,目标是让SSD输出最大的读写性能。

SSD的CPU外围模块包括UART、GPIO、JTAG,这些都是程序必不可少的调试端口,另外还有定时器模块Timer及其他内部模块,比如DMA、温度传感器、Power regulator模块等。

1.3 后端

后端两大模块分别为ECC模块和闪存控制器。如下图所示:
在这里插入图片描述

  • ECC模块是数据编解码单元,由于闪存存储天生存在误码率,为了数据的正确性,在数据写入操作时应给原数据加入ECC校验保护,这是一个编码过程。读取数据时,同样需要通过解码来检错和纠错,如果错误的比特数超过ECC纠错能力,数据会以“不可纠错”的形式上传给主机。这里的ECC编码和解码的过程就是由ECC模块单元来完成的。SSD内的ECC算法主要有BCH和LDPC,其中LDPC正逐渐成为主流。
  • 闪存控制器使用符合闪存ONFI、Toggle标准的闪存命令,负责管理数据从缓存到闪存的读取和写入。

闪存控制器如何和闪存连接和通信?从单个闪存角度看,一个Die/LUN是一个闪存命令执行的基本单元,闪存控制器和闪存连接引脚按照如下:
在这里插入图片描述
包括外部接口:8个IO接口,5个使能信号(ALE、CLE、WE#、RE#、CE#),1个状态引脚(R/B#),1个写保护引脚(WP#);

  • 命令、地址、数据都通过8个IO接口(DQ[7:0])输入输出;

  • 写入命令、地址、数据时,都需要将WE#、CE#信号同时拉低,数据在WE#上升沿被锁存;

  • CLE、ALE用来区分IO引脚上传输的是数据还是地址。

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个,对于容量而言选择有一定的灵活度。

从闪存控制器角度看,为了性能需求需要并发多个闪存Die/LUN,通常配置有多个通道(channel)。一个通道挂多少个闪存Die/LUN,取决于SSD容量和性能需求,Die/LUN个数越多,并发的个数越多,性能越好。

2 闪存芯片

过去的固态硬盘采用RAM作为介质,RAM固态硬盘比较少见,主要应用于特殊的场合。1978年诞生的世界上第一块固态硬盘就是基于DRAM的。但由于保存在DRAM中的数据有掉电易失性,当然还有成本因素,所以现在的固态硬盘一般都不采用DRAM,而是使用闪存作为存储介质。

2.1 四种闪存芯片:SLC、MLC、TLC和QLC

目前主流的芯片有 Single Level Cell(简称 SLC)、Multiple Level Cell(简称MLC)、Trinary Level Cell(简称 TLC)与 Quad Level Cell(简称 QLC),其单个存储单元可以分别存储 1 至 4 个比特数据。

对SLC来说,一个存储单元存储两种状态,浮栅极里面的电子多于某个参考值的时候,我们把它采样为0,否则就判为1。如下图所示。
在这里插入图片描述
擦除之后,闪存读出来的值为1,充过电之后,就是0。所以,如果需要写1,就什么都不用干;写0,就需要充电到0。

对MLC来说,如果一个存储单元存储4个状态,那么它只能存储2bit的数据,如下图所示。通俗来说就是把浮栅极里面的电子个数进行一个划分,比如低于10个电子判为0;11~20个电子判为1;21~30个电子判为2;多于30个电子判为3。
在这里插入图片描述
对TLC来说,一个存储单元有8个状态,那么它可以存储3bit的数据,它在MLC的基础上对浮栅极里面的电子数又进一步进行了划分,如下图所示。
在这里插入图片描述
以此类推,同样可以划分QLC,这里就不做展示啦!

同样面积的一个存储单元,SLC、MLC和TLC分别可以存储1bit、2bit、3bit的数据,所以在同样面积的DIE上,闪存容量依次变大。

但同时,一个存储单元电子划分得越多,那么在写入的时候,控制进入浮栅极的电子个数就要越精细,所以写耗费的时间就越长;同样的,读的时候,需要尝试用不同的参考电压去读取,一定程度上加长了读取时间。所以我们会看到在性能上,TLC不如MLC,MLC不如SLC。(表中的数据仅供参考哦)
在这里插入图片描述

2.2 闪存记录原理

闪存是一种非易失性存储器,也就是说,掉电了数据也不会丢失。闪存基本存储单元(Cell)是一种类NMOS的双层浮栅(Floating Gate)MOS管,如下图所示。
在这里插入图片描述
在源极(Source)和漏极(Drain)之间电流单向传导的半导体上形成存储电子的浮栅,浮栅上下被绝缘层包围,存储在里面的电子不会因为掉电而消失,所以闪存是非易失性存储器。

单个存储单元(Cell)即一个浮栅场效应管由 Control Gate(CG)控栅、 Floating Gate(FG)浮栅、半导体二氧化硅绝缘层以及输入端和输出端导线(字线,位线),感应器等逻辑元件组成。浮栅是一个逻辑电路,这个电路处于二氧化硅绝缘层之中,在二氧化硅绝缘层外部为另一个门电路即控制栅。写操作(在闪存中专业术语叫“编程”)是在控制极加正电压,使电子通过绝缘层进入浮栅极。擦除操作正好相反,是在衬底加正电压,把电子从浮栅极中吸出来,如下图所示。

在这里插入图片描述总结下cell单元各逻辑元件的功能:

  1. 字线(World Line):既然是电子芯片,就需要电,字线就是导线,连接在控栅的源极,是电压的来源,是能源提供者,抬高位线的电势就可以给每一个浮栅场效应管提供电压,操作字线便可以激活此存储单元即浮栅场效应管。
  2. 浮栅 Floating Gate(FG):浮栅是一个逻辑电路,负责保存电子,它处于二氧化硅绝缘层之中,在二氧化硅绝缘层外部为另一个门电路即控制栅,也就是说浮栅和控栅之间隔着一个二氧化硅绝缘层。电子可以穿透二氧化硅绝缘层到达浮栅。
  3. 控制栅级 Control Gate(CG):作用就是接收字线上的电,使其与浮栅之间产生一个电场,引起电子移动,控栅之上具有源极和汲极
  4. 感应器(Sensor):实际上是一个感应电路,与浮栅场效应管连接,作用是探测穿过二氧化硅绝缘层到达浮栅的电荷量(电子)。、
  5. 位线(Bit Line):位线也是导线,与感应电路连接,间接与浮栅场效应管连接,NAND 闪存控制电路通过位线获取浮栅的电量,从而根据事先设计好的技术规格,确定浮栅此时是处于充电状态(数据0),还是放电状态(数据1)。简而言之,位线就是导出数据的地方

前面讲了编程是在控制极加正电压,使电子通过绝缘层进入浮栅极。擦除操作正好相反,是在衬底加正电压,把电子从浮栅极中吸出来。那么浮栅场效应管被充电之后,如何表示二进制数据0或1呢?SLC型浮栅场效应管只能存储1 bit数据,在设计cell时,规定2个阀值。电子是存储在浮栅(FG)的,浮栅的电势是由电子多少决定的,浮栅的状态即是 Cell 状态,因此要保证每次对Cell进行充电时,将电量充到此阀值即可,达到这个阀值的Cell表示进制据果需表示数据“1”的时候,只需要通过操作位线,对控栅施加一个反向电场,将浮栅中的电子吸出,让其电势降低到阀值即可。在对Cell中的浮栅进行充电时候,表示二进制数据0,对其进行电后,表示二进制数据1。

那么又是如何知道Cell是充电状态还是放电状态呢?这个工作就由位线(Bit Line)和感应电路完成了。浮栅,就是在二氧化硅绝缘层之中的,形象的称为“浮在其中”,只有一条感应线与浮栅连接,感应线又和外部感应电路形成与浮栅不接触的感应器,感应器又和位线连接,通过感应器探知浮栅的电势,经过事先设置好的阀值范围,将电信号传递给位线,解码成数据0和1。

以上讲解的是SLC型NAND Flash单个Cell通过充放电,感应阀值,表示数据0和1。SLC只能存储1比特数据,那么只需要位浮栅设置2个阀值即可。 MLC 模式的NAND Flash 可以存储2比特数据,分别是 00.01.11.10,那么则需要设置4个电势阀值。通过控制充电量的多少,表示这四种状态。同理,TLC 模式的NANDFlash则需要8个电势阀值。

(这一段最好对着下面的图来看,不然有点难理解)
NAND Flash 是如何操纵多个 Cell,实现一次能读写多比特数据呢?NAND Flash量Cell组成,通过将多个Cell进行有序排列组成一个阵列,形成Cell 串即 Cell 串联,位线(Bit Line)就是将 Cell 串联起来的导线位线每次可以从一个Cell 串读出一位数据即一个Cell。注意:位线并不是一条导线,而是一个导线组,有许多位线,每一个位线均连接一个Cell 串上。NAND Flash的基本IO单位是页(page),页由Cell构成,比如一个page为1KB(1024B)+32B(ECC校验数据)=1056B=8448 bit。对于SLC芯片 来说,一个Cell表示一位数据,那么一个 page 则需要由 8448 个Cell 串参与,注意:此处是需要 8448 个Cell 串而不是单独的8448 个Cell,8448位的Page,每一个位均位于8448个Cell串的相同位置,字线组(World line)横穿这 8448 个处于相同位置的 Cell,字线组中每根字线均连接到每一个 Cell 上,从而通过操纵字线上的电势,对每一个 Cell进行读写(字线是连接处于不同Cell串处于相位置Cell)。这样通过位线将Cell 串联起来,再通过字线将不同Cell 串中相同位置的Cell贯穿并联起来,形成一个 page,可以操纵多比特数据。

在这里插入图片描述
从一个闪存块(Block)的组织架构来看,一个Wordline对应着一个或若干个Page,具体是多少取决于是SLC、MLC或者TLC。对SLC来说,一个Wordline对应一个Page;MLC则对应2个Page,这两个Page是一对(Lower Page和Upper Page);TLC对应3个Page(Lower Page、Upper Page和Extra Page,不同闪存厂家叫法不一样)。一个Page有多大,那么Wordline上面就有多少个存储单元,就有多少个Bit Line。一个Block当中的所有这些存储单元都是共用一个衬底的。

2.2.1 读操作

NANDFlash将许多个基本存储单元即浮栅场效应管(Cell)排列在一起形成阵列,当需要读出一个page时,Flash控制器电路将需要读的这个page的字线组电势设置为0同时其他page是我字线组电势升高,但是这个电势不足以导通控栅,电子无法通过二氧化硅绝缘层达到浮栅。此时与位线连接的感应电路发挥作用,所有电势被提高的 page应电路均被断开,位线无法获得电势被提高的 page 中的 Cell 电势,唯一能被位线感应到电势的page即是电势被字线设置为0的page,这个page 的感应电路导通,整个page 中的 Cell 电势均被位线获取,从而形成了位线上只有这个page的电势,再经过电路转换将每根位线上的电势值解码成0或1传输到芯片外接。至此,完成了一个Page内容的读出。NAND Flash的IO最小单位是1个Page。

2.2.2 擦除操作

擦除操作一般用于垃圾回收机制,所谓的擦除就是将该Cell 进行放电,将浮栅中的电子释放出来。上文讲到Cell 充满电的时候表示二进制数据0,放电之后表示1,那么对 Cell 进行 Erase 即擦除动作时,便是将该 Cell 置位数据1的状态。这里将的 Erase 实际上是一次性擦除大量连在一起的Cell,因为一次擦除一个Cell,操作密度太高,所以NAND Flash 将大片的 Cell 进行放电,这一大片 Cell称之为一个块(Block),每次擦除均是擦除一个 Block。擦除之后,整个 Block 中的 Cell 均表示数据 1

2.2.3 写操作

向Cell 写数据的过程我们称之为“Programe”,传统机械硬盘,可以就地向某个块和扇区直接覆盖写入数据,这种覆盖方式称为“就地更新”,而 Flash 芯片在写数据的时候,一般是异地更新,所以实际上写操作会有两种情况,一个是直接将数据写入一个新的page中,另一种方法是垃圾回收机制中将块中的旧数据擦除后重新写入。

如果要写入数据 0,那么则需要重复上文提到的抬高字线电势等等一系列操作,使浮栅充电。如果要写入数据1,那么无需变化,擦除之后的整个 Block 中的所有 Cell 状态已经是1了。在需要写入数据0的时候,则需要将待写入的 Cell 字线电压升高到规定值,导通控栅,对Cell中的浮栅进行充电,充电完毕后,与这个 Cell相连的感应电路会将电势值传递给位线,如果位线并没有接收到这个电势值,那么这个 Cell 已经损坏。如果位线接收到正确的电势值,则表示写入成功,位线将信号传至外接电路,表明写入成功。这是对 NAND Flash 芯片的写入数据过程。

2.3 闪存数据组织方式

单个NAND Flash 芯片由一个Package组成,Package由Die(颗粒)组成, Die (或者叫LUN)由多个Plane(区域)组成,Plane由多个Block(块)组成,Block由多个Page(页)和数据寄存器组成,Page由多个Cell(浮栅场效应管)和单独的元数据校验区域组成,其中Page是IO的最小单位,待存储的数据均需要经过ECC校验才能存入闪存,读出的数据也需要经过校验才能通过外部接口发送出去。NAND内部组织架构如下图所示。
在这里插入图片描述
DIE/LUN是接收和执行闪存命令的基本单元。LUN0和LUN1可以同时接收和执行不同的命令(但还是有一定限制的,不同厂家的闪存限制不同)。但在一个LUN当中,一次只能独立执行一个命令,也就是说不能对其中某个Page写的同时,又对其他Page进行读访问。

一个LUN又分为若干个Plane,市面上常见的是1个或者2个Plane,现在也有4个Plane的闪存了。每个Plane都有自己独立的Cache Register和Page Register,其大小等于一个Page的大小。固态硬盘主控在写某个Page的时候,先把数据从主控传输到该Page所对应Plane的Cache Register当中,然后再把整个Cache Register当中的数据写到闪存阵列;读的时候则相反,先把这个Page的数据从闪存介质读取到Cache Register,然后再按需传给主控。这里按需是什么意思?就是我们读取数据的时候,没有必要把整个Page的数据都传给主控,而是按需选择数据传输。但要记住,无论是从闪存介质读数据到Cache Register,还是把Cache Register的数据写入闪存介质,都以Page为单位,如下所示。
在这里插入图片描述
为什么需要Cache Register和Page Register两个缓存?主要目的是优化闪存的访问速度。闪存支持Cache读、写操作,如图3-8所示。Cache读支持在传输前一个Page数据给主控的时候(Cache Register→主控),可以从闪存介质读取下一个主控需要读的Page的数据到Page Register(闪存介质→Page Register),这样数据在闪存总线传输的时间就可以隐藏在读闪存介质的时间里(或者相反,取决于哪个时间更长);Cache Program也是如此,它支持闪存写前一个Page数据的同时(Page Register→闪存介质),传输下一个要写的数据到Cache Register(主控→Cache Register),这样数据在闪存总线传输可以隐藏在前一个Page的写时间里。

当然,有两个Register的闪存也支持正常的读写模式,这时候,用户可以把Cache Register和Page Register看成是一个缓存。

我们通常所说的闪存读写时间,并不包含数据从闪存到主控之间的数据传输时间,也不包括数据在Cache Register和Page Register之间的传输时间。闪存写入时间是指一个Page的数据从Page Register当中写入闪存介质的时间,闪存读取时间是指一个Page的数据从闪存介质读取到Page Register的时间

闪存一般都支持Multi-Plane(或者Dual-Plane)操作。那么什么是Multi-Plane操作呢?对写来说,主控先把数据写入第一个Plane的Cache Register当中,数据保持在那里,并不立即写入闪存介质,等主控把同一个LUN上的另外一个或者几个Plane上的数据传输到相应的Cache Register当中,再统一写入闪存介质。假设写入一个Page的时间为1.5ms,传输一个Page的时间为50μs:如果按原始的Single Plane操作,写两个Page需要至少(1.5ms+50μs)×2;但如果按照Dual-Plane操作,由于隐藏了一个Page的写入时间,写入两个Page只要1.5ms+50×2μs,缩减了几乎一半的时间,写入速度几乎翻番。对读来说,使用Dual-Plane操作,两个不同Plane上的Page数据会在一个闪存读取时间加载到各自的Cache Register当中,这样用一个读取时间读取到两个Page的数据,读取速度加快。假设读取时间和数据传输时间相当,都是50μs,Single Plane读取传输两个Page需要50μs×4=200μs,Dual-Plane则需要50μs×2+50μs=150μs,时间为前者的75%,读取速度也有很大的提升。

闪存的擦除是以Block为单位的。为什么呢?那是因为在组织结构上,一个Block当中的所有存储单元是共用一个衬底的(Substrate)。当你对某衬底施加强电压,那么上面所有浮栅极的电子都会被吸出来。

猜你喜欢

转载自blog.csdn.net/chennqjswi/article/details/127320799
今日推荐