嵌入式系统中UBI设备分区快速加载方案的设计与研究

2015-12-30 02:29郭玉堂
关键词:线程队列分区

卫 兵,郭玉堂*,张 磊,李 斌

(1.合肥师范学院 计算机学院 ,安徽 合肥 2300601;2.安徽大学 计算教学部,安徽 合肥 230009;3.安徽广播电视大学,安徽 合肥 230022)

嵌入式系统中UBI设备分区快速加载方案的设计与研究

卫 兵1,郭玉堂1*,张 磊2,李 斌3

(1.合肥师范学院 计算机学院 ,安徽 合肥 2300601;2.安徽大学 计算教学部,安徽 合肥 230009;3.安徽广播电视大学,安徽 合肥 230022)

针对当前嵌入式系统启动时间过长的问题,提出了一种新UBI设备架构方案。该方案在分区中划分出物理预留区域,UBI设备卸载时使用新线程预先将UBI管理信息进行压缩,存入预留区域,UBI设备重新加载时再次调用线程直接读取预存储的压缩包实现快速加载,节省大量DMA读外设的时间。采用Block循环队列设计以及标志锁机制确保系统工作稳定性。实验测试结果表明,采用新UBI方案,系统分区加载时间缩短约50%左右。该方案可以有效解决系统升级时分区容量不断扩大导致开机速度变慢问题,在使用大容量闪存的嵌入式系统中有很好的应用优势。

嵌入式系统;UBI;NAND;DMA;快速加载

当前以智能设备为代表的嵌入式产品广泛普及,所依赖的嵌入式平台几乎都使用支持内存管理单元(MemoryManagementUnit,MMU)的操作系统。例如,嵌入式Linux系统、基于Linux内核的Andriod系统,以及在Andriod基础上深度开发的各种变本等。多数嵌入式平台都会使用NANDFLASH闪存设备,基于NAND的文件系统也被广泛使用,主要有YAFFS、JEFFS2、无排序区块镜像文件系统(UnsortedBlockImageFileSystem,UBIFS)[1]等。UBIFS是针对NAND开发的一种专业闪存日志文件系统,相比较传统的文件系统具备很多优点[2]。UBIFS文件系统是基于无排序区块镜像 (UnsortedBlockImage,UBI)设备层基础上使用,UBI设备是为管理NAND存储块而设计的一种设备管理接口层[4]。系统启动时UBI需要扫描分区中所有物理存储块(Block)的头信息,进而在内存中建立起管理设备分区的数据结构信息,完成UBI设备加载,为上层UBIFS提供文件操作接口[3-4]。

嵌入式平台不断发展的同时,NAND制程也越来越先进,从43nm发展到28nm工艺,从小容量的单层单元NAND(SingleLayerCellNAND,SLCNAND)到大容量的多层单元NAND(Multi-LayerCellNAND,MLCNAND)逐渐在智能平台中普及[5-6]。系统UBI设备分区也不断扩展,以容纳更多的应用程序和数据,但存在的问题也逐渐显现出来。UBI设备是依靠扫描分区所有Block的头信息完成加载的,设备分区的不断扩展导致需要扫描的Block越来越多。由于系统读取外设数据通常是耗时较大的操作,因此会出现设备开机时间变长。这种情况对于实时便捷性要求较高的嵌入式产品往往比较棘手,会直接影响用户对设备的使用体验。课题在该背景下对UBI设备架构进行研究并重新设计了其架构,提高系统开机速度,以适应大容量闪存的嵌入式系统发展。

1 UBI设备工作分析

UBI是一种设计用于NAND块设备的管理接口层,架设于mtd设备之上。UBI对mtd层的物理擦写块(PhysicalEraseBlock,PEB)进行统一管理,将其打包成逻辑擦写块(LogicalErase,LEB),内部封装坏块管理、损益均衡管理以及卷管理等功能,提供给上层文件系统以统一的设备读写接口。UBIFS文件系统层只需要关注于日志文件管理层的设计,结构上相互独立。

