ubi层次
转:http://www.360doc.com/content/11/0518/13/496343_117643185.shtml
UBI是什么?
它是一种flash管理方式
flash是一系列连续的物理擦除块组成的。
UBI卷是一系列连续的逻辑擦除块(eraseblock),每一块都可以被映射到物理分区,这种映射是由UBI管理的。
UBI是靠什么来管理这些物理擦除块的呢??
首先要区分一些层次:
1.MTD subsystem :
provide ubiform interface to access flash (e.g. /dev/mtd0)
2.UBI subsystem
UBI works on top of MTD devices ,provide a notion of UBI volumes
3.UBIFS file system
work on top of UBI volume

UBI header
UBI在每一个物理擦除块的开始有2个64-byte的ubi-headers
1.erase counter header (or EC header);
记录着物理可擦除块上erase counter(擦除次数),以及其他一些不那么重要的信息
Erase counter是指物理可擦除块被擦除的次数
2.volume identifier header (or VID header)
记录着卷号(volume ID)和 这个物理可擦除块所属的逻辑可擦除块的ID
所有的UBI headers被CRC-32校验和所保护着
在我们sep4020的nandflash中,每一页为512字节,一个物理擦除块的大小为16K,也就是32页
其中EC header在每一个擦除块的第一页上(所以offset为0)
VID header在每一个擦除块的第二页上(偏移量offset为512)
所以一个完整的物理擦除块是什么结构呢?
第一页保存EC头,占了64字节(浪费了好多哦)
第二页保存VID头,同样也占64字节
其余的十页用来保存数据
Volume table
卷表(volume tabel)是一种flash上的数据结构,包含了UBI设备上的每一卷(volume)的信息(基本信息),卷表是一系列 volume table record,每一个记录块上包含了一下的信息:
1.volume size
2.volume name
3.volume type (dynamic or static )
4.volume alignment
5.update marker(防止数据更新发生意外打断,可以恢复)
6.auto-resize flags
7.CRC-32 校验和
UBI内部保持着两份卷表volume table,保持UBI的稳定性,防止突然断电的情况
这两份卷表保存在一个叫做layout volume的内部卷区中,这个卷区对于用户空间是不可见的

