转自:http://www.cnblogs.com/wahaha02/p/4814698.html

flash存储设备存在如下特点:

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

针对flash设备的特点,flash文件系统的核心功能需求和质量需求需包括如下这几个方面:

  • 读写
  • 性能
  • 可靠性
  • 持久性

针对这些需求,可分析得出flash文件系统需要满足如下属性要求:

  • 数据保护
  • 坏块管理
  • 垃圾回收
  • 磨损均衡
  • 分区管理
  • 文件管理
  • 性能优化

在ubifs文件系统中,这7条属性中的数据保护、坏块管理、垃圾回收、磨损均衡、分区管理等需求由ubi子系统实现,也是此次分析的重点。

架构模型

ubi是ubifs的一个子系统,其位于MTD之上,ubifs之下,如图所示。

ubi子系统内部又细分多个模块(如下),每个模块后面逐个展开介绍。

其设计架构如下:

为了管理架构栈中的各个子系统,ubi在用户态导出多个控制接口,以便于对模型进行控制管理。
/dev/mtd0:
  mtd对象,对mtd设备操作的实体
/dev/ubi_ctrl:
  ubi控制对象,用于ubi与mtd的映射与解映射(attach and detach)
/dev/ubi0:
  ubi 抽象层对象,对ubi操作的实体
/dev/ubi0_0:
  ubi volume对象,对ubi volume操作的实体

UBI数据模型

数据是建模和设计的核心,UBI有2个顶层数据对象:ubi_attach_info和ubi_volume_desc。其数据关系模型如下:

UBI数据持久化设计

因为磨损均衡、逻辑块管理、分卷管理等需要,ubi自身支持这些功能的元数据需要持久化存储,如:块擦除次数、LEB/PEB映射、volume/LEB映射、分卷表、fastmap等数据,具体的数据结构有:

OOB
ubi_ec_hdr - UBI erase counter header
ubi_vid_hdr - on-flash UBI volume identifier header
ubi_vtbl_record - a record in the volume table.
ubi_fm_sb - UBI fastmap super block
ubi_fm_hdr - header of the fastmap data set
ubi_fm_scan_pool - Fastmap pool PEBs to be scanned while attaching
ubi_fm_ec - stores the erase counter of a PEB
ubi_fm_volhdr - Fastmap volume header
ubi_fm_eba - denotes an association beween a PEB and LEB

其中ubi_ec_hdr、ubi_vid_hdr、ubi_vtbl_record、OOB的数据结构定义、存储位置和数据示例如下:

ubi_ec_hdr,存放在每个PEB(1MB)的page 0,每个page(8K)一段OOB(0x1C0);

ubi_vid_hdr,对于已分配到volume中的PEB,vid hdr存放在PEB page 1(8K) or page 0 sub-page 1(2K);

ubi_vtbl_record,作为UBI_LAYOUT_VOLUME_ID的数据,LEB0,LEB1相互备份,从PEB的page 2 开始存放。

每个PEB块有个OOB区,OOB前面几个字节是坏块标记(橙色标示),尾部一段字节为ECC数据(绿色标示),如果中间有多余字节,则闲置不用(黄色标示)。各段的大小依赖于页格式、ecc位数、各flash厂商定义的坏块标记形式而定。

UBI attaching子系统

attaching子系统的核心任务就是创建并初始化ubi设备,其核心数据是ubi_attch_info对象,对照上一节的数据模型,这个过程包括创建ubi_ainf_volume对象;扫描所有PEB的ec header和vid header,读取OOB区坏块标记,统计坏块个数,初始化ai->bad_peb_count;如果attaching时PEB的ec header为无效值,此时会有平均的ec值初始化其ec header;如果发现2个PEB具有相同的lnum,选用seqnum大的PEB,seqnum小的PEB放入 ai->erase链表。

校验每个块的ec header、vid header和data,并对其错误类型进行分类,对可纠正的错误,放入ai->erase表,对于无法纠正的错误,放入ai->corr或ai->alien表;对于没有错误的块,放入ai->free表。具体分类规则请参照下表。

