一、产生的背景
FLASH具有的“先擦除再写入”、坏块、“有限的读写次数”等特性,目前管理FLASH的方法主要有:
1、采用MTD+FTL/NFTL(flash转换层/nandflash转换层)+传统文件系统,如:FAT、ext2等。FTL/NFTL的使用就是针对FLASH的特有属性,通过软件的方式来实现日志管理、坏块管理、损益均衡等技术。但实践证明,由于知识产权、效率等各方面因素导致本方案有一定的局限性。
2、采用硬件翻译层+传统文件系统的方案。这种方法被很多存储卡产品采用,如:SD卡、U盘等。这种方案对于一些产品来说,成本较高。
3、采用MTD+FLASH专用文件系统,如JFFS1/2,YAFFS1/2等。它们大大提高了FLASH的管理能力,并被广泛应用。
JFFS2、YAFFS2等专用文件系统也存在着一些技术瓶颈,如:内存消耗大,对FLASH容量、文件系统大小、内容、访问模式等的线性依赖,损益均衡能力差或过渡损益等。在此背景下内核加入了UBI文件系统的支持。
二、用法
环境:omap3530处理器、(128MByte16位NANDFlash)、linnux-2。6。28内核
1、配置内核支持UBIFS
DeviceDrivers--->MemoryTechnologydevice(MTD)support--->UBI-Unsortedblockimages--->EnableUBI
配置mtd支持UBI接口
Filesystems--->MiscellaneousfileSystems--->UBIFSfilesystemsupport
配置内核支持UBIFS文件系统
2、将一个MTD分区4挂载为UBIFS格式
●flash_eraseall/dev/mtd4//擦除mtd4
●ubiattach/dev/ubi_ctrl-m4//和mtd4关联
●ubimkvol/dev/ubi0-Nrootfs-s100MiB//设定volume大小(不是固定值,可以用工具改变)及名称
●mount-tubifsubi0_0/mnt/ubi或mount-tubifsubi0:rootfs/mnt/ubi
3、制作UBIFS文件系统
在制作UBI镜像时,需要首先确定以下几个参数:
MTDpartitionsize;//对应的FLASH分区大小
flashphysicaleraseblocksize;//FLASH物理擦除块大小
minimumflashinput/outputunitsize;//最小的FLASH输入输出单元大小
forNANDflashes-sub-pagesize;//对于nandflash来说,子页大小
logicaleraseblocksize。//逻辑擦除块大小
参数可以由几种方式得到
1)如果使用的是2。6。30以后的内核,这些信息可以通过工具从内核获得,如:mtdinfo–u。
2)之前的内核可以通过以下方法:
●MTDpartitionsize:从内核的分区表或cat/proc/mtd获得
●flashphysicaleraseblocksize:从flash芯片手册中可以得到FLASH物理擦除块大小,或cat/proc/mtd
●minimumflashinput/outputunitsize:
1)norflash:通常是1个字节
2)nandfalsh:一个页面
●sub-pagesize:通过flash手册获得
●logicaleraseblocksize:对于有子页的NANDFLASH来说,等于“物理擦除块大小-1页的大小”
3)也可以通过ubi和mtd连接时的产生的信息获取,如:
#modprobeubimtd=4//ubi作为模块加载
或
#ubiattach/dev/ubi_ctrl-m4//通过ubiattach关联MTD
UBI:attachingmtd4toubi0
UBI:physicaleraseblocksize:131072bytes(128KiB)
UBI:logicaleraseblocksize:129024bytes
UBI:smallestflashI/Ounit:2048
UBI:sub-pagesize:512
UBI:VIDheaderoffset:512(aligned512)
UBI:dataoffset:2048
UBI:attachedmtd4toubi0
更详细的解释参见http://www。linux-mtd。infradead。org/doc/ubi。html#L_overhead
#mkfs。ubifs-rrootfs-m2048-e129024-c812-oubifs。img
#ubinize-oubi。img-m2048-p128KiB-s512/home/lht/omap3530/tools/ubinize。cfg
-r:制定文件内容的位置
-m:页面大小
-e:逻辑擦除块大小
-p:物理擦除块大小
-c:最大的逻辑擦除块数量
对我们这种情况,文件系统最多可以访问卷上的129024812=100M空间
-s:最小的硬件输入输出页面大小,如:k9f1208为256(上下半页访问)
其中,ubinize。cfg的内容为:
[ubifs]
mode=ubi
image=ubifs。img
vol_id=0
vol_size=100MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
4、利用uboot烧写、启动UBIFS镜像
1)烧写UBIFS镜像
OMAP3DevKit8000#mmcinit
OMAP3DevKit8000#fatloadmmc0:181000000ubi。img
readingubi。img
12845056bytesread
OMAP3DevKit8000#nandunlock
device0wholechip
nand_unlock:start:00000000,length:235456!
NANDflashsuccessfullyunlocked
OMAP3DevKit8000#nandeccsw
OMAP3DevKit8000#nanderase6800007980000
NANDerase:device0offset0x680000,size0x7980000
Erasingat0x7fe0000--100%complete。
OK
OMAP3DevKit8000#nandwrite。i81000000680000$(filesize)
NANDwrite:device0offset0x680000,size0xc40000
Writingdataat0x12bf800--100%complete。
12845056byteswritten:OK
烧写过程和烧写内核镜像的过程一致,所以UBI文件系统应该不像yaffs文件系统那样用到了nand的OOB区域。
2)设置UBIFS文件系统作为根文件系统启动的参数
OMAP3DevKit8000#setenvbootargsconsole=ttyS2,115200n8ubi。mtd=4root=ubi0:rootfs
rootfstype=ubifsvideo=omapfb:mode:4。3inch_LCD
OMAP3DevKit8000#setenvbootcmdnandread。i80300000280000200000;bootm80300000
根文件系统的位置在MTD4上
系统启动时会打印出如下和UBI相关的信息:
Creating5MTDpartitionsnumbergoodPEBs:970
UBI:numberofbadPEBs:2
UBI:max。allowedvolumes:128
UBI:wear-levelingthreshold:4096
UBI:numberofinternalvolumes:1
UBI:numberofuservolumes:1
UBI:availablePEBs:0
UBI:totalnumberofreservedPEBs:970
UBI:numberofPEBsreservedforbadPEBhandling:9
UBI:max/meanerasecounter:2/0