转: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层次的更多相关文章

  1. Linux ubi子系统原理分析

    本文思维导图总纲: 综述 关于ubi子系统,早已有比较正式的介绍,也提供非常形象的介绍ubi子系统ppt 国内的前辈 alloysystem 不辞辛劳为我们提供了部分正式介绍的中文译文,以及找不到原文 ...

  2. 挑子学习笔记:BIRCH层次聚类

    转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/6129425.html 本文是“挑子”在学习BIRCH算法过程中的笔记摘录,文中不乏一些个人理解,不当之处望 ...

  3. 根据异常处理对 Java 方法的层次分类

    我根据异常处理对 Java 的方法分为三个层次:1.执行层,2. 处理层,3. 调用层. 执行层方法只抛出异常 throws Exception,是作为代码的基层操作者,可能有多个层次. 处理层方法使 ...

  4. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  5. Oracle层次查询

    Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...

  6. 【转】Windows 窗口层次关系

    原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...

  7. SQL Server 2008 R2——以特定符号出现的次数来判断当前内容所在的层次

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  8. Linux UBI子系统设计初探

    问题领域 flash存储设备存在如下特点: 存在坏块 使用寿命较短 存储介质不稳定 读写速度慢 不支持随机访问(nand) 只能通过擦除将0改成1 最小读写单位为page or sub-page 便宜 ...

  9. WAF攻防研究之四个层次Bypass WAF

    从架构.资源.协议和规则4个层次研究绕过WAF的技术,助于全方位提升WAF防御能力. 绕过WAF的相关技术研究是WAF攻防研究非常重要的一部分,也是最有趣的部分,所以我在写WAF攻防时先写攻击部分.还 ...

随机推荐

  1. 【数据结构】bzoj1651专用牛棚

    Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will onl ...

  2. Idea导入的工程看不到src等代码

    问题描述: 从其他地方拷贝过来的工程,在本地导入到idea中时,展示如下的页面,里面的其他文件都看不到. 解决办法:(不知道是具体的什么原因引起的) 1. 关闭IDEA, 2.然后删除项目文件夹下的. ...

  3. 【poj3693-重复次数最多的连续重复子串】后缀数组

    题意:给定一个串,长度<=10^5,求它重复次数最多的连续重复子串(输出字典序最小的那个). 例如ccabcabc,答案就是abcabc 一开始没想清楚,结果调了好久. 原理: 按照L划分,因为 ...

  4. MyBatis系列二 之 数据库列名于程序实体类中字段名称不一致

    MyBatis系列二  之   数据库列名于程序实体类中字段名称不一致 情景:当数据库中的列名与我们程序实体类中的字段名称不一致         使用ResultMap节点配置信息  在映射文件中  ...

  5. 【FIRST USE】第一次用git把代码上传到github

    第一次使用某个东西总是充满了伤痛,我第一次用sed的时候,毁掉了我的所有源代码,第一次用git的时候一直提示不正确,后来解决了问题,便记录下来. 首先说明我的环境,我用的是虚拟机,上面运行的64位的c ...

  6. React 踩坑记录

    1.React-router error: super expression must either be null or a function 原因:引入babel后写ES6风格的代码: class ...

  7. C#区分大小写

    连属性也是要区分大小写的,如 获取数据长度 错误:strs.length 这样是报错的 正确:strs.Length

  8. linux下卸载Oracle

    1.卸载数据库软件--10g[oracle]# cd /u01/app/oracle/product/10.2.0/db_1/oui/bin[oracle]# ./runInstaller -igno ...

  9. rhel5.5 linux系统下安装Oracle 11g

    一.配置环境变量1.我将环境变量配置写成了一个脚本,将这个脚本copy到一个新建的linux系统.(脚本是本人原创,前2篇文章里有,感兴趣的朋友可以去看看) 2.进入脚本所在的目录. 3.执行脚本,需 ...

  10. jQuery中操作样式

    操作行间样式 // 获取div的样式 $("div").css("width"); $("div").css("color&quo ...