Embedded Linux Primer----嵌入式Linux基础教程--2.3.1~4节--存储注意事项

来源:互联网 发布:广工数据挖掘2016 编辑:程序博客网 时间:2024/04/28 04:55

存储注意事项

嵌入式Linux开发方面最大的挑战是大多数的嵌入式系统已经限制了物理资源。虽然可能你的酷睿2的台式机的硬盘空间已经有500G,找到一个具备很小的一部分的嵌入式系统是很常见的。在许多情况下,典型的硬盘被更小的并且不太贵的非易失性存储器(译者:指的是当电源关闭后,所存储的数据不会消失的电脑存储器)代替。硬盘体积很大,有旋转部件,对物理冲击敏感,要求有多个电源电压,这些都导致它们是不适合很多嵌入式系统。

闪存

几乎每一个人都熟悉用在大量消费电子领域的CF卡和SD卡,例如数码相机,PDA(嵌入式系统的两个伟大的例子)。这些模块都基于Flash存储技术,能够被看作固态硬盘,拥有存储MB的能力,甚至GB的能力。他们包括不移动部件,相对崎岖的并且可以运行在一个普通的电源支持上。

有很多闪存存在,闪存在各种各样的电子格式,物理包,容量中流行起来。仅仅只有4MB或者8MB的非易失性存储器的嵌入式系统是很常见。大多对嵌入式Linux系统的存储要求在16MB到256MB之间或者更大。嵌入式Linux系统已经有GB范围的非易失性存储器了。

闪存能够在软件控制下被写入或者擦除。合理的硬件技术保持最快的写功能的媒介。闪存写和擦除的速度已经随着时间的推移快速提高了,虽然闪存写和擦除时间仍然慢。你必须知道一些在硬盘和闪存所可能使用的技术方面的基本的不同点。

闪存被分成相关的大的可擦单元,指的是可擦块。闪存的一项定义性特征是闪存内部的数据是如何被写以及擦除的。在典型的NOR 7闪存芯片中,数据能够在软件控制下从二进制1转换为二进制0并直接写到储存格的地址中,一次可以写一位或者一个字。然而,把一个位从0改回为1,必须使用一个特殊的控制指令序列擦除一个完整的擦除块到闪存芯片。

一个典型的nor闪存设备包括许多擦除块。例如,一个4MB的闪

存芯片可能包含64个擦除块,每一个擦除块占64KB。闪存同样提供非均匀擦除块大小,目的是方便灵活的布局数据存储。一般有称之为引导块或者引导扇区的闪存芯片。bootloader经常被存储在更小的块当中,内核以及其他被要求的数据被存储在更大的块中。图2-3阐明了一个典型的引导闪存的顶部的块大小布局。

图2-3 引导块闪存结构

修改存储在闪存阵列中的数据,被修改的常驻数据块必须被完整的擦除。即使一个块当中只有1个字节需要被改变,完整的块必须被擦除或者重写8。闪存块大小与传统的硬盘扇区大小相比是相对大的。相比之下,一个典型的高性能的硬盘具有512字节或者1024字节的可写扇区。明显的分支是:在闪存中更新数据所写的次数是一个硬盘的几倍,在很大程度上是由于每一次更新数据,都要有相关大量的数据必须被擦除以及写回到闪存中。在最坏的时候,写周期会花费几秒钟。

闪存的另一个限制被认为是闪存存储格的写的生命期。一个NOR闪存单元在失败之前有写入周期的限制。虽然周期数相当大(每块100000周期是典型的),很容易猜想一个设计不良的闪存存储算法(或者甚至是一个bug)能够快速销毁闪存设备。它在运行的时候不会告诉你应该避免配置你的系统日志输出到一个闪存式设备。

NAND闪存

NAND闪存是一个相对新的闪存技术。当NAND闪存进入市场,传统闪存诸如上一章节描述的NOR 闪存。这些涉及到内部闪存单元体系的区别。NAND闪存设备提供更小的块大小提高了传统(NOR)闪存的一些限制,导致更快以及更有效的写入和闪存阵列的使用。

