一,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选项
四,几种嵌入式文件系统比较