当前位置:嗨网首页>书籍在线阅读

10-闪存

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.3.1 闪存

几乎所有人都对消费电子设备,比如数码相机和PDA(这两者都是很好的嵌入式系统的例子)中广泛使用的Compact Flash卡和SD卡很熟悉。这些基于闪存技术的模块可以看做是固态硬盘,它们能够在很小的空间内存储许多兆甚至几吉字节的数据。它们内部没有活动的部件,相对坚固,只需一种供电电压。

生产闪存的厂家有好几家。闪存的类型多种多样,电气规格、物理封装形式以及容量各有不同。只拥有小到4 MB或8 MB非易失性存储容量的嵌入式系统并不罕见。嵌入式Linux系统对存储容量的典型需求是16 MB~256 MB。越来越多的嵌入式Linux系统拥有数吉字节的非易失性存储空间。

闪存可以在软件的控制下写入和擦除数据。采用旋转硬盘驱动器技术的普通硬盘仍然是最快的可写入存储媒介。虽然和普通硬盘相比,闪存的写入和擦除仍然相当慢,但与以前相比,其写入和擦除速度已经有了显著提高。了解硬盘驱动器和闪存技术的根本区别才能正确地使用相应技术。

闪存的存储空间被分割成相对较大的可擦除单元,称为擦除块(erase block)。闪存的一个显著特征就是闪存中的数据写入和擦除的方式。在典型的NOR型[7]闪存芯片中,数据可以在软件的控制下,使用直接向某个存储单元地址写入的简单方法将其从二进制1改为二进制0。然而,要将数据从0改回1,则要擦除整个擦除块,在擦除时需要向闪存芯片写入一串特别的控制指令序列。

[7] 闪存技术有很多种。NOR型闪存是小型嵌入式系统中最常用的一种闪存。

典型的NOR型闪存包含多个擦除块。例如,一个4 MB容量的闪存芯片可能包含64个擦除块,每块大小为64 KB。市面上也有擦除块大小不一致的闪存,以便灵活存放数据。这种闪存常常被称为引导块(boot block)或引导扇区(boot sector)闪存。通常,引导加载程序存储在较小的块中,内核和其他必要的数据则存放在更大的块中。图2-3说明了一个典型的顶部引导(top boot)闪存芯片的块大小布局。

9.png

图2-3 引导块闪存的架构

为了修改存储在闪存阵列中的数据,必须完全擦除待修改数据所在的块。即使只修改某个块中的一个字节,都必须擦除并重新写入整个块[8]。相比于传统硬盘的扇区,闪存的块大小相对较大。相对而言,一个典型的高性能硬盘的可写扇区大小为512 B或1024 B。结果显而易见:更新闪存中的数据所耗费的写入时间会是硬盘驱动器的很多倍,部分原因就是每次更新数据时都有相对大量的数据需要被擦除和写回。在最坏的情况下,一个写周期会耗费几秒钟的时间。

[8] 记住,你可以一次将一个字节从1改成0,但如果想将某个比特从0改回1,则必须擦除整个块。

关于闪存,另一个需要考虑的限制是存储单元的写寿命(write lifetime)。NOR型闪存存储单元的可写入次数是有限制的,超出次数限制后写入就会失败。虽然这个次数的数值比较大(典型的写入次数限制是每块100 000次),但不难想象一个设计很差的闪存存储算法(甚至是一个软件故障)会迅速毁坏闪存设备。显然,应该避免配置你的系统日志输出到闪存。