UBI设备分区格式化过程中会对所属存储分区的mtd层物理PEB块进行格式化操作。UBI向PEB中写入头信息:VIDheader和ECCheader,大小为64字节(Byte),占用PEB前两个页面(Page),同时在内存中建立起逻辑管理结构。格式化后PEB块被UBI作为逻辑LEB接口统一使用。系统启动时,UBI设备的加载过程其实就是建立起UBI逻辑管理结构,UBI会依次扫描分区中的所有物理PEB,读取LEB头信息结构和坏块(BadBlock)标志。UBI设备卸载相对简单,只需要释放相关内存资源即可。

UBI设备占用PEB块的前两个页面,每个页面只使用64Bytes用于存储头信息,在大页面NAND(如4KB、8KB型)中只使用到页面的一小部分存储空间。由于NAND设备的随机读取(Randomread)效率很低,一般驱动程序都会以整页为单位进行DMA读操作。读取PEB的前两个Page属于DMA读外设数据的过程,DMA控制器发送读数据命令后需要等待NAND内部wait/busy(R/B)信号结束才会触发对应端口开始数据采样[7-8]。NAND内部R/B信号等待时间远大于通常CPU指令的工作时间,不同制程和款型NAND的内部取数据的R/B信号等待时间约为20μs到100μs不等[9]。另外,DMA完成从I/O端口采样整个Page的2 112Bytes数据操作也会耗费较长时间。图1为系统控制器以DMA方式读取NANDPage数据的耗时分析。

(1)

图1 DMA读NAND页面耗时分析

由公式(1)分析可知,读取单位NAND页面数据周期达72.984μs,相对于CPU指令周期耗时很大,尤其对于高性能嵌入式处理器平台。因此,读外设数据对于系统启动时间来说是一种较大的负担。UBI加载时需要扫描的PEB越多,意味着加载时间越长。随着嵌入式平台的升级,NAND容量在不断扩大,UBI设备分区也不断扩大。这种情况下,UBI加载所需耗时也会相应增加,进而影响到系统启动时间。

2. 新UBI设备的架构设计

由以上分析可知,UBI读取64Bytes头信息需要读整个页面,页面大部分数据为0xFF,大量的启动时间被耗费在DMA读外设操作。因此,有必要对UBI进行改进,以适应系统平台不断升级带来的问题。文中在先前课题的研究基础上针对UBI设备工作原理和特点,对其架构改进设计。新方案中UBI设备卸载时调用相关线程对UBI管理信息进行压缩处理,更新至分区中指定的物理存储区域,UBI再次启动加载时调用线程从该区域直接读取压缩信息即可完成加载,从而节约大量系统开机读外设时间。图2为新架构UBI设备原理图。方案设计中充分考虑系统运行的健壮性,下面对各环节模块进行分析介绍。

图2 新型UBI设备运行原理图

在新UBI设备中,系统分区格式化中在固定物理位置划分出若干PEB块的预留区域。UBI设备卸载时,调用所设计线程对内存中UBI设备管理信息进行压缩,然后将压缩包信息存储进预留区域。系统再次启动,UBI设备加载时,调用相关线程从预留区域读出压缩包,直接解压即可建立起UBI管理信息,完成加载。该方法和传统UBI加载扫描所有PEB的头信息一样,均可得到前一次设备卸载时的最后信息记录。由于压缩包存储的页面数远小于常规扫描需要读取的页面数,可以减少大量系统读外设的DMA中断耗时,进而大幅节约系统启动时间。图3为新UBI设备卸载设计流程。

图3 新UBI设备卸载流程图

