DOC学习之TrueFFS

TrueFFS原理

引用TrueFFS原理及其在CF卡上的实现的部分内容
“1
Wear-Leveling

闪速存储器不能无限次重复使用。它的每个扇区的擦除次数虽然很大,但却有限;因此,随着使用次数的加长,它最终会变成只读状态,所以应该尽最大可能延长它的寿命。行之有效的方法就是平衡使用所有的存储单元,而不让某一单元过度使用。这种技术被称之为损耗均衡。TrueFFS使用一种基于一张动态维护表的存储器——块映射的翻译系统来实现损耗均衡技术。当块数据被修改、移动或碎片回收后,这张维护表会自动调整。然而,如果存储在Flash上的一些数据本质上是静态的,就会产生静态文件锁定问题。存储这些静态数据的区域根据不会被轮循使用,其它区域就会被更频繁地使用,这将降低Flash期望的生命值。TrueFFS通过强制转移静态区域的方法成功克服了静态文件锁定问题。因为映射表是动态的,TrueFFS能够以对文件系统不可见的方式转移这些静态数据区域。由于绝对强制损耗均衡方式会对性能产生一些负面影响,所以TrueFFS采取了一种非绝对损耗均衡算法。它保证了所有空间的使用近似平等而不影响性

能。

2 碎片回收

块数据的修改使得Flash的一些块区域中的数据不再有效,并且这些区域在擦除之前变得不可写。如果没有机制来回收这些区域,Flash很快就会变成只读的状态了。不幸的是由于这些块不可能单独擦除,回收这些块就有些复杂了。单次擦除被限制在一个叫作擦除单元的较大范围内,如对于AMDAm29LV065D芯片来说是64KBTrueFFS使用一种被称为碎片回收的机制来回收那些不再包含有效数据的块。该机制从一个预擦除单元内复制所有的有效数据块到另一个新的被称为转移单元的擦除单元。然后,TrueFFS更新映射表,再擦除这个废旧的预擦除单元。这样,原来的块出现在外界时仍然包含了原来的数据,虽然这些数据现在已经存放在Flash存储器的其它空间。

碎片回收算法会找到并回收与下面标准最吻合的擦除单元:

废块最多;

擦除次数最少;

最静态的区域。

3 块分配和关联数据集结

为了提高数据的读取效率,TrueFFS使用一种灵活的空间分配策略:将关联的数据(如由同一个文件的内容组成的多个块)集结到同一个单独擦除单元内的一段连续的区域中。为此,TrueFFS尽量在同一个擦除单元内维持一个由多个物理上连续的自由块组成的存储池。如果这样连续的存储池无法实现,TrueFFS分尽量保证池中的所有块是在同一个擦除单元内。如果连这样的情况也不可能的话,TrueFFS会尽量把块池分

配到一个拥有最多可用空间的擦除单元内。这种集结关联数据的途径有几个好处。首先,如果TrueFFS必须从一个小的存储窗口来访问Flash,那么这样集结了的关联数据可以减少调用映射物理块到该窗口的次数,加快了文件继续访问速度。其次,这种策略可以减少碎片的产生。这是因为删除一个文件可以释放掉更容易回收的完整块,意味着碎片回收会变得更快。另外,它可以使属于静态文件的多个块存放在同一地址,这样当损耗均稀算法决定移动静态区域时,转移这些块就变得更加容易了。

4 Power Failure Management

Flash写数据有时可能会出错,比如在响应文件系统写请求时、碎片回收期间甚至在TrueFFS格式化或擦除Flash时。在这些情况下,TrueFFS能够从错误中恢复过来;但在新数据第一次写入Flash时如果出错就会丢失这些数据。然而,TrueFFS非常仔细地保证所有已经存放在Flash上的数据是可恢复的,甚至能够避免用户由于不耐烦或好奇而猛地拔出Flash卡而可能造成的灾难性后果。

TrueFFS algorithms based on “erase after write” instead of"erase before write"健壮的关键是它使用了一种先写后擦的策略。当更新Flash一个扇区的数