怎么才能从一个逻辑ID找到与它映射的物理ID?
其实在我们的volume是有三个表的
1.volume table (flash media)
2.eraseblock association (EBA) table (ram)
3.erase counters (EC) table (ram)
建立EBA和EC table就必须扫描整个ubi设备,来获得物理块与逻辑块之间映射关系的全部信息
在这个映射关系变更时,要及时的更新表
UN_MAP:
unmap就是清除物理块(peb)和逻辑块(leb)这种映射关系
那么这种映射关系不存在的话,那么物理块中保持的数据也就没有意思了,所以需要清除(erase),这种清除工作是后台进程来执行的
unmap机制通常被当做是一种快速擦除nand的手段
1.不需要等待返回,因为总是存在一些unmaped的物理块peb可供来进行映射(ubi策略上保留了一些物理块)
均衡损耗:
如果老是对着同一个nandflash的物理块进行擦除、读写操作,就坏导致这个物理块成为一个坏块。
UBI中擦除会连同保存了UBI的物理与逻辑映射关系的VID header一同擦除
但是EC header是保留的
这样每一次擦除都会断开物理块(P1)与逻辑块之间(L1)的映射关系,假如我现在向逻辑块L1中写数据,系统会根据EC头中擦除次数去找一个物理块,然后建立映射关系。
这样就避免了对同一个物理块操作次数过多
在建立逻辑块与物理块的映射时,ubi会从所以得未进行映射的物理块中找出一个擦除次数最少的建立映射关系
下面看一下挂载一个ubifs文件系统的步骤:
ubiattach /dev/ubi_ctrl -m 3
1.ubiattach是将一个mtd分区关联为ubi设备,在这个过程中,会再次扫描mtd分区(全部扫描)
2.建立EBA 和EC table
3.接下来系统会去读ubi中保存的两个卷表,显然第一次的时候这两个卷表是不存在的。
4.ubi会去创建两个卷表,然后初始化之。一般是我们mtd设备的前两个擦除块
(leb0 和 leb1)
5.接下来会创建一个后台进程,然后唤醒它,这个进程干什么的呢?它会进行物理块擦除的工作
创建卷:
ubimkvol /dev/ubi0 -N ubifs -s 15MiB
在ubi函数是调用了ubi_create_volume
前面我们讲一个mtd设备关联为ubi设备,在一个mtd设备中可以创建好多的volume
在创建一个volume的同时,要将volume table中对应位进行更新
挂载:
mount -t ubifs ubi0:ubifs /mnt
次数(yaffs) 读速度(block2到sdram) 写速度(sdram到block2)
1 11.59s 50.67s
2 10.79s 50.65s
3 11.10s 50.09s
平均 11.16s(1.245MB/S) 50.47s(282.02KB/S)
次数(ubifs) 读速度 写速度
1 9.26s 33.95s
2 7.44s 32.87s
3 7.80s 34.06s
平均 8.17s(1.7MB/S) 33.63s(423.24KB/S)
ubi层次的更多相关文章
- Linux ubi子系统原理分析
本文思维导图总纲: 综述 关于ubi子系统,早已有比较正式的介绍,也提供非常形象的介绍ubi子系统ppt 国内的前辈 alloysystem 不辞辛劳为我们提供了部分正式介绍的中文译文,以及找不到原文 ...
- 挑子学习笔记:BIRCH层次聚类
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/6129425.html 本文是“挑子”在学习BIRCH算法过程中的笔记摘录,文中不乏一些个人理解,不当之处望 ...
- 根据异常处理对 Java 方法的层次分类
我根据异常处理对 Java 的方法分为三个层次:1.执行层,2. 处理层,3. 调用层. 执行层方法只抛出异常 throws Exception,是作为代码的基层操作者,可能有多个层次. 处理层方法使 ...
- lintcode二叉树的锯齿形层次遍历 (双端队列)
题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- 【转】Windows 窗口层次关系
原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...
- SQL Server 2008 R2——以特定符号出现的次数来判断当前内容所在的层次
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- Linux UBI子系统设计初探
问题领域 flash存储设备存在如下特点: 存在坏块 使用寿命较短 存储介质不稳定 读写速度慢 不支持随机访问(nand) 只能通过擦除将0改成1 最小读写单位为page or sub-page 便宜 ...
- WAF攻防研究之四个层次Bypass WAF
从架构.资源.协议和规则4个层次研究绕过WAF的技术,助于全方位提升WAF防御能力. 绕过WAF的相关技术研究是WAF攻防研究非常重要的一部分,也是最有趣的部分,所以我在写WAF攻防时先写攻击部分.还 ...
随机推荐
- js实现2048小游戏
这是学完javascript基础,编写的入门级web小游戏 游戏规则:在玩法规则也非常的简单,一开始方格内会出现2或者4等这两个小数字,玩家只需要上下左右其中一个方向来移动出现的数字,所有的数字就会想 ...
- Quartus ModelSim联合仿真中的RAM初始化
Modelsim只支持Hex格式的初始化文件,文件需要放在仿真的根目录下,例如:.\simulation\modelsim:并且在利用Quartus宏生成IP时,选择的初始化文件必须用绝对路径!否则M ...
- bzoj 1798 维护序列seq 线段树
裸的线段树,注意标签下放就行了 多么痛的领悟,一定要开int64 /************************************************************** Pro ...
- 如何使用SDK在Ubuntu设备(包括仿真器和桌面)上运用应用程序
简介 有三种运行通过SDK创建的应用程序的方式:在桌面上,在联网的Ubuntu设备上,以及在仿真器中.这些方式为互补性方式,因为各有优缺点.您首先将了解如何管理SDK的设备类型,以及哪一个类型用于测试 ...
- nginx启动脚本(class练习)
说明:使用类的方式编写程序启动脚本(练习) 1 #!/usr/bin/env python import sys import os from subprocess import Popen,PIPE ...
- zhudongfangyu.exe进程是360主动防御进程,用来监控电脑系统,防止电脑病毒出现并阻止病毒或木马的安全进程
zhudongfangyu.exe进程是360主动防御进程,用来监控电脑系统,防止电脑病毒出现并阻止病毒或木马的安全进程
- appium===元素定位
一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tools目录下 monitor:Android SDK自带的一个工具,在tools目录下 Appium Ins ...
- Linux下的Backlight子系统(二)【转】
转自:http://blog.csdn.net/weiqing1981127/article/details/8515847 版权所有,转载必须说明转自 http://my.csdn.net/weiq ...
- wscript运行js文件
wscript运行js文件 http://www.cnblogs.com/jxgxy/archive/2013/09/20/3330818.html wscript运行js文件 wscript ad ...
- XML解析代码
import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.LinkedLi ...