本文章内容来源《深入浅出SSD 固态存储核心技术 原理与实战.pdf》
掉电分两种,一种是正常掉电,另一种是异常掉电。不管是哪种原因导致的掉电,重新上电后,SSD都需要能从掉电中恢复过来,继续正常工作。
先说正常掉电。在掉电前,主机会通过命令通知SSD,比如SATA中的Idle Immediately, SSD收到该命令后,主要会做以下事情:
1.把buffer中缓存的用户数据刷人闪存。
2.把映射表刷人闪存。
3.把闪存的块信息写人闪存(比如当前写的是哪个闪存块,以及写到闪存块的哪些位置,哪些闪存块已经写过,哪些闪存块又是无效的等)。
4.把SSD其他信息写人闪存。
主机等SSD处理完以上事情后,才会真正停止对SSD的供电。正常掉电不会导致数据的丢失,重新上电后,SSD只需把掉电前保存的相关信息(比如映射数据,闪存块信息等)重新加载,又能接着掉电前的状态继续工作。
所谓的异常掉电,就是SSD在没有收到主机的掉电通知时就被断电;或者收到主机的掉电通知,但还没有来得及处理上面提到的那些事情,就被断电了。异常掉电可能会导致数据的丢失,比如缓存在SSD中的数据来不及写到闪存,掉电导致这部分数据丢失。还有,根据闪存特性,如果掉电发生在写MLC的Upper page,会导致其对应的Lower Page数据遭到破坏,也就是意味着之前写人闪存的数据也可能由于异常掉电导致丢失。异常掉电恢复的目的一方面是尽可能恢复用户数据,把损失减到最低;另一方面是让SSD经历异常掉电后还能正常工作。
SSD为什么怕异常掉电?
它不是用闪存做存储介质吗?它不是数据掉电不丢失吗?没错。不过一个SSD,除了数据掉电不丢失的闪存,还需要有掉电数据丢失的RAM, SRAM或者DRAM。闪存的作用是存储数据,而RAM的作用主要是SSD工作时用以缓存用户数据和存放映射表(Map Table,逻辑地址映射闪存物理地址)。所以一旦掉电,RAM的数据就会丢失。
掉电还会导致RAM中映射表丢失。映射表数据很重要,对一个逻辑地址,如果SSD查找不到对应的物理地址,它就无法从闪存上读取数据返回给主机。如果映射表中的数据不是最新的,旧的物理地址对应着老的数据,SSD就会错误地把老数据返回给主机,这个问题就严重了。
但是,和RAM中用户数据丢失不同,RAM中映射表数据是有办法恢复过来的。SSD的异常掉电恢复主要就是映射表的恢复重建。
那么,如何重建映射表呢?下面介绍一种重构策略(不同的SSD重构策略略有不同,但大同小异)。SSD在把用户数据写到闪存的时候,会额外打包一些数据,我们叫它元数据( Meta Data),它记录着该笔用户数据的相关信息,比如该笔数据对应的逻辑地址、数据写人时间(时间戳)等,如图4-43所示。
因此,用户数据在闪存中是像下面这样存储的(见图4-44)
以图4-44为例,如果我们读取物理地址Pa x,就能读取到元数据x和用户数据x,而元数据是有逻辑地址La x的,因此,我们就能获得映射:La x→Pax。映射表的恢复原理其实很简单,只要全盘扫描整个闪存空间,就能获得所有的映射关系,最终完成整个映射表的重构。
原理简单,但实现起来还有一些问题需要考虑,比如如何解决数据新旧问题、重构速度问题等。
同一逻辑地址,用户可能写过若干次,在闪存空间,该逻辑地址对应的数据有很多是旧数据,只有一笔是新数据,那么如何甄别哪些数据是旧的,哪些数据是新的呢?如何让逻辑地址映射到最新数据所在的物理地址呢?以图4-44为例,SSD起初把逻辑地址La 2的数据写在物理地址Pa 2上;之后,用户又改写了那笔数据,SSD把它写到了物理地址Pa 8上。我们知道,用户最后写人的数据总是最新的。在这里,时间戳帮上大忙了,哪个值大,就表示哪个是最后写人的。SSD可以依赖Meta data中的时间戳来区分新旧数据的。图4-44中,在全盘扫描时,假设扫描顺序是从物理地址Pa I到物理地址Pa x,对逻辑地址La 2来说,开始会产生映射La 2一Pa 2,但扫描到Pa 8时,发现时间戳比之前的更新,于是新的映射取代旧的映射,最后得到映射关系:La 2—>Pa 8;
全盘扫描有一个问题,就是映射表恢复很慢,所耗的时间与SSD容量成正比。现在SSD容量已达到TB级别,全盘扫描映射方式,重构映射表需要花费几分钟甚至几十分钟,这在实际使用中,用户是不能接受的。那SSD内部是如何快速恢复映射表的呢?
一种办法就是SSD定期把SSD中RAM的数据(包括映射表和缓存的用户数据)和SSD相关的状态信息(诸如闪存块擦写次数、闪存块读次数、闪存块其他信息等)写人到闪存中去,与正常掉电前SSD要做的事情类似,这个操作我们称之为做Checkpoint(检查点,此处译成“快照”更合适),如图4-45所示。
假设图4-45中,在做完快照C后,做下一个快照D之前,SSD在X处发生了异常掉电,如图4-46所示。
重上电,SSD可以从闪存中读取到最新的快照信息,即快照C。由于异常掉电,从快照C处到X处新产生的映射关系丢失。由于之前绝大多数的映射关系都被快照C保存,因此需要重建的映射关系仅仅是快照C之后产生的映射关系,这部分关系的恢复,仅需扫描一些局部的物理空间,因此,相对全盘扫描,映射表重建速度大大加快。
我觉得就是提前备份的意思!!!