据时,只有在更新操作完成并且新存储的数据校验成功后,先前的数据才会被允许擦掉。这样的结果是数据扇区不能处于部分写状态。操作成功的话新扇区的数据有效,否则老扇区的数据有效。很明显,这样有利于用户已经写到Flash上的数据的稳定性

       看到这里,想起以前编程序使用的ISD5116,当时也是考虑到使用的频率问题,做的是绝对均衡,不过看看这篇文章,深有同感。

 

CF卡是一种基于Flash技术的容量大、携带方便的存储介质,已在嵌入式系统等领域得到广泛的应用;但是,有限的擦写次数极大地限制了CF卡的使用寿命。TrueFFS通过一系列算法,能够延长CF卡的使用寿命,提高CF卡的使用效率。文章介绍了TrueFFS的原理,在CF卡上实现TrueFFS的方法,并对TrueFFS的性能进行了分析。

    关键词:TrueFFS损耗均衡 闪速存储器 CF

闪速存储器最大的一个缺点就是寿命有限。可擦除的次数因芯片厂商而有所不同,一般都在1万~10万次左右。为了延长闪速存储器的寿命,提高使用效率,Msystems公司推出了TrueFFS系统。它为种类繁多的闪速存储器提供了统一的块设备接口,并且具有可重入、线程安全的特点;支持大多数流行的CPU架构,如PowerPC、MIPS、ARM、X86、68K等。

由于个性鲜明的闪速存储器越来越受到嵌入式系统工程师的青睐,业界流行的嵌入式实时操作系统VxWorks已将TrueFFS作为自身的一个可裁减的模块。目前该模块的版本为2.0,支持Intel、AMD、Toshiba、Fujitsu等厂家生产的大多数型号的闪速存储器和Flash卡,用户只需要更改少量代码,甚至可直接调用;但是,该模块对如今风靡的CF卡缺乏支持。

CF卡采用了Flash技术。形象地说,CF卡就是由若干片闪速存储器外加一个管理器组成;但是,CF卡具有携带方便、易于升级、存储量大、抗震性好、兼容性佳等优点。目前,CF卡标准已经达到1.4版本,容量从最早的2MB到现今的1GB。然而,有限的擦写闪数是闪速存储器遗传给CF卡的先天缺陷。本文介绍如何在CF上实现TrueFFS系统,硬件平台以PowerPC处理器(MPC8250,Motorola公司)为CPU,嵌入式操作系统是VxWorks。

1TrueFFS的结构

TrueFFS本身并不是一个文件系统,需要在TrueFFS之上加载DOS文件系统才能使用,否则毫无意义。TrueFFS屏蔽了下层存储介质的差异,为开发者提供了统一的接口方式。应用程序对存储设备的读写就对像对拥有DOS文件系统的磁碟设备的操作一样。

如图1所示,TrueFFS由1个核心层和3个功能层组成:编译层、MTD层(MemoryTechnoilogy Driver)、Socket层。

翻译层主要实现TrueFFS和DOS文件系统之间的高级交互功能,管理文件系统和Flash中各物理可擦块的关系,以及TrueFFS中各种智能化处理功能,例如块映射、损耗均衡(wear-leveling)等。目前有三种不同的翻译层模块可供选择。选择哪一种模块要根据使用的Flash介质采用NOR技术、还是NAND技术,或者SSFDC技术而定。

MTD层实现对具体的Flash进行读、写、擦、ID识别、映射等驱动,并设置与Flash密码相关的一些参数。VxWorks的TrueFFS已经包括了支持Intel、AMD、Toshiba等厂商的大多数Flash芯片的MTD层驱动。新的器件需要编写新的MTD层驱动。

Socket层提供了TrueFFS和硬件之间的接口服务,负责电源管理、检测设备插拔、硬件写保护、窗口管理和向系统注册Socket等。

核心层将其它三层有机结合起来,处理全局问题,例如信息量、计时器、碎片回收和其它系统资源等。

我们最关心的是MTD层和Socket层。VxWorks只提供了编译后的二进制形式的核心层和翻译层驱动。在实现TrueFFS应用之间,先介绍一下TrueFFS的原理。

2 TrueFFS原理

2.1 损耗均衡