NOR闪存设备提供了微处理器与许多外部微处理器的接口。就是说,他们有能够直接9连接到微处理器数据或地址总线的平行数据总线和地址总线。闪存阵列里的每一个字节或者字都能够以一个随机的方式被单独定位。与此相反,NAND设备能够连续地访问一个复杂的由不同的供应商提供的接口。NAND设备提供一个可操作的模式与传统硬盘和关联控制器相似。数据能够被串行脉冲访问到,并且远远小于NOR闪存块大小。NAND闪存的写周期生命期比NOR闪存有个梯度的增加,虽然擦除次数更少。

总之,NOR闪存能够直接被微处理器访问,代码能够直接在NOR

闪存外执行。(然而,基于效能考量,很少这样做,只有当系统中资源很少的时候才会那么做。)事实上,许多处理器不能缓存访问闪存,除非有DRAM。这进一步降低了执行速度。与此相反,与未经过处理的二进制可执行代码和数据存储,NAND闪存更适合文件系统格式里的大存储存储器。

闪存使用

一个嵌入式系统设计者在布局和闪存使用方面有很多选择。在最小系统中,资源没有被过度约束,未处理的二进制数据(也许被压缩过)能够存储在闪存设备中。在引导的时候,存储在闪存里面的文件系统镜像被读进Linux内存随机盘(ramdisk)块设备中,作为一个文件系统挂载并且只能通过RAM存取。对于闪存里的数据几乎不需要更新的时候这是一种很好的设计。任一内存随机盘(ramdisk)中的文件的改变在重启或者断电的时候丢失都是值得关注的。

      图2-4展示了一个普通的闪存组织结构,这是一种典型的简单嵌入式系统结构。

图2-4 典型闪存布局

bootloader经常储存在闪存阵列的顶部或者底部。在bootloader的下面,是Linuxkernel镜像以及ramdisk文件系统(译者:将在第九章详细介绍)镜像的存储空间,其中,ramdisk文件系统保存着根文件系统。典型的是,Linux kernel和radisk文件系统镜像是经过压缩的,它们在引导循环期间由bootloader执行解压缩任务。

闪存文件系统

简单闪存布局方案的限制仅仅被描述成能够通过使用闪存文件系统来管理闪存设备上的数据以类似于管理硬盘上的数据来克服。早先的闪存设备中的文件系统的实现包含一个模仿普通硬盘上的512个字节扇区布局的简单的块设备层。这些简单的仿真层允许使用格式化的文件数据而不是没有格式化的大块存储,不过它们有一些性能限制。

      闪存文件系统当中首先增强的一点就是损耗均衡的一体化。如前面所说,闪存块倾向于一个有限的写数据的生命期。均匀抹除算法习惯于均匀覆盖闪存的物理擦除块,目的是为了增加闪存芯片的使用寿命。

      另一个限制来自于闪存结构中断电时数据的丢失的风险。考虑到闪存块大小相对大以及平均需要写的文件大小相对于块大小来说是很小的,加上之前我们已经学过了闪存块一次只能写一个块,所以,为了写一个8KB的文件,必须擦除并且重写整个的闪存块,这个块或许64KB,或许128KB;最坏的情况下,这一步骤可能需要几秒钟来完成。在断电的时候将导致数据丢失。

现在比较流行的闪存文件系统的一种是JFFS2(Journaling Flash File System 2)。它在提高整体的性能、增加闪存生命期以及减少断电时数据丢失方面有几点重要的特性。在最新的JFFS2文件系统中有更显著的改善,包括提高损耗均衡(wear leveling),将更多的数据硬塞进一个已知的闪存中,以及支持Linux硬连接。我们将在第九章详细介绍JFFS2,并且在第十章中再次介绍。

原创粉丝点击