如图3所示,设备卸载时先启动线程对UBI管理信息进行打包压缩处理,具体做法为申请一块连续内存缓冲区,将UBI管理信息依次拷入缓冲区,然后使用压缩算法对缓冲区数据进行压缩处理,得到UBI信息压缩包,存储关机时UBI的最后信息。目前很多高端IC平台都自带有支持高效压缩算法的硬件控制器,基于该类平台时可以使用硬件数据压缩方式将UBI信息尽可能地压缩到较小格式。UBI分区中逻辑块LEB的头信息VIDheader和ECCheader均为64Bytes,通常只占用页面的一小部分,在方案测试实验中,整个分区的管理信息经过压缩处理后通常可以存储在一个PEB块中。

UBI压缩包制作好后,需要将其更新到预留物理存储区域供下次启动使用。以UBI压缩包格式大小为一个PEB以内为例,存储区域的设计需要考虑诸多因素。NANDFLASH存储块Block有使用擦写寿命(Program/Erasecycle,P/ECycles)问题,常规制程的SLCNAND的P/ECycles约60K~100K,MLCNAND约为3K~5K不等[10]。Block随着擦写次数增加会产生位反转(bit-flip)并逐渐增多导致ECC无法纠正,同时NANDFLASH本身会存在BadBlock问题,以及操作中也可能意外产生BadBlock。这些因素都会影响系统稳定性[11-12]。因此,不能简单地将UBI压缩包固定在某物理Block。新UBI中使用Block循环队列设计,将划分的预留区域Block统一管理起来,按照队列的方式循环供数据存储线程使用,确保数据信息安全性和稳定性。如图3中Block循环队列工作流程设计,预留区域使用Block循环队列管理,每个预留Block的Page的前四个4Bytes作为索引标志位,用于队列的循环累加计数。UBI定位存储位置时,遍历队列,读出预留标志位,标志值最大的BlockX即为上一次压缩数据的存储位置,则队列中的下一个BlockX+1即为本次存储位置,将标志位的计数器加1和UBI压缩包一起存入队列,完成UBI压缩包更新。在遍历队列和更新压缩包的过程中遇到BadBlock就跳过使用下一个。通过一系列操作流程,使新UBI设备最大程度地克服NAND固有的BadBlock和P/ECycles问题,确保系统工作稳定性。

系统启动后,UBI设备分区开始执行加载流程。如图2中所示,UBI设备会首先启动线程尝试从预留区域寻找最新UBI压缩包以实现快速加载(Fastattach)。UBI设备的前一次卸载操作中,如果预留区域出现大量BadBlock,则会导致定位储存位置出错以及更新压缩包出错等问题,卸载流程失败。另外,若出现嵌入式系统常见的意外断电情况,也无法执行UBI卸载流程。这类情况下预留区域均无最新UBI压缩包供加载读取,新UBI架构中使用标志锁设计以避免加载流程出错。图4为新UBI设备加载工作流程设计。

图4中流程所示,新UBI加载操作中首先启动新线程尝试Fastattach。系统从物理预留区域寻找目标UBI压缩包,对Block循环队列进行遍历,依次读出Block中第一个Page的前4Bytes存储的压缩包编号信息(UBIindex)。若队列中均为BadBlock,则预留区存储块无法使用,视为极端情况,退出Fastattach。遍历完成后定位队列中UBIindex最大的BlockX,接着检查紧邻下一个无故障BlockX+1作进一步判断:若BlockX+1中存储最小UBIindex,表示UBI压缩包队列处于开锁(LockOpen)状态,BlockX中数据为最新压缩包;若BlockX+1中第一个Page信息为预定义标志锁(Lockmark),则表示UBI压缩包队列处于锁定(Locked)状态,意味着当前队列中没有前一次卸载所更新的UBI压缩包可供读取。推断系统前一次UBI卸载更新压缩包出错,或者发生意外掉电状况,此时退出Fastattach。针对UBI队列LockOpen状态,直接读取BlockX中UBI压缩包,解压数据包建立起UBI信息结构,实现Fastattach。然后在退出前LockUBI队列:向BlockX+1中第一个Page写入Lockmark。同时,图3分析中,新UBI卸载时会将最新UBI压缩包和UBIindex更新到BlockX+1中,即覆盖Fastattach后的Lockmark,将UBI队列打开(Unlock),为系统下次启动UBI加载进行状态设置。采用这种标志锁机制防止系统工作异常。