闪速存储器不能无限次重复使用。它的每个扇区的擦除次数虽然很大,但却有限;因此,随着使用次数的加长,它最终会变成只读状态,所以应该尽最大可能延长它的寿命。行之有效的方法就是平衡使用所有的存储单元,而不让某一单元过度使用。这种技术被称之为损耗均衡。TrueFFS使用一种基于一张动态维护表的存储器——块映射的翻译系统来实现损耗均衡技术。当块数据被修改、移动或碎片回收后,这张维护表会自动调整。

然而,如果存储在Flash上的一些数据本质上是静态的,就会产生静态文件锁定问题。存储这些静态数据的区域根据不会被轮循使用,其它区域就会被更频繁地使用,这将降低Flash期望的生命值。TrueFFS通过强制转移静态区域的方法成功克服了静态文件锁定问题。因为映射表是动态的,TrueFFS能够以对文件系统不可见的方式转移这些静态数据区域。由于绝对强制损耗均衡方式会对性能产生一些负面影响,所以TrueFFS采取了一种非绝对损耗均衡算法。它保证了所有空间的使用近似平等而不影响性能。

2.2 碎片回收

块数据的修改使得Flash的一些块区域中的数据不再有效,并且这些区域在擦除之前变得不可写。如果没有机制来回收这些区域,Flash很快就会变成只读的状态了。不幸的是由于这些块不可能单独擦除,回收这些块就有些复杂了。单次擦除被限制在一个叫作擦除单元的较大范围内,如对于AMD的Am29LV065D芯片来说是64KB。

TrueFFS使用一种被称为碎片回收的机制来回收那些不再包含有效数据的块。该机制从一个预擦除单元内复制所有的有效数据块到另一个新的被称为转移单元的擦除单元。然后,TrueFFS更新映射表,再擦除这个废旧的预擦除单元。这样,原来的块出现在外界时仍然包含了原来的数据,虽然这些数据现在已经存放在Flash存储器的其它空间。

碎片回收算法会找到并回收与下面标准最吻合的擦除单元:

①废块最多;

②擦除次数最少;

③最静态的区域。

2.3 块分配和关联数据集结

为了提高数据的读取效率,TrueFFS使用一种灵活的空间分配策略:将关联的数据(如由同一个文件的内容组成的多个块)集结到同一个单独擦除单元内的一段连续的区域中。为此,TrueFFS尽量在同一个擦除单元内维持一个由多个物理上连续的自由块组成的存储池。如果这样连续的存储池无法实现,TrueFFS分尽量保证池中的所有块是在同一个擦除单元内。如果连这样的情况也不可能的话,TrueFFS会尽量把块池分配到一个拥有最多可用空间的擦除单元内。

这种集结关联数据的途径有几个好处。首先,如果TrueFFS必须从一个小的存储窗口来访问Flash,那么这样集结了的关联数据可以减少调用映射物理块到该窗口的次数,加快了文件继续访问速度。其次,这种策略可以减少碎片的产生。这是因为删除一个文件可以释放掉更容易回收的完整块,意味着碎片回收会变得更快。另外,它可以使属于静态文件的多个块存放在同一地址,这样当损耗均稀算法决定移动静态区域时,转移这些块就变得更加容易了。

2.4 错误恢复

向Flash写数据有时可能会出错,比如在响应文件系统写请求时、碎片回收期间甚至在TrueFFS格式化或擦除Flash时。在这些情况下,TrueFFS能够从错误中恢复过来;但在新数据第一次写入Flash时如果出错就会丢失这些数据。然而,TrueFFS非常仔细地保证所有已经存放在Flash上的数据是可恢复的,甚至能够避免用户由于不耐烦或好奇而猛地拔出Flash卡而可能造成的灾难性后果。

TrueFFS健壮的关键是它使用了一种“先写后擦”的策略。当更新Flash一个扇区的数据时,只有在更新操作完成并且新存储的数据校验成功后,先前的数据才会被允许擦掉。这样的结果是数据扇区不能处于部分写状态。操作成功的话新扇区的数据有效,否则老扇区的数据有效。很明显,这样有利于用户已经写到Flash上的数据的稳定性。

3 编程

