闪存在嵌入式Linux系统中的应用
器。由于时序、数据线宽等参数是可变的,不可能在AT91SAM9261内部固化的启动程序中提供通用的SDRAM控制器初始化代码),然后再由一级启动程序把功能较全面的二级启动程序载入到容量足够大的SDRAM中运行,以启动系统。从NORFLASH启动时会跳过AT91SAM9261内部固化的启动程序,系统复位后执行的第一条指行就是NORFLASH中的。此时,启动程序可以只有1级,当然,为了使软件和串行闪存启动方式有较好的兼容性,也仍然可以采用两级启动程序,这样只需简单修改第一级启动程序即可适用于两种不同的硬件启动配置,为硬件设计留下更多的选择空间。由于AT91SAM9261本身的原因,从NORFLASH启动是实现宽温工作的惟一选择(AT91SAM9G10无此问题)。图2显示了不同的启动配置。
在这个AT91SAM9261系统中,分别采用了2 MB的DATAFLASH或2 MB的NORFLASH作为启动存储器,由BMS引脚选择具体使用何种启动方式。闪
存中的地址划分如图3所示,其中的bootSTrap是第一级启动程序;U-Boot是第二级启动程序。
2.2 系统内核及应用程序文件系统映像
系统内核映像和各MTD分区的文件系统映像大小在几MB到几十MB不等,需要存储在容量较大的NANDFLASH中。对于系统内核,由于做了适当的裁减,其长度不大,和初始根文件系统加在一起不过几MB,如果不在乎稍长的启动时间,还可以对它使用gzip压缩,大幅度减小其尺寸。在使用U-Boot作为启动程序的系统中,由于U-Boot具有直接读取NANDFLASH块/页的能力,不需要使用文件系统,将内核映像直接写到闪存块里。
应用程序及其所需的库文件、资源文件等,作为独立的文件系统映像挂载,在此选择了带有压缩及去除重复文件功能的只读文件系统,即SqLrashFS(SquashFs文件系统已经被广泛用于各种Linux Live CD形式的发行版中,被充分证明是可靠的,并且从Linux 2.6.29版开始,它已加入到系统核心源码)。在嵌入式系统中,使用只读文件系统有许多好处,比如挂载时间短,不受掉电影响,不必在系统运行过程中处理坏块及平衡损耗等。在使用过程中由于不涉及写入,其可靠性优于可写的文件系统。
在此目标系统中,内核和初始根文件系统的U-Boot映像约为2.8 MB,应用程序、GUI子系统,以及应用程序运行过程中所需的图形和字体文件的SquashFS映像约为12 MB。系统中使用的NANDFLASH是一片总容量为64 MB的8位数据线宽的芯片,块容量是16 KB+512 B,页容量是512 B+16 B,其属于块尺寸较小的那种,与大块NANDFLASH相比,操作命令稍有区别,在驱动程序中需要区别对待。该系统中的MTD分区结构如表1所示。
2.3 应用程序对闪存的使用
大多数情况下,仅提供对闪存的只读操作是不够的。比如,U-Boot至少在更新其自身以及保存环境变量时需要写闪存;操作系统在记录日志时要写闪存;应用程序在保存用户配置及工作数据时也要写闪存。对于启动加载程序来说,问题不是很严重。因为系统处于更新及配置状态时,大多是脱离正常工作状态的,且由专人操作,操作中途发生异常情况(如掉电)的可能性不大,即使发生了,也会被及时发现和处理。对于系统日志,在嵌入式系统中可以将其关闭,以减少对闪存的写操作。应用程序对闪存的写操作是不可避免的,而且处于设备自动工作期间,需要应对各种偶然发生的异常状况,特别是意外掉电。
在Linux系统中,通过文件系统访问闪存是顺理成章的做法。目前支持NANDFLAsH的常用文件系统有YAFFS/YAFFS2,JFFS2和UBIFS等。它们都是记帐式的文件系统,各有特点,也有不足。
YAFFS/YAFFS2是专为NANDFLASH写的文件系统。在YAFFS的代码里包括管理闪存带外区(OOB)的部分,而这部分代码一般认为属于设备驱动的范畴,其他文件系统里是不含这部分代码的。YAFFS是一种稳键的记帐结构的文件系统。高效率是它追求的另一个目标。它可以用在各种操作系统中(已用于Linux,WinCE,pSOS,eCos,ThreadX及各种专用操作系统中),甚至可以在没有操作系统的环境下工作。YAFFS2支持“检查点(checkpoints)”,以避免挂载过程中耗时的扫描操作,实现快速挂载。
相对于JFFS,JFFS2有了一些改进,可以支持硬连接(hard Links),垃圾回收更有效,平衡损耗更均匀。但它在挂载时仍需要扫描寻找最新版本的闪存块,并建立RAM中的数据结构,文件系统越大,挂载时间越长,RAM开销也越大。虽然JFFS2已经通过小结节点技术减少了挂载时间,但结果仍不理想,挂载时间是s级的。
UBIFS是JFFS2的后继(原来称作JFFS3),第1个稳定版本于2008年10月加入到Linux 2.6.27版核心中,它有一个竞争者叫LogFS。UBIFS与JFFS2的最大不同在于
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- SHARC引领第四代通用DSP高端应用潮流(09-27)
- 在应用可编程测控网络设计(03-15)
- 基于dsPIC33F系列单片机的应用程序升级方法(04-03)
- 采用混合时钟模式提高Linux时钟精度的方法(05-10)
- MSP430低功耗原理及其在海温测量中的应用(06-06)