图4 新UBI设备加载流程图

新UBI加载流程中出现退出Fastattach时,则快速加载失败,关闭新线程重新走常规UBI扫描加载流程(Commonattach)。UBI分区格式化中,对Block循环队列进行格式化处理,在队列N个Block中依次递增写入UBIindex,取值为从0到N-2,BlockN-1写入Lockmark。分区格式化后,新UBI压缩包队列初始化为Locked状态,第一次开机会执行Commonattach,通过卸载流程建立起第一个UBI压缩包,为后续运行提供可用信息。图5为设备初始化工作流程图。

图5 新UBI设备初始化流程

3 方案的实验测试与分析评估

实验设计针对新UBI设备进行性能测试。实验测试平台选择SAMSUNGCortex-A9 4210开发板,该平台为ARMCortex-A9 双核架构处理器,主频为1GHz,具有64/32位的内部总线结构。NAND使用SAMSUNGK9K8G08U0M,该款型NAND容量为1GB,页面为2KB,块为128KB。

实验中系统固件内核版本选用Linux-2.6.35。在系统分中设计三个UBIFS分区,每个UBIFS分区设计一个UBI设备。依照新UBI设备设计方案重新编写UBI源程序中attachdevice和detachdevice模块,预留存储区域Block数目初始化为5,经交叉编译得到基于新UBI的内核镜像文件,再更新至系统平台。重启系统后依次测试UBIFS分区的挂载速度(第二次挂载),并与基于原始UBI内核镜像文件的平台进行对比,分析新UBI设备性能(Performance),如表1所示。

表1 UBI设备挂载时间统计

从表1测试数据看,基于新UBI设备的分区加载时间普遍缩短约50%左右。设计中采用UBI队列标志锁机制,测试中加入意外断电操作,重启系统可以按照原始开机速率正常启动。针对BadBlock问题,测试中使用指令操作人为将Block循环队列中Block全部标记为Bad,重启系统后同样按照原始开机速率正常启动。系统健壮性表现较好。新UBI设备分区加载Fastattach流程时,相对于原始UBI设备分区加载操作只需要读取1个Block数据,节省很多UBI扫描分区Block步骤,即DMA读外设耗时。当系统平台中大容量分区较多时,新UBI设备可以节省大量系统启动时间,Performance十分可观。

4 结束语

采用尽可能减少系统读外设工作量的设计思想,新UBI设计方案在设备分区加载速度上相对原始UBI设备具备很大优势。通过一系列设计方法使方案的在测试性能和稳定性处于较好的状态。系统整体健壮性的再提高以及UBI与上下层接口的磨合情况还有进一步研究改进的空间。

[1]MuhammadN,JamshidD.SoftwareBasedNANDFlashManagementTechniques[C].IEEEComputing,EngineeringandInformation.Washington,DC,2009:168-171.

[2] 韦 斯,丁志刚,张伟宏.LINUX下UBI子系统的研究与应用[J].计算机应用与软件,2010,27(10):68-71.

[3] 韩春晓,陈香兰,李 曦,等.UBIFS损耗均衡对系统I/O性能的影响[J].计算机工程,2009,35(6):260-262.

[4]UBIFSDocumentation,Nokia&UniversityofSzeged[EB/OL]. 2008.http://www.linux-mtd.infradead.org/doc/ubifs.html.

[5]YooB,WonY,ChoS,etal.Ssdcharacterization:Fromenergyconsumption’sperspective.InProceedingsofHotStorage’2011[C].USENIXAssociationBerkeley,CA,USA,2011:3-3.