TrueFFS的编程主要在MTD层和Socket层。首先必须在当前VxWorks生成目录的配置文件(config.h)中定义:INCLUDE_TFFS(包含TrueFFS系统)、和INCLUDE_TFFS_SHOW(包含TrueFFS系统的显示函数)。

3.1 翻译层

翻译层根据Flash的实现技术来选择。设计中选用了SST公司的型号为SST49CF064的CF卡,64MB容量。它是基于NAND的Flash技术,所以在文件中定义INCLUDE_TL_NFTL;如果是NOR技术,则定义INCLUDE_TL_FTL。

3.2MTD

文件cfCardMTD.c实现了MTD层的功能。在本设计中,MTD层主要实现4个函数:读、写、擦除和ID识别。

ID识别函数根据读取设备的ID号来选择与当前设备匹配的MTD驱动。识别函数中指定了针对当前设备的一些参数以及基本操作函数,并赋给一个叫FLFlash的数据结构。

FLStatus cfMTDIdentify(FLFlash*pVol);

数据结构中的主要参数赋值如下:

pVol->type=CF_ID; /*器件ID号*/

pVol->erasableBlockSize=512;/*可擦除的最小单元是512B*/

pVol->chipSize=0x4000000;/*器件容量为64MB*/

pVol-write=cfWriteRoutine;/*写函数*

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装 sql server 2005 com+ 目录要求警告 解决方案

用法: 创建记事本,然后改后缀名为.bat echo off setlocal echo %WINDIR%\System32\msdtc.exe -uninstall %WINDIR%\System32\msdtc.exe -uninstall call :delkey "HKCR\CID" call :delkey "HKLM\SYSTEM\CurrentControlSet\Serv…

神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(Matplotlib绘图基础<1>python)

数据可视化 数据分析阶段:理解和洞察数据之间的关系 算法调试阶段:发现问题,优化算法 项目总结阶段:展示项目成果 Matplotlib: 第三方库,可以快速方便地生成高质量的图表 安装Matplotlib库 Figure 对…

Linux 定时器设置

函数alarm设置的定时器只能精确到秒&#xff0c;而以下函数理论上可以精确到微妙&#xff1a; #include <sys/select.h> #include <sys/time.h> int getitimer(int which, struct itimerval*value); int setitimer(int which, const structitimerval *value, s…

idea lombok不生效_Spring Boot 集成 Lombok 让代码更简洁!

点击上方“Java之间”&#xff0c;选择“置顶或者星标”你关注的就是我关心的&#xff01;作者&#xff1a;Anoyi lombok的威力简化代码IntelliJ IDEA安装lombok插件1、菜单栏 File > Settings > Plugins > Browse repositories…安装插件2、搜索 Lombok Plugin 安装后…

IT人转型做技术型销售到底行不行

想想自己已经做了八年的销售了&#xff0c;说不上很成功自己也算满意&#xff0c;多多少少有一些相关的经验。如果有刚刚入行或者即将入行的朋友愿意从一个过来人的视角着手去对这个行当多一些了解&#xff0c;我乐于慢慢码字出来与大家分享。 对很多职业来说&#xff0c;足够的…

arcgis按属性设置符号大小

一般都在高级设置里&#xff0c;以下是两个示例 1.相同颜色&#xff0c;不同大小 2不同颜色&#xff0c;不同大小

3648

/* 2SAT,找出一组解 逆缩图序&#xff0c;拓扑排序&#xff0c;然后染色。 找出和新娘颜色相同的点 */// include file #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <ctime>#i…

druiddatasource配置_Spring核心配置文件详解

点击蓝字“程序员考拉”欢迎关注&#xff01;1&#xff1a;spring的核心配置文件中的各种配置。 spring的核心配置文件的名字 叫做 applicationContext.xml&#xff0c;后期也可以通过配置文件中的配置修改名称&#xff0c;在web.xml中进行如下配置&#xff1a;<contex…

Linux两种定时器

Linux下的定时器有两种&#xff0c;以下分别介绍&#xff1a;     1、alarm     如果不要求很精确的话&#xff0c;用alarm&#xff08;&#xff09;和signal&#xff08;&#xff09;就够了     unsigned int alarm&#xff08;unsigned int seconds&#xff09;   …

