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

  • 2.3 存储考虑

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

  • 2.3.1 闪存(Flash memory)

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

目前世界上已经有好几家生产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也可以保存少量的数据。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Chapter 1. Introduction Section 1.1. Why Linux? Section 1.2. Embedded Linux Today Section 1.3. Open Source and the GPL Section 1.4. Standards and Relevant Bodies Section 1.5. Chapter Summary Chapter 2. Your First Embedded Experience Section 2.1. Embedded or Not? Section 2.2. Anatomy of an Embedded System Section 2.3. Storage Considerations Section 2.4. Embedded Linux Distributions Section 2.5. Chapter Summary Chapter 3. Processor Basics Section 3.1. Stand-alone Processors Section 3.2. Integrated Processors: Systems on Chip Section 3.3. Hardware Platforms Section 3.4. Chapter Summary Chapter 4. The Linux KernelA Different Perspective Section 4.1. Background Section 4.2. Linux Kernel Construction Section 4.3. Kernel Build System Section 4.4. Obtaining a Linux Kernel Section 4.5. Chapter Summary Chapter 5. Kernel Initialization Section 5.1. Composite Kernel Image: Piggy and Friends Section 5.2. Initialization Flow of Control Section 5.3. Kernel Command Line Processing Section 5.4. Subsystem Initialization Section 5.5. The init Thread Section 5.6. Chapter Summary Chapter 6. System Initialization Section 6.1. Root File System Section 6.2. Kernel's Last Boot Steps Section 6.3. The Init Process Section 6.4. Initial RAM Disk Section 6.5. Using initramfs Section 6.6. Shutdown Section 6.7. Chapter Summary Chapter 7. Bootloaders Section 7.1. Role of a Bootloader Section 7.2. Bootloader Challenges Section 7.3. A Universal Bootloader: Das U-Boot Section 7.4. Porting U-Boot Section 7.5. Other Bootloaders Section 7.6. Chapter Summary Chapter 8. Device Driver Basics Section 8.1. Device Driver Concepts Section 8.2. Module Utilities Section 8.3. Driver Methods Section 8.4. Bringing It All Together Section 8.5. Device Drivers and the GPL Section 8.6. Chapter Summary Chapter 9. File Systems Section 9.1. Linux File System Concepts Section 9.2. ext2 Section 9.3. ext3 Section 9.4. ReiserFS Section 9.5. JFFS2 Section 9.6. cramfs Section 9.7. Network File System Section 9.8. Pseudo File Sys

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值