[6]ChenF,LuoT,ZhangX.Caftl:Acontent-awareflashtranslationlayerenhancingthelifespanofflashmemorybasedsolidstatedrives,Proceedingsof9thUSENIXConferenceonFileandStorageTechnologies[C].USENIXAssociationBerkeley,CA,USA,2011: 6-20.

[7] 史 斌,丁志刚,张伟宏.基于PXA3xx处理器的NAND闪存DMA方案[J].计算机应用,2009,29(8):2136-2138, 2142.

[8]WildaniA,MillerEL,ANDWardL.Efficientlyidentifyingworkingsetsinblocki/ostreams,Proceedingsofthe4thAnnualInternationalSystemsandStorageConference[C].ArticleNo. 5,ACMNewYork,NY,USA,2011.

[9]SAMSUNG.K9K8G08U0MFLASHMEMORYdatasheet,Rev.2.6[EB/OL][2015-11-02].http://www.dzsc.com.

[10]曹 璐.基于NANDFLASH的文件系统设计与实现[D].上海:华东师范大学,2012:5-6.

[11]MuhammadN,JamshidD.SoftwareBasedNANDFlashManagementTechniques[C].IEEE.Computing,EngineeringandInformation.Washington,DC:IEEEPress,2009: 168-171.

[12]ChangLP.OnefficientwearlevelingforLarge-ScaleFlash-Memorystoragesystems[C]//APPLIEDCOMPUTING2007,VOL1AND2,seoul:acmpress, 2007: 1126-1130.

AdesignandresearchofimprovedUBIwhichcouldbefastattachedinembeddedsystem

WEIBing1,GUOYu-tang1*,ZHANGLei2,LIBin3

(1.DepartmentofComputerScienceandTechnology,HefeiNormalCollege,Hefei230601; 2.DepartmentofComputerScienceandTechnology,AnhuiUniversity,Hefei230039;3.AnhuiOpenUniversity,Hefei230022)

Inthispaper,anewUBIdeviceframeworkwasproposed,whichfocusedonproblemsofboottimeinEmbeddedsystemcurrently.Inthesolution,afixedphysicalareawasdividedinsystempartition,whichisreservedforstoringUBImanagementinformationpackagecompressedbyanewthreadafterUBIdetachaccomplished,then,anothernewthreadwouldbecreatedtoreadoutthepreviousUBIpackagefromreservedareatorealizefastUBIattachment,whichcouldsavealotoftimeconsumingduringDMAperipheralreading.Furthermore,ablockcircularqueueandlogolockingmechanismweredesignedtoensurethestabilityofthesystem.Experimentalresultsshowedthatthepartitionloadtimewasreducedabout50%byusingthenewUBI.Thesolutioncouldsolvetheproblemsofslowlybootingcausedbycontinuouslyexpandingthepartitioncapacitywhenupgradethesystems,whichhasgoodapplicationadvantagesinEmbeddedsystemswithlarge-capacityflashmemory.

embeddedsystem;UBI;NAND;DMA;fastattach

魂芯DSP产业化研究院开放课题(2014dspkfb03);安徽省高等学校省级优秀青年人才基金重点项目(2013SQRL097ZD);合肥师范学院青年基金项目(2015QN16)资助。

卫 兵 (1984-),男,硕士,讲师,研究方向:嵌入式系统、模式识别与智能数据处理。

郭玉堂 (1962-),男,博士,教授,研究方向:图像处理与模式识别。Email:28297852@qq.com。

TP302.1,TP302.7

A

1004-4329(2015)04-074-06

10.14096/j.cnki.cn34-1069/n/1004-4329(2015)04-074-06

投稿日期:2015-04-23

猜你喜欢
线程队列分区
上海实施“分区封控”
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于国产化环境的线程池模型研究与实现
在队列里
浪莎 分区而治
丰田加速驶入自动驾驶队列
浅谈linux多线程协作
基于SAGA聚类分析的无功电压控制分区
基于多种群遗传改进FCM的无功/电压控制分区