FTL——掉电恢复

本文章内容来源《深入浅出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之后产生的映射关系,这部分关系的恢复,仅需扫描一些局部的物理空间,因此,相对全盘扫描,映射表重建速度大大加快。

我觉得就是提前备份的意思!!!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值