错误类型:

  • UBI_IO_FF: 全0xFF;
  • UBI_IO_FF_BITFLIPS: 全0xFF,但是有可纠正的ECC错误;
  • UBI_IO_BAD_HDR: EC或VID头损坏(如magic number错误或者CRC错误)
  • UBI_IO_BAD_HDR_EBADMSG: 由不可纠正的ECC错误导致的EC或VID头损坏
  • UBI_IO_BITFLIPS: 有可纠正的ECC错误;

PEB分类:

  • free:正常块;
  • erase:擦除块,需要进行擦除;
  • corr:损坏块,不再参与磨损均衡;
  • alien:异常块,不再参与磨损均衡;
  • scrub:擦洗块,数据搬移到正常快上,并对其进行擦除,确认没有问题;
  • torture:拷问块,数据搬移到正常快上,并对其反复多次读写擦除,确认没有问题;

UBI EBA子系统

EBA子系统主要提供如下功能:

  • LEB/PEB的映射表管理:上层只看到LEB,不再关心块的读写错误处理、替换等细节;
  • LEB的sequence counter管理:seq counter主要是为了标记顺序,解决LEB/PEB的映射冲突;
  • LEB访问接口封装:如read, write, copy, check, unmap, atomic change等;
  • LEB访问保护:每一个LEB的并发访问都由读写信号量锁rwsem进行保护;

EBA提供了2种写方式:ubi_eba_write_leb和ubi_eba_atomic_leb_change。ubi_eba_write_leb用于对块的write,ubi_eba_atomic_leb_change用于对块的modify或者append。ubi_eba_write_leb写后会做读校验,如果有-EIO错误,将老PEB上的数据移动到新的PEB上,并将新数据也写到新的PEB中,对老PEB进行torture。ubi_eba_atomic_leb_change为了避免破坏已有数据,采用异地更新的方式来实现原子写,并加一个ubi->alc_mutex来进行串行化保护,其具体流程如下:

  1. 读取leb数据(ubifs内完成)
  2. 检查写数据长度是否为0,为0时,unmap leb
  3. 分配初始化vid_hdr
  4. 分配新的peb(ubi_wl_get_peb)
  5. 新peb中写入vid_hdr
  6. 新peb中写入老leb数据+新增数据
  7. 回收老的peb(ubi_wl_put_peb)
  8. 更新leb map(vol->eba_tbl)

UBI wear-leveling子系统

磨损均衡是UBI的核心功能之一,负责管理PEB的分配、回收、擦除、scrub、磨损均衡等。其中scrub、擦除, 磨损均衡功能由UBI后台线程进行异步调度管理。
UBI磨损均衡基于PEB的擦除次数实现,采用静态磨损均衡策略。对于静态磨损均衡,建立在如下假设上:擦除次数(ec)少的PEB比擦除次数多的PEB稳定,将ec大的PEB数据交换到ec小的PEB上,达到磨损均衡的目的。

PEB的分配、回收、擦除、scrub都会触发磨损均衡检查。为了避免频繁磨损均衡,进一步加重磨损情况,磨损均衡的触发频率通过UBI_WL_THRESHOLD控制,UBI_WL_THRESHOLD值不宜太小。但这种策略也存在一些问题,为了避免极端情况下对某些特定块反复擦除,通过磨损均衡_FREE_MAX_DIFF (2*UBI_WL_THRESHOLD)来控制挑选最坏的free PEB范围。

根据attaching时的PEB分类,磨损均衡模块初始化时,启动对erase块的擦除,对torture块的拷问,构建磨损均衡块红黑树,scrub红黑树等。PEB的分配通过ubi_wl_get_peb接口实现,分配具有平均擦除次数的free PEB。PEB的回收通过ubi_wl_put_peb接口实现,回收后调度erase_worker擦除。

UBI IO子系统

