【EmbeddedLinuxPrimer翻译】第二章:你的第一次嵌入式体验(二)

来源:互联网 发布:公司客户数据保密制度 编辑:程序博客网 时间:2024/04/30 11:00
  • 2.3 存储考虑

嵌入式系统最大的挑战之一在于它所拥有的物理资源往往都很有限,尽管你桌上的奔4电脑上的硬盘容量已经高达180GB了(译者注,现在180GB的硬盘简直弱爆了^_^),可是在嵌入式系统上很少能达到这么大。嵌入式系统一般不用台式电脑上标配的硬盘,而是采用更小更廉价的存储设备,因为硬盘体积很大,使用过程盘片转动时不能有外力撞击,并且需要单独供电,相比之下这些都不符合嵌入式系统的要求。

  • 2.3.1 闪存(Flash memory)

几乎所有人都对袖珍型闪存设备(Compact Flash modules)(注5)很熟悉,尤其以消费电子产品中用到的最多,比如数码相机和PDA等(这两种产品本身就是嵌入式设备)。Flash可以认为是固态硬盘,可以存储上百兆字节甚至GB的数据,内部部件不存在相对运动,相对于硬盘需要单独供电,flash则不需要。

    • 注5:请参考www.compactflash.org.

目前世界上已经有好几家生产flash设备的厂商。Flash设备有个各种各样的物理封装和容量,一般1MB或2MB的Flash很少见,嵌入式系统上用到的大多是4MB到256MB的Flash,已经有越来越多的设备上用到了GByte容量的Flash。
Flash在软件控制下可以写入和擦除。虽然硬盘仍然是目前写入速度最快的介质,但是随着时间的推移,Flash的写入和擦出速度也已经有了相当的提高。毕竟两种存储介质存在基础性的差异,因此使用者必须能够理解并正确的使用它们。

Flash被分成一些相对大的可擦除单元,被称为“擦除块”。Flash的一个重要特征就是,数据以何种方式写入和擦除。在一个典型的flash芯片中,软件可以控制数据从二进制的1变成二进制的0,每次改变1个bit或1个word,但是如果把1个bit从二进制0写会到二进制1,即便只修改这一个bit的值,整个块也都要被擦除。之所以把flash的“块”称为“擦除块”,就是这个原因。

一个典型的flash设备包含很多擦除块,例如一个4MB的flash芯片可能包含64个擦除块,每个块占用64K字节。Flash还可以分成大小不均等的擦除块,以便灵活地规划数据的存储。这些通常被称为启动块或启动扇区。通常bootloader保存在小一点的块内,kernel和其他所需的数据则存储在大一些的块内。图2-3描述了一个典型的“顶部启动”flash(top boot flash)的各个块的大小排列。

图2-3 flash启动块架构

 


修改存储在一个flash存储阵列中的数据,被修改数据所在的flash块要整个被擦除。即使只需要改变一个字节,整个块也要被擦除重写(注6)。与传统的硬盘的扇区大小相比,flash的块大小相对较大,相比之下,典型的高性能硬盘的可写扇区大小一般只有512字节或1024字节,flash的这种差异所带来的结果很明显:更新flash中数据花费的时间要数倍于硬盘操作,部分原因是每次更新时都有比较大的数据量要写会闪存。在最坏的情况下,每个写周期要花费几秒钟的时间完成。

    • 注6:请记住,如果是将flash上数据从1写成0,则一次只需修改一个字节即可(译者注,上面提到从1写成0每次写一个bit或一个word,这里说的是每次写一个byte,需要double check),但是反过来,如果是从0写回1,必须将数据所在的整个块都擦除。

Flash存储设备另一个限制是flash存储单元的写操作寿命,flash的存储单元的写入次数是有限的,达到上限后,flash将无法再执行写操作。尽快这个上限往往很大(每个flash块有100K次),但是仍然可以看出flash存储算法设计的多么脆弱(甚至可以认为是一个bug),以至于很容易损坏掉一枚flash。既然flash存在此缺陷,那么开发者在设计软件系统的时候,就尽可能避免将系统日志输出到flash设备上。

  • 2.3.2 NAND flash

NAND flash是一项相对比较新的flash存储技术,当NAND flash投放市场之后,上文讲的所谓的传统的flash存储设备就被称为NOR flash,两者的区别在于flash内部的存储单元架构的差异。NAND flash对传统flash(NOR flash)的一些缺陷加以改进,比如提供更小的块大小,从而带来更快更高效的写入操作,并且使flash阵列的使用更有效。

NOR flash和微处理器的接口,与很多微处理器外设的接口多多少少有些相似,都有并行数据和地址总线,直连(注7)微处理器的数据/地址总线,flash阵列中的每个字节或字可以以随机的方式被单独寻址。而NAND flash通过一个复杂的接口进行串行访问,不同厂商的实现不同。NAND设备所提出的操作模式更类似于传统硬盘和相关控制器。数据以串行突发形式访问,比NOR flash的块小很多。NAND flash的写循环寿命比NOR flash高出一个数量级,虽然擦除时间要显著小很多。

    • 注7:这个只是逻辑意义上的直连,实际物理电路中可能还有总线缓冲区或者桥片设备等。
  • 2.3.3 Flash的使用

嵌入式系统设计人员对flash的布局和使用方面可以有很多选择,在最简单的系统中,如果系统资源没有过度限制,原始的二进制数据(可能被压缩过)可以存储在flash设备中。系统启动时,将flash中存储的系统image读到Linux虚拟内存盘(ramdisk)中,并将其挂载成文件系统,然后系统只需从RAM中读写数据即可。如果flash中的数据很少需要更新,或者相对于ramdisk的大小,升级的内容非常少,那么这种设计方案是非常好的一种选择。不过要注意一点的就是,ramdisk是易失设备,重启或者断电后,所有的修改都会丢失。

图2-4描述了一种通用的Flash存储组织方案,这种方案在简单的嵌入式系统中很常见,尤其是动态数据很少的非易失性存储方案中。

图2-4 flash存储布局范例

 

bootloader往往存放在flash存储阵列的顶部或底部,紧挨着bootloader,flash为Linux kernel和ramdisk文件系统image(注8)分配了空间用来容纳root文件系统。通常Linux kernel和ramdisk文件系统都是压缩之后存储的,在启动过程中bootloader负责将其解压。

    • 注8:我们在第九章 文件系统中详细讨论ramdisk文件系统

为了将动态数据在系统重启或断电之前保存下来,flash专门划分出来一块小区域存储这部分数据,当然我们也可以选用其他非易失性存储器保存动态数据(注9),这种方案是嵌入式系统保存配置文件的一种典型设置,例如面向消费市场的无线接入点(WAP)设备。

    • 注9:实时时钟模块包含有少量的非易失性可存储空间,或者EEPROM也可以保存少量的数据。