【FLASH存储器系列十九】固态硬盘掉电后如何恢复掉电前状态?
掉电分两种,一种是正常掉电,另一种是异常掉电。不管是哪种原因导致的掉电,我们都希望,重新上电后,SSD都需要能从掉电中恢复过来,继续正常工作。
正常掉电恢复,这个好理解,主机通知SSD要下电了,让其做好准备再下电,这种肯定就能恢复了,SSD收到该命令后,主要会做以下事情:
1、把buffer中缓存的用户数据刷入闪存。
2、把映射表刷入闪存。
3、把闪存的块信息写入闪存(比如当前写的是哪个闪存块,以及写到该闪存块的哪个位置,哪些闪存块已经写过,哪些闪存块又是无效的等)。
4、把SSD其他信息写入闪存。
主机等SSD处理完以上事情后,才会真正停止对SSD的供电。正常掉电不会导致数据的丢失,重新上电后,SSD只需把掉电前保存的相关信息(比如映射数据,闪存块信息等)重新加载,又能接着掉电前的状态继续工作。
异常掉电就麻烦点,就是SSD在没有收到主机的掉电通知时就被断电,或者收到主机的掉电通知,但还没有来得及处理上面提到的那些事情,就被断电了。异常掉电可能会导致数据的丢失,比如缓存在SSD中的数据来不及写到闪存,掉电导致这部分数据丢失。还有,根据闪存特性,如果掉电发生在写MLC的Upper page,会导致其对应的Lower Page数据遭到破坏,也就是意味着之前写入闪存的数据也可能由于异常掉电导致丢失。异常掉电恢复的目的一方面是尽可能恢复用户数据,把损失减到最低;另一方面是让SSD经历异常掉电后还能正常工作。
为防止异常掉电导致的数据丢失,一个简单的设计就是在SSD上加电容,SSD一旦检测到掉电,就让电容开始放电,然后把RAM中的数据刷到闪存上面去,从而避免数据丢失。企业级的SSD一般都带有电容。带电容的SSD,还是需要设计异常掉电处理模块,因为电容不能100%保证SSD在掉电前把所有的信息刷入闪存。还有一个比较前卫的想法,就是把RAM这种Volatile(掉电数据丢失)的东西,用Non-Volatile(掉电数据不丢失)的东西来替代,但要求这种Non-Volatile的东西性能上接近RAM。这样,整个SSD都是Non-Volatile的了。Intel和Micron合作开发的3D XPoint,可作为一个选择。3D XPoint兼有闪存掉电数据不丢失和内存快速访问的特点。
如果没有使用以上两种办法,导致RAM里的映射表因掉电丢失了,这就很严重了,必须对映射表进行重建。
那么,如何重建映射表呢?下面介绍一种重构策略(不同的SSD重构策略略有不同,但大同小异)。SSD在把用户数据写到闪存的时候,会额外打包一些数据,我们叫它元数据(Meta Data),它记录着该笔用户数据的相关信息,比如该笔数据对应的逻辑地址、数据写入时间(时间戳)等,如下图所示:
因此,用户数据在闪存中是像下面这样存储的:
如上图,如果我们读取物理地址Pa x,就能读取到元数据x和用户数据x,而元数据是有逻辑地址La x的,因此,我们就能获得映射:La x→Pa x。映射表的恢复原理其实很简单,只要全盘扫描整个闪存空间,就能获得所有的映射关系,最终完成整个映射表的重构。
以上重构原理很简单,但是还有两个问题。
其一:假设用户对逻辑地址1写过两次数据,注意SSD的数据不是原位更新的,第一次写在物理地址1,第二次写在物理地址2,这种情况在重构的时候怎么判断此逻辑地址应该映射到那个物理地址呢?这就得根据时间戳来判断,我们知道,用户最后写入的数据总是最新的,那个物理地址的元数据的时间戳值越大,谁就是最新数据。在全盘扫描时,先扫描到物理地址1,可以恢复出映射La 1→Pa 1,但扫描到Pa 2时,发现时间戳比之前的更新,于是新的映射取代旧的映射,最后得到映射关系:La 1→Pa 2。
其二:全盘扫描映射表恢复很慢,所耗的时间与SSD容量成正比。现在SSD容量已达到TB级别,全盘扫描映射方式,重构映射表需要花费几分钟甚至几十分钟,这在实际使用中,用户是不能接受的。那SSD内部是如何快速恢复映射表的呢?一种办法就是SSD定期把SSD中RAM的数据(包括映射表和缓存的用户数据)和SSD相关的状态信息(诸如闪存块擦写次数、闪存块读次数、闪存块其他信息等)写入到闪存中去,与正常掉电前SSD要做的事情类似,这个操作我们称之为做Checkpoint(检查点,此处译成“快照”更合适),如下图:
假设在做完快照C后,做下一个快照D之前,SSD在X处发生了异常掉电,如下图:
重新上电后,SSD可以从闪存中读取到最新的快照信息,即快照C。由于异常掉电,从快照C处到X处新产生的映射关系丢失。由于之前绝大多数的映射关系都被快照C保存,因此需要重建的映射关系仅仅是快照C之后产生的映射关系,这部分关系的恢复,仅需扫描一些局部的物理空间,因此,相对全盘扫描,映射表重建速度大大加快。
文章参考自《深入浅出SSD:固态存储核心技术、原理与实战 SSDFans》。
【FLASH存储器系列十九】固态硬盘掉电后如何恢复掉电前状态?相关推荐
- 【FLASH存储器系列十七】固态硬盘FTL之垃圾回收
- 【FLASH存储器系列十八】固态硬盘FTL磨损平衡
- 【FLASH存储器系列十二】Nand Flash芯片使用指导之二
目录 1.1 芯片指令集 1.2 READ PAGE(00h–30h) 1.3 READ PAGE CACHE SEQUENTIAL (31h) 1.4 READ PAGE CACHE RANDOM ...
- 【FLASH存储器系列十】ONFI数据接口的时序参数与时序图
- 为什么固态硬盘删除数据后无法恢复?
为什么SSD的数据恢复成功率那么低?关键的问题点就在它和机械硬盘完全不同的数据存储方式. SSD用闪存作为存储介质是地球人都知道的,问题也就在这儿,SSD在新数据写入之前需要先进行擦除操作,然后捏,厂 ...
- 铠侠推出全新BG6系列消费级固态硬盘,引领PCIe®4.0高性价比主流
东京-铠侠株式会社今天宣布其PCIe®4.0固态硬盘(SSD)产品线新增加铠侠BG6系列,这是公司推出的首款采用全新第六代BiCS FLASH™ 3D闪存(1)的产品,其性能几乎是前一代产品的1.7倍 ...
- 固态硬盘坏了数据能恢复吗?(已解决)
固态硬盘坏了数据能恢复吗?固态硬盘是电脑内存储数据的一个工具,固态硬盘一旦破坏,数据恢复难度较大,因此,我们在日常运用固态硬盘的时候,需要留意一下一些固态硬盘损坏之前的一些征兆,以便及时做好备份数据, ...
- 固态硬盘raw格式数据能恢复吗(图文)
很多人都说固态硬盘跟机械硬盘不一样,如果数据丢失了就无法恢复,是真的吗?那么,固态硬盘raw格式数据能恢复吗?下面小编就为大家分享几种恢复硬盘raw格式的方法: 解决决方案1:系统权限的问题1(原系统 ...
- plsql 删除一直在执行_固态硬盘开启Trim后,删除数据究竟能不能恢复?
固态硬盘其实是闪存存储硬盘系列的一个俗称(SSD),近些年闪存存储发展迅速,一些企业级的固态硬盘容量能够达到10T以上容量,在速度和存储密度上的优势逐渐盖过传统的机械硬盘. 那么固态硬盘删除数据后能不 ...
最新文章
- 刀剑英雄登陆显示服务器繁忙,玩刀剑遇到问题解决方法
- nvidia:未找到命令
- [转]程序员趣味读物:谈谈Unicode编码
- php读取屏幕大小,jQuery 获取屏幕尺寸
- 09丨缓存异常:如何解决缓存和数据库的数据不一致问题
- python canvas画移动物体_Python GUI编程入门(25)-移动Canvas对象
- java 检索ldap,从LDAP(Java)检索信息
- catch所有提示的异常类型,程序执行异常时却还是没有报错,异常没有被catch到吗[已解决]
- python编程100个小程序-【Python精华】100个Python练手小程序
- 用unity协程写的发牌程序
- 0920 - 积极休息
- 海思Hi3798硬件设计,Hi3798 datasheet(2)参考资料
- 因创业的辞职报告怎么写[范文7篇]
- mysql远程连接数据库的二种方法_mysql 远程连接数据库的二种方法 | 速光网络博客...
- 转正答辩未通过是否可以辞退试用期员工
- 让资源管理器变得像Chrome一样标签化
- 2018 前端性能优化清单
- 使用springBoot:run命令启动时报错:An exception occurred while running. null
- 特权容器以及安全隐患的规避
- 慈禧六天内扳倒权臣肃顺的内幕
热门文章
- 【重磅推荐】【monero-node-rpcWallet】完美解决节点和RPCWallet同步,并且100%可以正常打开Wallet的方案【附加常见错误汇总】
- react-native使用高德地图获取当前地理位置
- ASP.NET购物车(源码下载)
- 中国大学mooc 南京大学慕课 --探索数据的奥秘--代码复现
- 机器学习-有监督学习-分类算法:k-近邻(KNN)算法【多分类】
- 第七讲 幂级数的运算与和函数
- ssm+jsp计算机毕业设计宠物网站laf7a(程序+LW+源码+远程部署)
- 宝宝智能起名,免费起名实现方案,带源码
- 在计算机中字节的英文名称是bit么,计算机中的字节是常用单位,它的英文名字是( )。A.bitB.byteC.boutD.baud - 试题答案网问答...
- Nodejs监控Apple召回计划邮件提醒