origin(1)

origin窗口结构与布局 工作表 0.数据导入 0.1直接拖拽 0.2导入 配置相关参数 1.添加新列 1.1方法一 1.2方法二 2.设置x&#xff0c;y&#xff0c;z 2.1设置单列 2.2设置多列 2.3设置无关列 2.4设置误差线 2.5设置为标签 3.长短名称设置 3.1长名称设置 3.1.1方法一 3.1.2方…

Access 时间比较错误

原因 selete * from tab1 where addate>2010-12-24 14:07:44 拼接的时候改成 datetime dt datetime.now(); string sql "selete * from tab1 where addate>#"dt"#"; 把号换成#好就好了&#xff01;&#xff01;&#xff01;&#xff01;转载于:https…

神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(Matplotlib绘图基础<散点图>python)

散点图&#xff08;Scatter&#xff09;&#xff1a; 是数据点在直角坐标系中的分布图 scatter() 函数 marker参数——数据点样式 添加文字——text() 函数 坐标轴设置 增加图例 绘制标准正态分布的散点图步骤 #散点图&#xff08;Scatter&#xff09;&#xff1a;是数据点在直…

十字路口红绿灯plc程序_实例讲解红绿灯PLC程序设计方法

十字路口的交通指挥信号灯布置如下图&#xff1a;一、控制要求&#xff08;1&#xff09;信号灯系统由一个启动开关控制&#xff0c;当启动开关接通时&#xff0c;该信号灯系 统开始工作&#xff0c;当启动开关关断时&#xff0c;所有信号灯都熄灭。&#xff08;2&#xff09;南…

listview刷新_Flutter NestedScrollView 滑动折叠头部下拉刷新效果

题记—— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精。Flutter是谷歌推出的最新的移动开发框架。本实例运行效果如下 &#xff1a;//启动函数void main() { runApp(RootApp());}//根目录class RootApp extends StatelessWidget { ov…

神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)

折线图&#xff08;Line Chart&#xff09;&#xff1a; 散点图的基础上&#xff0c;将相邻的点用线段相连接 plot()函数 #折线图&#xff1a;在散点图的基础上将相邻两个点链接 #描述变量变化的趋势 #plot(x,y,color,marker,label,linewidth,markersize) #x数据点的x坐标 #y…

WinCE6.0的EBOOT概要

为一个新的硬件设备定制WinCE6.0操作系统&#xff0c;一般需要完成以下几个主要步骤&#xff1a; 1. 针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP)&#xff0c;BSP必须包括BOOTLOADER、OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动。…

Silverlight HTML5 Flash - RIA技术之三足鼎立

未来&#xff0c;“用户体验”将成为所有软件商业价值的首要衡量标准。拥有极好用户体验的RIA(富互联网应用)技术近些年来发展迅猛&#xff0c;其中以Silverlight、HTML5及Flash最受热捧。纵观&#xff0c;互联网上98%的计算机都有安装Flash&#xff1b;HTML5的新特性则强化了W…

将经纬度转换为以度为单位的xy坐标

(LEFT(A2,FIND("",A2)-1))MID(A2,FIND("",A2)1,FIND("′",A2)-FIND("",A2)-1)/60MID(A2,FIND("′",A2)1,FIND("″",A2)-FIND("′",A2)-1)/3600 (LEFT(B2,FIND("",B2)-1))MID(B2,FIND("&…

python i开发工具_Python轻量级开发工具Genay使用

Genay是一个轻量级的免费&#xff0c;开放源代码的开发工具&#xff0c;支持很多的文件类型&#xff0c;并且支持很多的插件&#xff0c;启动快速。安装包只有十几兆&#xff0c;相比pycharm专业版需要收费&#xff0c;并且社区版的安装包大小有两百多兆&#xff0c;对于python…

wince 常见问题 1

1 在mediaplayer全屏播放的时候&#xff0c;我可以用键盘上的某一个键调节声音大小&#xff0c;现在我想在屏幕上显示调节的结果就跟我们看电视一样能出来一些标记。当声音变大在屏幕上就增多&#xff0c; 当声音变小的时候就减少 得到播放窗口的DC&#xff0c;然后在上面显示…