(北京空间飞行器总体设计部,北京 100094)
作为卫星数据管理系统中的关键组成,星载固态存储器为有效载荷业务、平台业务、星间中继通信业务等数据提供存储管理、回放传输等功能[1]。目前,星载固态存储器主要使用基于Nand FLASH的文件存储管理系统,其具有非易失性、电可擦除性、可重复编程以及高密度、低功耗等特点。但目前YAFFS法中的索引表使用多级映射方式,其索引表建立过程耗时巨大,从而导致星载固态存储器存在启动时间过长的问题。而卫星所处的空间环境充斥着大量的带电粒子会造成星载固态存储器运行逻辑错乱或者工作失效,严重时会导致整个星载数据管理系统不能工作。面对这种情况,地面通常会采用星载设备主备份切换或者复位操作来解决在轨出现的问题[2]。同时,空间探测器承载的有效载荷向着数量多,性能高以及多样化的方向迅速发展,卫星平台承载的数据流要求越来越高。面对高速的数据输入,固态存储器过长的启动时间会增加存储数据丢失或者出错的风险。因此如何减少星上存储系统的启动时间、提高快速访问速度已经成为当前星载数据管理研究的热点之一。
当前研究趋势主要集中于两个方向:1)通过精简索引表信息来减少需要恢复的数据量。例如Chan-Sul Park[3]提出的用扫描每个Nand Flash块(block)头文件空闲区的方式替代扫描每个Nand Flash页(Page)的方式来建立更精简的索引表信息。索引表的建立过程以及索引表内容均得到了简化,但其启动时间随着存储空间的增加而逐渐延长,不适用于大容量的Nand Flash存储系统;2)通过优化索引表存储方式来提高索引表建立速度。Keun Soo Yim[4]提出的快照技术(Snapshot)每次关机前将系统中的索引数据存储于Nand Flash中,在存储系统启动后通过读取快照中的数据来恢复索引表。但这种索引表存储方式减少了每次上电后对所有Nand Flash空闲区的扫描工作,成功加快了存储器启动速度。但其索引表的存储只在收到关机指令后启动,对与没有指令的非预期关机或者突然断电情况无法启动存储。而星上存储系统中常常存在这样非预期断电的情况,故该方式具有很高的不可靠性,不适于在卫星上使用。只包含Nand Flash单一存储器件的固态存储器,精简索引表信息常常受制于Nand Flash存储体的容量,而修改索引表的存储方式也会带来极大的不可靠性。
针对这一问题,分级缓存的新设计采用片内缓存结合小容量非易失存储器(MRAM)[5]的硬件架构打破这一困局。MRAM其集动态RAM、磁盘存储和高速缓冲存储器功能于一身,不仅存取速度快,掉电不流失数据,接口时序与RAM相似,而且存储单元不受单粒子效应的影响。本文将重点讨论如何将具有非易失且具有抗辐照功能的磁电存储器(MRAM)和Nand Flash存储器结合实现分级缓存,在以对象为索引的启动方式下把文件对象头存储指针存储在MRAM中,从而保证在启动时可以快速定位对象文件地址指针来建立文件系统。若恢复失败,再以NAND FLASH文件元数据为依据,重新精简元数据结构并集成为独立的块元数据区,对整个存储体的文件信息快速访问,从而实现固态存储器启动速度和存储可靠性的大幅度提升。
本文结构如下,第一节主要阐述了基于分级缓存加速的星载固态存储系统架构。第二节深入解析了基于分级缓存加速的文件系统启动及管理策略;第三节论述了星载固态存储器启动性能分析,并通过实验结果和以往设计进行了比较,表明了本设计的有效性;第四节对全文进行了总结和展望。
磁电存储器(MRAM)[5]中数据存储是通过直接附着于铁磁薄膜上具有电感耦合效应的导线来完成的。这种工作机理不仅提高了存储器的速度、可靠性,降低了功耗,而且在存储单元尺寸、存储速度方面也完全可以与DRAM相比拟。在卫星上使用的磁电存储器经过抗辐照加固和3D叠片封装,并行叠加的MRAM的数据线各自独立组成更宽的数据总线,共用地址线和读写控制信号,通过片选信号进行选通,如图1(a)所示,例如3D-plus公司的3DMR8M32VS8420 磁电存储器,其内部为两组MRAM存储基片,每次4片并行组成32位的数据总线,两组共用17位地址总线和读写使能信号,通过片选信号进行选通。
图1 MRAM和Nand Flash存储架构
Nand Flash芯片存储结构中的读写操作的基本单元为页(Page)[6],擦除操作的基本单元为块(Block)。每页包含数据区和空闲区,在固态存储器中空余区用于存储该页相关的管理信息。由于Nand Flash的工艺问题,其只支持先擦除再写入的数据更新方式,此外其内部存在坏块,在坏块区存储数据会造成数据错误。Nand Flash出厂时会标注存在的坏块,但坏块会在使用中陆续产生。在卫星上使用的Nand Flash存储器经过抗辐照加固和3D叠片封装。叠片中并行联系的Flash共用数据线,通过片选信号进行选通,可以使用一个Flash接口控制模块进行控制。而随着存储容量的增加,星上存储系统使用多个3D叠片封装的Nand Flash存储器,每个Nand Flash存储器的IO接口各自独立存在,从而形成Nand Flash的多通道存储架构[7],如图1(b)所示。
Nand Flash和MRAM协同工作存储系统硬件架构,将MRAM接入星载固态存储系统[8]的下层FPGA中。其和Nand Flash一起受FPGA控制,具体如图2所示。整个固态存储器系统按照层次化思想进行设计,其使用CPU作为固态存储器文件系统YAFFS2的实现载体,使用FPGA通过对Flash页读取,Flash页写入、Flash块擦除以及Flash坏块管理等基本单元操作,为CPU软件提供硬件接口支持。其中,FPGA内部分为负责接口选通和时序的物理接口管理模块,负责存储单元操作的存储基本单元模块,负责数据流控制和纠错的数据缓存模块,以及和CPU总线通信的CPU接口模块。
图2 基于分级缓存的星载固态存储器硬件架构
基于YAFFS2文件系统的固态存储器启动流程分为两种,一种为以对象为索引自上而下搭建文件系统, 一种为以Nand Flash里面的元数据为依据自下而上的恢复文件系统,如图3所示。
第一种方式中,YAFFS2 使用对象(object)来实例化所有存入闪存的文件,每个对象都有一个对象头(object header)与之对应。对象头(object header)存储文件对象的基本信息,如对象类型、父目录的对象id、对象名、属主信息、访问信息等等[9]。在文件系统挂载时,YAFFS2根据对象头创建相应文件的对象,进而建立起整个文件系统的组织关系。每当文件发生改动(修改、增加、删除)后,文件系统都会在该文件后添加一个新的对象头做为标识,。由于文件有可能发生过多次更改,同一文件可能会对应多个对象头,但其中只有一个是有效的。在固态存储器启动时,需要扫描整个Flash来锁定有效的对象头文件,这使得文件系统加载时间随着Flash容量增大而延长,会出现启动速度慢的现象。
第二种方式中,YAFFS按照固定大小的数据段来组织文件,并利用NandFlash页面的空闲区存放ECC(错误检查与纠正)纠错信息和文件系统组织信息[10]。在系统启动过程中,固态存储器会遍历所有Flash页的空闲区来见获取足够的信息,将页信息整合为按照块为单位的块信息数组(block_info)。遍历结束后,CPU读取该数组到缓存中进行管理,并配置文件系统结构。同时CPU在内存中设置chunk_bits数组记录Flash中所有逻辑页的使用情况,数组中的每一个位(bit)对应闪存中的一个页的状态,若页被使用则对应位设置为1。当文件系统被卸载时,块信息数组(block_info)和chunk_bits数组作为检查点(checkpoint)数据被写入到Nand Flash中[11]。在下一次加载文件系统时,检查点数据可以帮助YAFFS2将文件系统快速恢复到上一次卸载前的状态,而不必扫描整个Flash,从而加快了文件系统的挂载速度。如果文件恢复失败,YAFFS2读取块序号(seq_number)采用逆序扫描的方式获取闪存上每一块的信息来恢复文件系统。这样的遍历操作也会造成启动时必须遍历所有块,致使启动时间随容量增加大幅增长,无法满足星载固态存储器的应用需求。
通过对启动流程进行分析可知,第一个从对象出发的启动方式的关键在于对各个文件中对象头(object header)的定位。第二个从Flash页内空闲区出发的启动方式的关键在于对索引信息的维护。因此,启动流程的优化关键在于文件对象头的地址索引,以及块信息索引表的数据维护。
新的对象头页面(Object header)伴随着文件系统操作而不断被创建,旧的对象头页面不断失效。本文将这类灵活变化又需要断电保存的地址信息存入磁电存储器MRAM中,每次新对象头页面被创建时就同步更新对应文件号(ObjectID)在MRAM中的对象头页面存储地址,这样固态存储器启动的时候可以直接读取最新对象头文件的存储指针,减少了遍历Flash的操作流程。
针对块信息索引表的数据维护,本文旨在通过精简文件组织信息内容和优化文件组织信息存储方式等两个方面实现启动流程的优化。在文件组织信息中,Nand Flash存储体的坏块信息更新频率低,查询率高,适合在吞吐高,断电保存的MRAM中存储。因此在本设计中,在MRAM中设置坏块表记录Flash中所有块的好坏块情况,表中的每一个位(bit)对应Flash中的一个块,好块为0,坏块为1。通过对好坏块表的查询可以成功屏蔽坏块对文件操作的影响。
参考yaffs_PackdTags2Part描述结构内容,提炼文件信息数据,即块元数据。考虑星载系统处理数据的类型与特点,设置星载固态存储器的文件系统最多支持1024个文件,同时每个文件的最小单位为一个Flash的块。这样对于每个Flash的块来说,其元数据中的每个属性都是唯一的,其具体参数如表1所示。
本设计尝试在Nand Flash中寻找区域集中保存所有的块元数据,定义为块元数据区,特别针对星载固态存储器的多通道系统,在每个拥有独立IO接口的Flash芯片(Device)中设置保存该Device所有Block块元数据的块元数据区,这样在固态存储器启动时可以并行多通道读取各自独立的块元数据区,来获得整个Nand Flash存储体的文件系统信息,而不再将每个Block块都一一遍历,从而大大缩短启动时间。其具体存储分布和更新方式如图4所示。
图4 多个Device中块数据区存储及更新示意图
伴随着星载固态存储系统的运行,每个文件操作都有可能导致Block块元数据内容的失效,故需要定时遍历整个Device来读取Block块内部文件信息形成新的块元数据区文件。从旧的块元数据区文件尾部开始顺序存储到Flash中。最新一次的完整数据的地址指针伴随着每次定时更新而跳变,故将这部分数据放入MRAM中存储。当断电后启动时,星载固态存储器来读取MRAM来获得最新一次版本的块数据区的完整数据,并作为数据恢复的信息参考。将整个存储体的坏块表,所有文件的对象头存储指针以及所有Flash芯片的块元数据区存储在MRAM中进行管理,通过三模冗余存储设计来保证存储数据的高可靠性。
星载固态存储器的启动时间与Nand Flash接口时序、容量、内部坏块数、块元数据区大小以及块元数据更新周期等因素有关,依照星上器件使用情况对上述因素进行量化假设:
1)Nand Flash存储体内部架构以及相关参数在目前星上存储系统的性能区间如表2所示。
2)Nand Flash读取操作时,设定时钟周期为tRC,Flash内部运行时间为trb,读取数据字节数为Brd, Flash内部数据的读取时间为:
Trd=7tRC+trb+BrdtRC
(1)
设置Tpre=7tRC+trb,则方程式(1)可以简化为:
Trd=Tpre+BrdtRC
(2)
其中:tRC一般在40~80 ns之间,tRC一般在25 μs左右。
3)MRAM读取时间为TM_RD,其中0≤TM_RD≤35 ns
4)星载固态存储器YAFFS2文件系统中文件数设置为WObject个,其中0≤WObject≤1023。
5)单个Device中块元数据区大小为BWA个Flash数据页Page,根据定义,即:
设定0≤BWA≤QPage。
根据上一节Nand Flash读取时间公式(2),对传统算法的启动过程进行建模。传统星载固态存储器每次启动需要搜索所有数据页的空闲区,来寻找对象头文件,或者获取块序号(Seq_Number)用于逆序扫描建立文件系统。因此其启动时间Tmnt可以定义为:
Tmnt=PDeviceLChipSBlockQPage(Tpre+BSparetRC)
(3)
本文中设计的星载固态存储器针对两种YAFFS2 文件系统挂载方式分别设计了基于MRAM的启动加速算法,下面一一进行建模并估算启动时间:
1)针对以对象为索引自上而下的文件启动方式,其启动过程为读取MRAM获得对象头文件地址指针,然后读取头文件内部数据,依次遍历所有文件后,从而完成固态存储器启动操作。故其启动过程Tmnt_H可以定义为:
Tmnt_H=WObject[TM_RD+Tpre+(BSpare+BData)tRC]
(4)
考虑到TM_RD远小于Tpre,则公式(4)可以简化为:
Tmnt_H=WObject[Tpre+(BSpare+BData)tRC]
(5)
2)针对以Nand Flash里面的元数据为依据自下而上的文件启动方式,其启动过程为读取MRAM获得每个Device中的块元数据区起始地址指针,然后数据区的块元数据,从而完成文件系统加载操作。在这个过程中,读取MRAM的操作室串行的,而读取各个独立Flash的操作则是并行进行的,故其启动过程Tmnt_D可以定义为:
Tmnt_D=PDeviceTM_RD+BWA(Tpre+BDatatRC)
(6)
引入公式(3),并考虑到PDeviceTM_RD数值太小可以忽略,公式(5)可以演变为:
(7)
通过公式(5)可知,针对以对象为索引自上而下的文件启动方式只受文件数量和单页Flash读取时间影响,而Nand Flash芯片容量和内部结构不再直接影响启动时间。参考3.1节中各个参数的数值范围,当文件数量为1024,单页Flash数据区字节数为8192, 空闲区字节数为224,Flash读取时钟周期为80 ns时,理论上按照公式(5)获得最大启动时间为689.28 ms。
通过公式(7)可知,针对以Nand Flash里面的元数据为依据自下而上的文件启动方式受单个芯片Device的内部块结构和单字节Flash读取时间影响,而与Nand Flash芯片个数关系不大。参考3.1节中各个参数的数值范围,当单页Flash数据区字节数为2048,单个基片Chip中包含4096块,每个芯片包含8个基片,Flash读取时钟周期为80 ns时,理论上按照公式(7)获得最大启动时间为24.17 ms。
通过公式(3)可知,以传统方式启动,启动时间与存储器的整体规模直接相关,存储体容量越大,时间越长。参考3.1节中各个参数的数值范围,当单页Flash空闲区字节数为64,存储体包含1个Nand Flash存储芯片,单个存储芯片中包含4个基片,单个基片Chip中包含2048块,单个Block块内部包含64页,Flash读取时钟周期为40 ns时,理论上按照公式(3)获得最小启动时间为22.84 s。
由此可见,针对星载固态存储器的使用区间,经过分级缓存加速优化的启动流程的最大耗时都远远小于基于传统设计方案的启动方式的最小耗时。故针对星载固存设计来说,分级缓存加速的文件系统启动速度大大优于传统文件系统启动速度。
本次设计中,FPGA芯片选用Xilinx公司的XQR2V3000,设置外部激励对固态存储器上电启动进行控制仿真。通过仿真,基于硬件加速的星载固态存储器启动设计的性能可以得到更多方面的论证。
1)设置文件对象数为1000,每个芯片Device包含4个基片,每个Flash基片(Chip)包含4096的块(Block),Nand Flash接口读取时钟为60 ns,选取不同规格的Nand Flash进行仿真,测试Flash单片容量与启动时间的关系,具体如图5所示。
图5 不同规格Nand Flash环境下固态存储器的启动时间
图表中的具体数值如表3所示。
表3 单片容量不同的Nand Flash 的启动时间
通过图5的仿真结果可以看出,当单片Page容量很小的时候,两种方式性能差不多。随着Nand Flash单片容量的增加,星载固态存储器的启动时间因为采用启动方式的不同而出现截然不同的特性。在以对象为索引的文件启动方式下,启动时间伴随容量增加而明显延长。而在以Nand Flash里面的元数据为依据的文件启动方式下,启动时间反而逐渐减小并趋于一个稳定值。也就是说,当单片Page容量超过8 416字节后,启动时间不再受单片Page大小的影响。
2)设置文件对象数为1 000,每个芯片Device包含4个基片,每个Flash基片(Chip)包含4 096的块(Block),每页Page数据区包含4 096字节,空闲区包含128字节,通过FPGA修改Nand Flash读取时钟周期(tRC),测试Flash读取速率与启动时间的关系,具体实验结果如图6所示。
图6 不同读取速率下的固态存储器的启动时间
图表中的具体数值如表4所示。
表4 不同读取速率下固态存储器的启动时间
通过对实验数据进行解析发现在两种启动方式下,星载固态存储器都不同程度地随Nand Flash接口读取速率的提高获得更高的启动速率,但星载设备的可靠性要求接口时序拥有一定的时序裕度,故要求使用者根据具体应用环境选择合适的Nand Flash接口读取时钟周期,从而在高启动速率和高可靠性之间得到平衡。
在实际的测试板上面,选用Xilinx公司的XQR2V3000作为芯片载体,选用五块三星公司出品的FLASH 存储器MMFN08408808S-F和一块3D_Plus公司出品的MRAM 存储器3DMR8M32VS8420作为存储器件,使用YAFFS2文件系统,创建10个文件,进行断电重启操作,记录上电后到文件系统组织信息搜集完毕的时间。经过测试,以对象为索引的文件启动方式获得的启动时间为3.12 ms,以Nand Flash里面的元数据为依据的文件启动方式获得的启动时间为143.47 ms。在相同的实验条件下,以传统设计方式进行重启后,其启动时间为170.35 s。由此可知,本文通过加入MRAM实现分级缓存的硬件架构并设计了基于分级缓存文件系统的启动加速算法,这样的设计可以大大缩短了星载固态存储器启动时间。
本文从星载固态存储器在轨工作环境出现的问题出发,深入研究星载固态存储器传统启动策略的优化局限,提出一种基于分级缓存加速的星载固态存储器启动及管理算法。分级缓存设计在硬件架构上引入MRAM磁电存储器来存储Nand Flash的坏块信息和文件系统操作中容易变化文件组织信息。针对YAFFS2文件系统的加载过程,分级缓存对关键信息的高吞吐率保证固态存储器直接定位对象头文件而缩短了基于对象索引建立文件系统的时间,也可以通过直接定位更精简集成的块元数据区的起始地址来加速以Flash元数据恢复文件系统的进程。MRAM的抗辐照以及断电保护特性,保护其内部存储文件数据的正确性和实时性,大大提高文件系统可靠性。在本文中,作者对两种启动方式下的优化设计进行建模,通过性能分析和与传统算法的比较,以及在星载存储测试板上的实验验证均表明新设计的启动时间大大缩短,从而证明基于分级缓存加速的固态存储器启动设计拥有超越传统设计的优越性能。