



一般来讲,我们见到的SSD基本都是由主控芯片、存储介质(比较常见的非易失性存储介质是NAND)、缓存(如DRAM)和外壳等几个主要部件组成。
● 主控芯片是SSD的控制中心,且可提供一些强大的硬件计算、数据保护和数据加密等处理能力。
● 存储介质主要用来存放数据,主机(Host)写入SSD的数据最终都会保存到存储介质中。主机从SSD读取数据,一般也是从存储介质中读取的。
● 缓存具有更高的读写速度和更低的延迟,主要用来存放一些SSD固件内部的表项,也可以用来缓存一部分读写的数据。当然,也有部分SSD是无缓存(DRAM-less)类型的,即自身不带有缓存。
● 外壳主要起保护和散热作用。SSD厂商一般都会在SSD外壳和上述其他器件中添加散热硅片等,以进一步加强散热。有些消费级SSD也可能不配备外壳,直接以“裸盘”形式提供,比如一些常见的M.2规格的盘。企业级SSD和部分消费级SSD还会配备电容(Capacitor),以便更好地在掉电时保护数据。
图1-1为SSD主要部件的示意图。
图1-1 SSD主要部件示意图
除了主控芯片,有的特型SSD还可能搭载辅助芯片或者电子元器件以完成一些特定功能或者对某些功能进行加速和增强,例如可计算存储SSD、军工行业的SSD等。
前端接口常见的有SATA、PCIe金手指等。更加详细的介绍可以参考1.1.2节。
通常来讲,SSD研发团队所接触到的SSD基本都是已经装配完成的,并不会以单独的电子器件形式出现。这些电子器件在完成装配前,都会通过特定的调试和测试,但是这并不能保证这些器件一定不会存在问题。我们在研发测试过程中也需要留意某些问题可能是与硬件相关的,比如与主控芯片、存储介质甚至是PCB电路相关都是有可能的。
写入SSD的数据,最终会被存储在NAND(门非门存储器又称NAND闪存或闪存,本书中NAND和闪存不作区分)介质上。对于有DRAM(动态随机存取内存)的SSD,数据还可能被临时缓存在DRAM中,依据SSD内部实际调度情况,在合适的时机才会下刷至NAND上。我们可以简单地把数据理解成货物,把NAND理解成存储货物的仓库,而DRAM则可以理解为货物的中转站。我们在设计相关测试用例时,需要意识到写入SSD的数据并不一定意味着数据已经成功被“写透”到后端存储介质上,即数据可能仍然被暂存在“中转站”。
NAND是一种非易失性存储介质,NAND上的数据即使是在断电情况下也能够正常保存。块(Block)
和页(Page)是两个常见的与NAND操作相关的寻址概念。一般来讲,一个块包含若干个页,每个页会存放若干个字节(Byte)。图1-2为NAND Die内部的简单示意图,解释了块与页的关系。
图1-2 NAND Die内部的简单示意图
SSD固件对NAND进行编程(Program,也可以称为写)操作和读(Read)操作时,一般是以单个页或者多个页为一组进行的;对NAND进行擦除(Erase)操作时,一般是以单个块或者多个块为一组进行的。一般地,我们可以认为块是NAND擦除操作的最小单元,页是NAND读写操作的最小单元。
对于NAND的读、写、擦操作,不同厂商甚至同一厂商的不同NAND类型都可能会有一些特殊的要求和限定。这对于SSD测试人员来说是至关重要的,因为会直接影响相应测试用例的设计,我们需要特别留意这些特定的要求。
NAND是有一定使用寿命限制的,在使用过程中随着磨损的加深,数据有可能会出现问题。我们保存在NAND上的数据也并不是一直保持不变的,某些情况下,部分单元(Cell)的电压会发生偏移,导致读取的数据发生错误。一般地,当NAND块在使用过程中出现介质错误时,SSD固件会将其判定为坏块(Bad Block),并永久性地屏蔽掉而不再使用。图1-3展示了一个简单的带有坏块的SSD NAND块的分布,我们使用阴影框代表坏块。一般地,SSD固件会将多个块放在一起进行统一管理,我们称其为逻辑概念上的超级块(Super Block)。随着SSD的使用,某些超级块会因为坏块而出现一些“空洞”。当设计一些对数据分布敏感的测试用例时,我们需要特别留意这些“空洞”,避免测试逻辑被破坏。对于此类测试用例,我们建议直接从固件获取相应的坏块物理位置,而不是在脚本侧按照逻辑去估算位置。
图1-3 带有坏块的超级块分布
有的SSD固件设计中会对坏块的物理位置进行逻辑意义上的替换,即使用另外一个位置的好块替换当前超级块中的坏块,这样就可以降低超级块的管理复杂度。测试人员在设计相应测试用例时,需要留意类似的固件设计。图1-4是一个带有上述替换功能的固件设计示意图,图中当前超级块中的灰色坏块被替补区域的一个正常块所替换。
图1-4 带有替补块管理的超级块分布
某些NAND在特定的块或者页的位置上,会更加高概率地出现介质错误。测试团队需要尽量获取相关信息,并针对性地设计一些测试用例以增强覆盖。
总而言之,作为测试人员,我们需要了解NAND使用的特性及SSD固件块管理的详细设计。这些是我们设计相应测试用例的核心基础,也是测试用例达到预期测试目的的重要前提。从经验角度来讲,我们强烈建议在实现这一类型的测试脚本时,将关键配置进行参数化,这会大大降低后续脚本维护的成本。
主机侧一般是利用逻辑块地址(Logic Block Address,LBA)与SSD进行交互的。通常我们认为,逻辑块(Logic Block)是主机对SSD进行访问的基本单位,512字节和4 096字节是比较常见的逻辑块大小。根据实际业务需求,我们也会使用其他大小的逻辑块。在企业级SSD中我们可能还会看到诸如4 096字节+ 8字节或者4 096字节+ 16字节的逻辑块大小。
从普通SSD使用的角度来看,我们常见的操作可能是创建一个文件并写入一些文字,安装一个游戏,下载一个电影等。用户所看到的并不是某个逻辑块地址或者一组逻辑块地址。这主要是因为在操作系统中,一般都是基于某个文件系统操作SSD的。而这些文件系统中的相关操作,都会借助底层的驱动对应到一个个的逻辑块地址,再跟SSD去交互。对于一个SSD测试人员,我们需要理解隐藏在背后的这些操作。SSD研发测试过程中,我们一般也会设计一些基于原始逻辑块地址来寻址的测试用例,而不是一味地使用基于文件系统的测试。
了解完主机的寻址方式后,我们还需要简单了解主机与SSD的交互和协同方式。一般来讲,主机侧会把针对连续的一段逻辑块地址的相同操作(比如读操作或者写操作)封装成一个或者多个命令,并将这些命令通过驱动发送给SSD。SSD在收到这些命令并完成指定操作后,会将相应结果反馈给主机。主机收到反馈后,会依据SSD的反馈做出相应的动作。例如,当SSD返回一个错误状态时,主机可能按照设计将错误记录下来并进行上报,甚至可能做一些必要的纠错尝试。所以,当设计一些协议或者命令相关的测试用例时,我们还需要关注一些命令的异常场景覆盖。
此外,需要特别指出的是,当某个逻辑块地址被主机写过之后,主机是可以直接对该逻辑块地址进行“再次”写操作的(SSD固件在背后做了一系列的动作以支持该操作)。在之前的一些面试经历中,我们发现有一部分比较初级的求职者甚至会认为当SSD上所有逻辑块地址都被写过之后,这块SSD就不能再使用(写入数据)了。这其实是一个比较明显的误解。