IO子系统主要为上层模块提供统一的读写接口,这主要包含:

PEB读写接口的统一封装,包括mtd read/write 封装;参数检查;读写检查(read io check, write verify check), 通过ubi->dbg.chk_io控制,默认没有使能。
ubi ec/vid hdr的读写接口的统一封装,包括有效性验证;支持非对齐存储;支持vid存于sub-page。

UBI fastmap子系统

缩短ubi初始化(attach)时间,使attach时间复杂度是个常数,不随PEB个数成线性增长。(Experimental feature,产品中暂未使能,未研究)

参考资料

Linux kernel 3.14-rc6 source code
http://en.wikipedia.org/wiki/Wear_leveling
www.linux-mtd.infradead.org

--EOF--

Linux UBI子系统设计初探相关推荐

  1. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书

    缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...

  2. 【转】 linux iio子系统

    原文网址:http://blog.csdn.net/tsy20100200/article/details/47101661 最近由于工作的需要,接触了Linux iio子系统,对于这个目录其实以前是 ...

  3. Linux时间子系统之三:时间的维护者:timekeeper

    专题文档汇总目录 Notes: 原文地址:Linux时间子系统之三:时间的维护者:timekeeper 本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法 ...

  4. 深入理解Linux调度子系统

    hi,大家好,这里是极客重生. CPU调度是Linux内核中最重要的子系统,它主要提供对CPU的访问控制.因为在计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,所以LInux内核实现 ...

  5. Linux网络子系统

    今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次 ...

  6. 漫画-Linux中断子系统综述

    1.中断引发的面试教训 2.什么是中断? 中断: (英语:Interrupt)指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程. 即在程序运行过程中,系统出现了一个必须由 ...

  7. linux 驱动 (2)---Linux input子系统最清晰、详尽的分析

    Linux input子系统最清晰.详尽的分析 Linux input分析之二:解构input_handler.input_core.input_device 输入输出是用户和产品交互的手段,因此输入 ...

  8. Linux中断子系统

    首先感谢原文作者 LoyenWang 的分享,可以点击章节阅读原作者原文,或者查看本文的转载地址,再次感谢原作者分享,已经在公众号上征得作者同意. 说明: Kernel版本:4.14 ARM64处理器 ...

  9. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

最新文章

  1. 【spring】专项配置文件的使用
  2. SAP WM 2-Step Picking的TO单据特殊的地方
  3. Excel35招必学秘技
  4. OS_CORE.C(1)
  5. android的logcat详细用法
  6. 使用Boost_MPI进行并行编程
  7. 红帽 jboss_红帽峰会2015所需的JBoss BPM内容指南
  8. 从setTimeout,onclick传参看js函数作为参数
  9. 百度MIP移动页面加速——不只是CDN
  10. 你见过工资高的程序员炫富 来7拍一下
  11. ad中电容用什么封装_【AD封装】VH3.96mm插件座子(带3D)
  12. 服装管理解决方案丨汇信
  13. Vue Canvas 实现电子签名 手写板
  14. 迅雷没有做错什么,只是用户不需要了
  15. 如何使用EXCEL连接数据库,获取数据
  16. solidworks有限元分析_新手学习心得体会
  17. 全网最全测试工程师 学习网站汇总(测试必备 抓紧收藏)
  18. 聚合数据API用法简介
  19. 梦三国服务器维护多久,《梦三国2》天命地图开启时间变更公告
  20. 微信小程序 action-sheet组件 + 分享代码实现

热门文章

  1. 什么是亚马逊关联?亚马逊关联应该如何防范
  2. Python3.5——字典的使用
  3. linux系统查看HBA光线卡WWN号
  4. Android12系统上支持Android手机的usb网络共享
  5. 深入解析:如何修复SSL / TLS握手失败错误(中)
  6. I love Java(2)
  7. 磁带与磁盘备份系统的优劣点比较
  8. SharePoint 2010:初试之安装
  9. 74LS164 for stm32 源码下载
  10. DataReader使用