对于嵌入式系统来说,除了一个嵌入式内核之外,还需要一个嵌入式文件系统来管理和存储数据和程序。目前,嵌入式 Linux 操作系统支持很多种文件系统,具体使用哪种文件系统,需要根据存储介质、访问速度、存储容量等来选择。

嵌入式文件系统

  Linux 支持多种文件系统,包括 ext2、ext3、ext4、vfat、ntfs、iso9660、jffs、yaffs、romfs、cramfs 和 nfs 等等。为了对各类文件系统进行统一管理,Linux 引入了虚拟文件系统 VFS,为各类文件系统提供统一的操作和 API。
  Linux 文件系统结构由 4 层组成,分别是用户层、内核层、驱动层和硬件层。用户层为用户提供一个操作接口,内核层实现了各种文件系统,驱动层是块设备的驱动程序,硬件层是嵌入式系统使用的几种存储器。
  在 Linux 文件系统结构中,内核层的文件系统实现是必须的。Linux 启动时,第一个必须挂载的是根文件系统,如果系统不能从指定的设备上挂载根文件系统,那么系统会出错从而退出启动。当根文件系统挂载成功后,才可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在多个不同类型的文件系统。
  不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式 Linux 应用中,主要的存储设备为 RAM(DRAM,SDRAM)和 ROM(常采用 Flash 存储器),常用的基于 Flash 存储设备的文件系统类型包括 jffs2、yaffs、cramfs、romfs、ramdisk 和 ramfs/tmpfs 等。
  (后面补个图片)

嵌入式系统的存储介质

  Linux 操作系统支持大量的文件系统,在嵌入式领域,使用哪种文件系统需要根据存储芯片的类型来决定。目前市场上,嵌入式系统主流的两种存储介质是 NOR 和 NAND Flash。Intel 公司与 1988 年首先开发了 NOR Flash 存储器,其特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在 Flash 闪存内运行,不必再把代码读到系统 RAM 中。NOR 的传输效率很高,在 1MB~4MB 的小容量时具有很高的成本效益,但缺点是写入和擦除速度很慢,对性能有较大的影响。
  1989年,日本东芝公司开发了 NAND Flash 存储器。NAND Flash 与 NOR Flash 相比,NAND Flash 能提供极高的单元密度,可以达到高存储密度,同时写入和擦除的速度也很快。下面是两种存储器的比较:

比较项

NOR Flash

NAND Flash

读速度

NOR 的读速度相对快

NAND 的读速度相对慢

写速度

NOR 的写速度相对慢很多

NAND 的写速度相对快很多

擦除速度

NOR 的擦除速度相对慢很多

NAND 的擦除速度相对快很多

擦除单元

NOR 的擦除单元要大一些,擦除电路更多一些

NAND 的擦除单元更小,擦除电路更少一些

容量

相对小,主要用于存放代码

大,适用于存放大量的数据

成本

相对高

相对低

寿命

擦写10万次

擦写100万次

  总的来说,NOR Flash 比较适合存储代码,其容量较小(一般小于 32 MB),而且价格较高。NAND Flash 容量较大,可达1GB以上,价格也相对便宜,比较适合存放数据。一般来说,128MB 以下的 NAND Flash 芯片的一页大小为 528 Bytes,另外每页有 16 Bytes 的备用空间,用来存储 ECC 校验码或者坏块标志等信息。若干页组成一个块(Block),其大小通常为 32KB 或 64KB。

JFFS 文件系统

  瑞典的 Axis Communications 公司基于 Linux 2.0 的内核,为嵌入式操作系统开发了 JFFS 文件系统。其升级版本 JFFS2 是 RedHat 公司基于 JFFS 开发的闪存文件系统,最初是针对 RedHat 公司的嵌入式产品 eCos 开发的嵌入式文件系统,所以 JFFS2 也可以用在 Linux 和 uCLinux 等操作系统中。JFFS 是 Journalling Flash File System 的缩写,即闪存设备日志型文件系统。
  JFFS 文件系统主要用于 NOR 型 Flash 存储器,其基于 MTD 驱动层。这种文件系统的特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使 jffs2 的运行速度大大放慢。
  JFFS 文件系统不适合用于 NAND 型 Flash 存储器。主要是因为 NAND 闪存的容量一般较大,这样导致 JFFS 为维护日志节点所占用的内存空间迅速增大。另外,JFFS 文件系统在挂载时需要扫描整个 Flash 的内容,以找出所有的日志节点,建立文件结构,对于大容量的 NAND Flash 会耗费大量时间。

YAFFS 文件系统

  YAFFS 是第一个专门为 NAND Flash 存储器设计的嵌入式文件系统,适用于大容量的存储设备;并且是在 GPL(General Public License)协议下发布的,可在其网站免费获得源代码。
  YAFFS 文件系统有4个优点,分别是:

  • 速度快
  • 占用内存少
  • 不支持压缩
  • 只支持 NAND Flash 存储器

  在 YAFFS 文件系统中,文件是以固定大小的数据块进行存储的。块的大小可以是 512 Bytes、1024 Bytes 或者 2048 Bytes。每个文件(包括目录)都是由一个数据块头和数据组成。数据块头中保存了 ECC 校验码和文件系统的组织信息,用于错误检测和坏块处理。YAFFS 文件系统充分考虑了 NAND Flash 的特点,把每个文件的数据块头存储在 NAND Flash 的 16 Bytes 备用空间中。
  当文件系统被挂载时,只需扫描存储器的备用空间就能将文件系统信息读入内存,并且驻留在内存中,不仅加快了文件系统的加载速度,也提高了文件的访问速度,但是增加了内存的消耗。
  选择哪一种文件系统,需要根据 Flash 存储器的类型来确定。Flash 存储器类型主要有 NOR 和 NAND Flash。根据存储器类型,NOR Flash 存储器比较适用于 JFFS,而 NAND Flash 存储器比较适用于 YAFFS。

文件系统配置