山高疑日近,海阔觉天低

嵌入式Flash存储UBI

一,nand vs.  nor Flash
下表总结了NAND和NOR闪存的各种特性:

区别 NAND  NOR
读速度 快,需要通过一个函数才能读取数据,先发送读命令->发送地址
->判断nandflash是否就绪->读取一页数据
快,像访问SRAM一样,可以随机访问任意地址的数据
写速度 快,写之前需要擦除,因为写只能是1->0,擦除可以使0->1 慢,写之前需要擦除,因为写只能是1->0,擦除可以使0->1
可靠性 比较低,位反转比较常见,必须有校验措施 比较高,位反转的比例小于NAND FLASH的10%
容量 大,16MB~512MB 小,1MB~32MB
数据密度 密度高 密度低
使用场景 适合长期储存和不经常阅读 优先用于读取代码执行中需要的数据
功耗 待机时更高的功耗 启动/读取过程中更高的功耗
擦除寿命 100W 10W
使用范围 SSD,U盘,嵌入式系统 直接运行代码,STM32,EEPROM

二,MTD

MTD 子系统, 提供对flash芯片的访问接口, MTD子系统提供了MTD device的概念,比如/dev/mtdx,MTD可以认为是raw flash.在I.MX6ULL中,可以修改uboot的 bootargs 环境变量 “root=ubi0:rootfs rootfstype=ubifs  CONFIG_BOOTARGS_CMA_SIZE mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs)
linux中可以通过cat /proc/mtd 查看分区状态:

dev:    size   erasesize  name
mtd0: 00400000 00020000 "u-boot"  //4MB uBoot
mtd1: 00100000 00020000 "dtb"     //1MB dtb
mtd2: 00800000 00020000 "kernel-0" //8MB Kernel
mtd3: 00800000 00020000 "kernel-1" //8MB Kernel
mtd4: 00400000 00020000 "logo"     //4MB logo
mtd5: 04900000 00020000 "rootfs"   //73MB rootfs
mtd6: 09e00000 00020000 "opt"      //158MB opt

三,UBI
全称是Unsorted Block Images,为flash device提供了wear-leveling和 volume management功能; UBI工作在MTD设备之上,提供了UBI volume;UBI是MTD设备的高层次表示,对上层屏蔽了一些MTD不得不处理的问题,比如wearing以及坏块管理。
UBIFS详细的说明
UBI详细的说明
1、UBI与MTD的关系
原文

上图是UBI MTD的映射,注意这个映射只限于MTD通过一分区内,


2、UBI功能
①UBI是MTD管理系统(类似于LVM为块设备提供的功能)
②同一个ubi设备可以创建多个卷,这个写卷共享MTD分区
③负责管理擦除块和磨损水平
④卷的大小可以调整
3、UBI实现原理
在每个MTD擦除块中,保留一页(EC)来计算擦除循环的次数,保留另一页(VID)以将擦除块附加到UBI卷,如果设备支持超级页,两者可以在同一页内.其余的页面用于存储有效负载数据

使用建议
①UBI负责将写入分布到整个闪存设备:分配给附加到UBI层的分区的空间越多,磨损均衡就越有效
②如果需要分区,请使用UBI卷而不是MTD分区
③有些分区仍然必须是MTD分区:例如引导加载程序和引导加载程序环境
④如果您需要额外的MTD分区,请尝试将它们分组在flash设备的末尾或开头
4、UBI卷创建过程
①flash_erase:他会擦除所有数据包括EC,VID等块,磨损数据被清除,如果不调用数据会保留

flash_erase MTD-device [start block] [cnt (# erase blocks)] [lock] //如果cnt=0表示擦除所有块
flash_erase /dev/mtd6 0 0

②ubiformat:格式化MTD分区保留(EC)Erase Counter,,他与①的不同是,它可以保留EC分区,但是VID会没了,销毁了分区信息
ubiformat /dev/mtd6
③ubiattach:将MTD 分区挂载到UBI层面, 创建UBI设备

ubiattach /dev/ubi_ctrl -m 6 -d 1 //-m:mtd设备号 -d:创建的ubi设备号

④ubimkvol:在ubi上创建卷,静态卷是只读的,动态是可以读写的

//-m:所有空间 -s:指定大小(byte) -S:指定大小(LEB)  -N:卷名字 -n:卷ID 未指定会自增-t卷类别(dynamic, static)默认dynamic
ubimkvol /dev/ubi1 -N opt -m 
//这条命令会创建卷名字为:uib1_0  卷名字格式:/dev/ubi<ubi_ID>_<卷_ID>

⑤mount:挂载

mount -t ubifs ubi1_0 /opt

5、UBI销毁过程
基本上他是创建过程的反过来的步骤:

umount /opt
//下面2个任选一个
ubirmvol /dev/ubi0 -n 1 //-n:后面是卷ID
ubirmvol /dev/ubi0 -N name //-N:后面是卷名字
//下面3个任选一个
ubidetach -p /dev/mtd6 //卸载mtd6  -p后面跟路径 
ubidetach -d 1 // 卸载ubi1 -d 后面是ubi设备号
ubidetach -m 0 //卸载mtd0 -m 后面是mtd设备号
flash_erase /dev/mtd6 0 0

6、Uboot中的ubi命令
uBoot中ubi命令是以”ubi”作为开头的
ubi part:将MTD设备挂载到UBI
ubi info:显示UBI设备信息,如果分卷,显示卷信息
ubi check:检查某个卷是否存在
ubi readvol:读取卷内容
U-Boot 也提供更新UBI设备内容命令,但是不建议使用他们
ubi createvol
ubi removevol
ubi writevol
BusyBox构造的文件系统中,命令ubirsvol与ubirmvol不支持-N选项
四,几种嵌入式文件系统比较

赞(0) 打赏
未经允许不得转载:Mr.Zhang » 嵌入式Flash存储UBI

你的打赏是我的动力

登录

找回密码

注册