SSD内部数据文件系统eblock链接结构、管理系统及方法技术领域
本发明涉及一种SSD内部数据文件系统eblock链接结构、管理系统及方
法。
背景技术
SSD内部数据文件管理旨在控制SSD内容数据文件的访问。这些数据文件
主要有盘片日志文件、固件升级文件、配置文件、nandflash块状态、掉电数据
文件等内容。为保证SSD的可靠性,SSD内部数据管理常采用多备份、SLC模
式、只使用快page等机制。
现有SSD内部数据管理采用轻量级的盘片主机数据管理方式,如图1所示。
在该系统中,给定逻辑地址空间,建立一张逻辑地址到flash物理地址的映
射表FLT(FirstLevelTable),在FLT中为每个内部数据文件划分一段固定且
互斥的逻辑地址空间,这些数据文件在分配的逻辑地址空间中存放。此方式下,
FLT表随着系统数据文件数量的增加而增加,所以,可支持的内部数据文件数
量有限。另外,需要较大的buffer去缓存FLT表,增加硬件成本;由于各文件
固定划分逻辑地址空间,当需要增加、删除数据文件时,需要重新构造FLT并
划分逻辑地址空间,灵活性很差。
由于FLT较大,FLT也需作为一个文件保存到flash中,所以还需再建立一
张逻辑地址到flash物理地址的映射表SLT(SecondLevelTable),用于描述
FLT数据存放关系。在盘片下电时,FLT数据下刷到flash,而SLT数据则被下
刷到Norflash/EEPROM中SLT所在块的首个空page中。若SLT所在的块记满,
则需要记录到备用块中,并擦除记满的块。
SLT数据之所以保存到NorFlash/EEPROM,是因为NorFlash/EEPROM数
据retention非常可靠且page大小较小(如norpagesize通常为64-256B,但读
取较慢;nandflashpagesize通常为16KB),SSD控制器在boot阶段可快速、
有效查询到与SLT紧邻的空page。另外NorFlash/EEPROM块较nandflash块
的擦写次数多得多,可在Norflash/EEPROM中选用两个块交替擦除/记录掉电
时的SLT数据。但这意味着,SSD硬盘必须外接额外的非易失介质,硬件成本
增加。
当盘片上电时,SSDfirmware从Norflash/EEPROM中给定区域内检索首个
空page,读取有效SLT到buffer,随后查找SLT从flash中获取FLT到buffer,
随后即可访问系统区的各个数据文件。通常而言,首先读取掉电数据文件用于
上电重建。
读取系统区指定数据文件时,根据文件起始逻辑地址和长度查找FLT读取
存放于flash物理地址内数据即可。更新指定系统数据文件时,若为page对齐
写,则将数据写到空白page,更新映射关系到FLT。若非page对齐写,则在执
行读填充后,再将数据写到空白page,更新映射关系到FLT。
参考图1,现有技术中,需要在buffer中缓存SLT及整个FLT,并存在于
SSD的整个运行周期,占用buffer资源较多,增加掉电数据下刷压力,增加硬
件成本。
在满足FLT下电下刷条件下,FLT不宜过大,也意味着现有系统区管理方
法可管理的系统区数据文件数量较少。
现有设计中,各系统区数据文件从FLT中固定分配逻辑空间用于数据读写。
观察图1,FLT表中的file之间存在一些无效表项entry,表项空间利用率低下。
当需要增加或删除某个文件时,将需要对几乎所有系统文件在FLT中的地址段
进行重新划分,灵活性较差。
另外,由于nand的比特翻转特性导致检索的空page不可靠且在nand中交
替擦除/记录会快速消耗nand的块寿命,为有效获取SLT,需要将SLT保存到
Norflash/EEPROM中,导致硬件成本增加。
发明内容
本发明所要解决的技术问题是,针对现有技术不足,提供一种SSD内部数
据文件系统eblock链接结构、管理系统及方法,解决现有系统区数据管理方法
灵活性较差,buffer资源占用过多,可支持系统区文件数量较少,表项空间利
用率低下,需要外接额外非易失介质保存SLT的问题。
为解决上述技术问题,本发明所采用的技术方案是:一种SSD内部数据文
件管理系统多级eblock链接结构,包括:
RL0eblock:用于放置盘片配置信息以及RLneblock的块位置信息;
RLneblock:用于存放SLTEBLOCK的块位置信息;
SLTeblock:用于存放SLT表,供SSD盘片上电时读取。
本发明还提供了一种SSD内部数据文件管理系统,包括上述eblock链接结
构、FILESeblock、buffer、SLT表、逻辑-物理映射表FLT#;其中:
FILESeblock:用于存放SSD盘片数据文件内容和各文件最后一次写包含
的FLT#;
buffer:用于在SSD盘片上电时,根据SLTeblock的块位置信息,从SLT
eblock中读取SLT表;缓存逻辑-物理映射表FLT#;根据SLT表记录的最后一
次写page的位置,获取逻辑-物理映射表FLT#记录的映射关系,再根据逻辑-物
理映射表FLT#读取存放于FILESeblock中的SSD盘片数据文件内容,并缓存
读取的SSD盘片数据文件内容;
SLT表:用于按文件ID‘#’记录文件file#最后一次写page的位置;该最后
一次写page的位置记录有file#的逻辑-物理映射表FLT#;
逻辑-物理映射表FLT#:用于记录file#的逻辑地址到物理地址的映射关系。
本发明所述eblock链接结构的构造过程包括以下步骤:
1)选取nandflash中若干固定物理位置的flashblcok作为RL0eblock,
并约定SSD在boot阶段从这些固定位置中读取有效的RL0page;
2)从nandflash中选取一定数量的flashblock构成一个blockpool,并
预留一部分flashblock用于坏块替换和垃圾回收;
3)在上述blockpool中获取与设计备份数相同的flashblock,对这些
flashblock按顺序记录物理地址构成RLnblockmap,将RLnblock
map作为RLn-1page的一部分记录到RLn-1级中,当前获取的若干
个flashblock即构成RLneblock;
4)在上述blockpool的剩余flashblock中获取与设计备份数相同flash
block,对这些flashblock按顺序记录物理地址构成SLTblockmap,
将SLTblockmap作为RLnpage的一部分记录到RLn中;当前获取
的若干个flashblock即构成SLTeblock。
本发明还提供了一种SSD内部数据文件管理方法,该方法主要实现过程为:
在SSDboot阶段将SLT表读写到buffer中;
读文件file#时,检查file#对应的逻辑-物理映射表FLT#是否在buffer中;
若是,则直接查找buffer中的FLT#获取物理地址来读取文件内容;若否,查找
buffer中SLT表的’#’号节点获取文件file#最后一次写的物理地址,读取逻辑-物
理映射表FLT#到buffer,再查找buffer中逻辑-物理映射表FLT#来读取文件内
容;至此完成文件file#的读取;
写文件file#时,检查文件file#对应的逻辑-物理映射表FLT#是否在buffer
中;若否,则查找SLT表的’#’号节点获取文件file#最近一次写的物理地址,读
取逻辑-物理映射表FLT#到buffer中;若是,则直接进行下一步操作;随后,
从fileseblock中获取首个空白page写入file#需要更新的数据内容,并将这些
page的物理地址更新到逻辑-物理映射表FLT#的对应逻辑节点中;再将逻辑-物
理映射表FLT#写入到另一空白page中,更新该空白page的物理地址到SLT表
的’#’号节点中;至此,完成文件file#的写入;
在SSD盘片掉电时,将SLT表、FLT#下刷到flash中。
将SLT表读写到buffer中的具体实现过程包括:
当SSD盘片上电,读取SLT表到buffer时,首先在RL0eblock中读取一份
有效的RL0Page,根据RL0page中块位置信息获取RL1级所在eblock,在
RL1级中检索首个空page,读取该空page的上一page数据内容,校验通过后
获得有效RL1page;同理,根据RL1page中的块位置信息检索有效SLTpage;
写buffer中的SLT表到flash时,若SLT表所在eblock未使用完毕,则将
SLTpage内容写入到的SLTEBLOCK首个空白epage;若SLTeblock所在
eblock使用完毕,则获取新的eblock,并将SLTpage写入该新的eblock首个空
白epage中,随后把SLT表新的块位置信息写入到RL1级中首个空白epage。
本发明空page的判断方法为:对写入flash的每一page数据进行格式化处
理,使得写过的page与空page的比特值为1的个数存在至少5%的差异,对读
路径上比特值为1的个数进行统计,若读取的page内容中95%以上的比特值为
1,则认为该page为空page。
将SLT表、FLT#下刷到flash中的具体实现过程包括以下步骤:
1)设SSD盘片掉电后的相关数据保存在ID为‘#’的文件中,查找SLT
表,读取文件的FLT#到buffer;
2)根据FLT#写入掉电数据到所述文件中;
3)将FLT#做为文件的最后一部分写入flash;
4)更新FLT#的物理位置到SLT表的对应位置;
5)检查SLT级是否写满,若写满则进入步骤6),否则写入SLTpage
到SLT级中,并跳转到步骤8);
6)请求一空白块,写入SLTpage到SLT级中,记录SLT级新的SLT
eblockmap;
7)写入SLTeblockmap到RL1级;
8)结束。
与现有技术相比,本发明所具有的有益效果为:本发明采用多级检索方式
访问SLT、FLT等数据,规避多块交替擦写方式下,NAND块寿命消耗过快的
问题,并可保证盘片充足的寿命。此方式不需要借助额外的非易失介质,使得
完全基于nandflash的SSD内部文件管理得以实现,降低了硬件成本。对SSD
内部各数据文件独立构造逻辑-物理映射表FLT#,如此,在访问文件时,只需
存放需要访问文件的FLT#到buffer中即可,并不需要缓存所有文件的FLT,大
量节省了buffer资源。此方式下,各文件的FLT#互不干扰,使得添加/删除文
件变得非常灵活,解决逻辑地址空间固定分配下导致数据文件管理灵活性差的
问题。另外,随着系统区文件数量的增加,在buffer中也仅增加极少的SLT数
据而已,对掉电下刷数据量影响甚微,可以支持更多的系统文件数量。采用统
计比特值为1的比例是否超过阈值的方式检测空page,有效解决由nandflash
比特翻转导致的检测nandflash空page困难问题。
附图说明
图1为现有SSD内部文件管理方法简图;
图2为本发明SSD内部文件管理方法简图;
图3为本发明数据格式化示例;
图4为本发明实施例SLTpage结构示例;
图5为本发明实施例FLT#page结构示例。
具体实施方式
本发明原理如图2。图中的eblock(equalblock)由多个内容互为备份的
block组成(多备份机制)。RL0(recordlevel)中包含盘片配置及RL1的块位
置等信息,RL1中存放SLT的块位置信息,SLT按文件ID‘#’记录file#最后一
次写page位置,且该最后一次page写位置记录有file#的逻辑-物理映射表
FLT#。RL0中的数据在SSD出厂后内容保持不变,前若干page互为备份以增
强数据可靠性。在RL1与SLT所在块中,只有紧邻空page的数据page为有效
的RL1page/SLTpage,进一步的,可通过校验来保证数据内容的有效。为增强
可靠性,本发明对使用到的block采用SLC模式或只使用快page方式来保存数
据。
在RL1/SLT中检索到首个空page,则该空page的上一page则为有效RL1
page/SLTpage。结合图2可知,本发明中不需要额外的非易失介质,只在nand
中即可完成系统区数据文件的管理,其关键在于解决nand比特翻转导致空page
检测有效和快速问题。本发明中对写入flash的每一page数据进行格式化处理,
使得写过的page与空page的比特1的个数存在至少5%的差异。再通计数模块,
对读路径上比特1的个数进行统计,若对读取的page统计出95%以上的比特为
1则认为该page为空page。该方法可有效解决在nand中检测空page的有效和
快速等问题,为省去额外非易介质创造条件。
由于nandflashblock的擦写次数较Norflash/eeprom少得多,若选用两个块
交替擦除/记录SLT数据,被选用block的寿命将很快耗光,这也是导致原有方
法中需使用额外非易失介质的主要原因之一。为解决这一问题,本发明采用多
级检索方式访问SLT。图2中RL0,RL1,SLTeblock构建了这种多级检索模
型。读取SLT到buffer时,首先在RL0中读取一份有效的RL0Page,根据RL0
page中块位置信息获取RL1所在eblock,在RL1中检索首个空page,读取空
page上一page数据内容,校验通过后即获得有效RL1page。采用类似方式根据
RL1page中的块位置信息检索有效SLTpage。写buffer中的SLT到flash时,
若SLT所在eblock未使用完毕,则将SLTpage内容写入到的SLTeblock首个
空白epage(eblock内page号相同的互为备份的flashpage);若SLT所在eblock
使用完毕,则获取新的eblock并将SLTpage写入其首个空白epage,随后把
SLT新的块位置信息写入到RL1eblock中首个空白epage。
SLT的读取,只需在盘片上电时读取一次到buffer便可。读文件file#时,检
查其对应的FLT#是否在buffer中;若是,则直接查找buffer中的FLT#获取物
理地址来读取文件内容;若否,需要查找buffer中SLT的’#’号节点获取file#最
后一次写的物理地址,该物理地址指向图2中虚线框黄色矩形FLT#,读取
FLT#到buffer,再查找buffer中FLT#来读取文件内容;至此完成文件file#的读
取。写文件file#时,检查其对应的FLT#是否在buffer中;若否,则需查找SLT
的’#’号节点获取file#最近一次写的物理地址,该物理地址指向图2中虚线框黄
色矩形FLT#,读取FLT#到buffer中;若是,则直接进行下一步操作;随后,
获取一个或多个空白page写入file#需要更新的数据内容,并将这些page的物
理地址更新到buffer中FLT#的对应逻辑节点中;再将buffer中FLT#写入到另
一空白page中,更新该page的物理地址到SLT的’#’号节点中;至此,完成文
件file#的写入。由于掉电后,buffer中的数据会丢失,所以在盘片掉电时,需
要执行一次写SLT到flash的操作。
据上述可知,SLT在上电时读取到buffer,读写文件时,SLT内容在buffer
中更新即可,在掉电时才将SLT数据下刷到flash,以充分减少对flash的磨损。
该方法可有效解决nandflash下SLT记录问题,以达到省去外挂额外非易失介
质的目的,减少硬件成本。假设在每次下电时写入RL1eblock及SLTeblock,
每个flashblock有256flashpage,则当RL1eblcok写满时,需要下电256x256
次,足以满足大多数盘片寿命需求。若需要更多的下电次数,还可再增加RLn
的级数。
本发明中抛弃现有发明中对SSD内部所有数据文件统一编址构造逻辑-物
理映射关系表的方式,转而对每个文件file#单独构造逻辑-物理映射关系FLT#,
FLT#在file#的最后一次写操作中被写入flash,SLT中按文件ID‘#’记录FLT#
的物理存放地址。读取flie#时,在SLT中查找FLT#的存放地址,读取FLT#到
buffer,再依据FLT#即可访问存放于flash中的file#。由此可见,本发明只需分
配足以保存最大的FLT#的buffer即可,可有效节省buffer资源。SSD内部数据
文件数目越多,这种资源节省效果越明显。另外,各文件独立构造FLT#,SLT
按文件ID记录FLT#的物理位置的方式,可以非常方便的在SLT中添加删除文
件,增强文件管理灵活性。再者,若增加系统区文件数量,在buffer中也仅增
加极少的SLT数据节点而已,对掉电下刷数据量影响甚微,因此该方案可以支
持更多的文件数量。
实施例:
A)nandflash空page检测
首先需要对page格式化,其目的在于,使写入到flashpage的任何数据,读
取时,该flashpage中比特值为1的比例不超过设定阈值。例如,可对flash
page做如图3所示格式化,其中data段为文件数据内容;signature可指示当前
eblock类型;crc段为data段的循环冗余检验值;pattern段填0,设阈值为95%,
则pattern段大小为:pageSize*(1-0.95)。
如此即可保证被写过的page中bit值为1的比例不超过阈值95%。
其实检测空page,在读路径总线之上可做一简单逻辑模块,启动该模块后,
该模块即可对读路径中经过的每一个数据中比特值为1的个数进行累计计数,
读完指定长度后,停止计数并上报cpu,随后cpu即可计数出flashpage中比特
值为1的比例,再同设定阈值比较判断当前flashpage是否为空page。
B)构造RL0,RL1,...,RLn多级eblock链接关系
eblock由多个互为备份的flashblock组成。例如,设计eblock由两个互为备
份的flashblock组成,若构造RL0,RL1,STLeblock三级eblock链接关系,
可通过如下步骤实现:
(1)从nandflash中选取一定数量的block构成一个blockpool,其具体数量
根据需要支持的文件数量、RL的级数等确定,并预留一部分flashblock用于坏
块替换。
(2)构造RL0EBLOCK,RL0的构造较为特殊,可以视为整个链接关系的
‘根’,为让主控在boot阶段可快速获取这个‘根’内容,推荐RL0采用固定flash
block分配方式,主控在boot阶段到约定的固定位置读取即可。例如,可选取
2-4个die的block编号为0的page0-8记录相同的RL0page数据(RL0page中
含有RL1blockmap数据)。在SSD主控boot时,随机读取上述范围page的内
容,直到读到有效的RL0page即可。
(3)构造RL1级,在步骤(1)中的blockpool中获取2个flashblock,对这
两个flashblock按顺序记录物理地址构成RL1blockmap,将RL1blockmap作
为RL0page的一部分记录到RL0中。当前获取的2个flashblock即构成RL1
级。
(4)构造SLTEBLOCK,在步骤(1)中的blockpool中获取2个flashblock,
对这两个flashblock按顺序记录物理地址构成SLTblockmap,将SLTblock
map作为RL1page的一部分记录到RL1中。当前获取的2个flashblock即构成
SLTEBLOCK。
自此完成RL0,RL1,STLeblock三级eblock链接关系。其他n级链接关
系以此类推。
C)SLTpage、FLT#page结构示例。
SLT按文件编号‘#’记录文件最后一次写的物理地址(需要查找fileseblock
map表将eblock地址转化为flashblock地址),该page中保存该文件的FLT#。
可定义SLTpage结构如图4所示。其中freeepagecnt描述SLTeblock还剩余多
少空白page;eblock-epageinfo记录用于保存文件的所有eblock的epage信息
(如freeepage数、有效epagemap等),结合freeflashblocktable供垃圾回收
或坏块替换使用。eblockmap记录保持文件的eblock编号与flashblock的映射
关系,通过该表可将eblock编号转化为多个互为备份的flashblock地址。
FLT#记录文件ID为‘#’的逻辑地址到物理地址的映射关系(映射基本单元
根据设计需求设定,如图5中的映射基本单元为page大小),可定义FLT#
page结构如图5所示,需要查找SLTpage中的fileseblockmap表将图中的
eblock地址转化为flashblock地址。
G)power-onboot
在读写ssd内部数据文件之前,必须在ssdboot阶段将SLT和fileseblock
map等数据读取到ram(buffer)中,其主要流程如下(省略异常处理流程):
D)readfile
假设需要读文件ID为‘#’,起始逻辑地址为offset(512Byte对齐),长度为
len(512Byte对齐)的文件,操作步骤不下:
E)writefile
假设需要重写文件ID为‘#’,起始逻辑地址为offset(512Byte对齐),长度
为len(512Byte对齐)的文件,若不为pagesize对齐写,还需要执行读填充操
作。下面仅给出pagesize对齐写情况下操作步骤:
F)SSDpoweroff
掉电时,需要对将SLT、FLT#、eblockmap等信息下刷到flash,可参考以下
方式完成这些数据的下刷: