首页 理论教育 常见嵌入式Linux文件系统与应用

常见嵌入式Linux文件系统与应用

时间:2023-11-23 理论教育 版权反馈
【摘要】:在嵌入式Linux 下,MTD为底层硬件(闪存)和上层之间提供一个统一的抽象接口,即Flash 的文件系统都是基于MTD 驱动层的。1)jffs2jffs2 文件系统最早是由瑞典Axis Communications 公司基于Linux2.0 的内核为嵌入式系统开发的文件系统。yaffs/yaffs2 自带NAND 芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux 中的MTD 与VFS,直接对文件系统操作。μClinux 系统通常采用romfs 文件系统。ext2 也可以作为嵌入式Linux 的文

常见嵌入式Linux文件系统与应用

嵌入式Linux 应用中,主要的存储设备为RAM(DRAM、SDRAM)和ROM(常采用Flash存储器),常用的基于存储设备的文件系统类型包括:jffs2、yaffs、cramfs、romfs,ramdisk 和ramfs/tmpfs 等。

(1)基于Flash 的文件系统

Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。 Flash 的写入操作只能将对应位置的“1”修改为“0”,而不能将“0”修改为“1”(擦除Flash 就是将对应存储块的内容恢复为“1”)。 一般情况下,向Flash 写入内容时,需要先擦除对应的存储区间。 这种擦除是以块为单位进行的。 Flash 存储器的擦写次数是有限的,NAND 闪存还有特殊的硬件接口和读/写时序。 因此,必须针对Fash 的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2 等,用作Flash 的文件系统会有诸多弊端。

在嵌入式Linux 下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash 的文件系统都是基于MTD 驱动层的。 使用MTD 驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash 有更好的支持管理和基于扇区的擦除、读/写操作接口。

一块Flash 芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash 芯片也可以合并为一个分区使用,采用一个文件系统,即文件系统是针对于存储器分区而言的,而非存储芯片

1)jffs2

jffs2 文件系统最早是由瑞典Axis Communications 公司基于Linux2.0 的内核为嵌入式系统开发的文件系统。 jffs2( journalling flash file system v2,日志闪存文件系统版本2)是Redhat公司基于JFFS 开发的闪存文件系统,最初是针对Redhat 公司的嵌入式产品eCos 开发的嵌入式文件系统,jffs2 也可以用在Lnux 和μClinux 中。

jffs2 主要用于NOR Flash 存储器,基于MTD 驱动层,其特点是:可读/写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2 的运行速度大大放慢。

目前jffs3 正在开发中。 关于jffs 系列文件系统的使用详细文档,可参考MTD 补丁包中

mtd-jffs-HOWTO.txt。

jffsx 不适合用于NAND 闪存,主要是因为NAND 闪存的容量一般较大,这样将会导致jffs维护日志节点所占用的内存空间迅速增大;另外,jffsx 文件系统在挂载时需要扫描整个Flash的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND 闪存会耗费大量时间。

2)yaffs

yaffs(yet another flash file systen)/yaffs2 是专为嵌入式系统使用NAND 型闪存而设计的一种日志型文件系统,与jffs2 相比,由于它减少了一些功能(例如不支持数据压缩),所以,速度更快,挂载时间很短,对内存的占用较小。 另外,它还是跨平台的文件系统,除了Linux 和eCos,还支持WinCE、pS0S 和Threadx 等。

yaffs/yaffs2 自带NAND 芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux 中的MTD 与VFS,直接对文件系统操作。 当然,yaffs 也可与MTD 驱动程序配合使用。

yaffs 与yaffs2 的主要区别在于,前者仅支持小页(512 B)NAND 闪存,后者则可支持大页(2 KB)NAND 闪存;同时,yaffs2 在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

3)cramfs

cramfs(compressed ROM file systen)是Linux 的创始人Linus Torvalds 参与开发的一种只读的压缩文件系统,它也基于MTD 驱动程序。

在cramfs 文件系统中,每一页(4 KB)被单独压缩,可以随机页访问,其压缩比高达2 ∶1,为嵌入式系统节省大量的Fash 存储空间,使系统可通过更低容量的F 存储相同的文件,从而降低系统成本。

caramfs 文件系统以压缩方式存储,在运行时解压缩,不支持应用程序以XIP 方式运行,所有的应用程序要求被复制到RAM 里去运行,但这并不代表比ramfs 需求的RAM 空间要大一点,因为cramfs 是采用分页压缩的方式存放档案。 当读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当读取的档案不在内存时,cramfs 文件系统自动计算压缩后的资料所存的位置,再即时解压到RAM 中。(www.xing528.com)

另外,cramfs 的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。 由于这些特性,cramfs 在嵌入式系统中应用广泛,但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容进行扩充。

cramfs 映像通常是放在Flash 中,也可以放在别的文件系统里。 使用loopback 设备可以将它安装到别的文件系统里。

4)romfs

传统型的romfs 文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存按顺序存放数据,因而支持应用程序XIP(execute In Place,片内运行)方式运行。 在系统运行时,节省RAM 空间。 μClinux 系统通常采用romfs 文件系统。

5)其他文件系统

fat/fat32 也可用于实际嵌入式系统的扩展存储器(例如PDA、Smartphone、数码相机等的SD 卡),这主要是为了更好地与最流行的Windows 桌面操作系统相兼容。 ext2 也可以作为嵌入式Linux 的文件系统,不过将它用于Flash 闪存会有诸多弊端。

(2)基于RAM 的文件系统

1)ramdisk

ramdisk 是将一部分固定大小的内存当作分区来使用。 它并非一个实际的文件系统,而是种将实际的文件系统装入内存的机制,并且可以作为根文件系统。 将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过ramdisk 放在内存中,可以明显地提高系统的性能在Linux 的启动阶段,initrd 提供了一套机制,可以将内核映像和根文件系统一起载入内存。

2)ramfs/tmpfs

ramfs 是Linus Torvalds 开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。 实际上,VFS 本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。

ramfs/tmpfs 文件系统将所有的文件都放在RAM 中,所以读/写操作发生在RAM 中,可以用ramfs/tmpfs 来存储一些临时性或经常要修改的数据,例如/tmp 和/var 目录,这样既避免了对Flash 存储器的读/写损耗,也提高了数据读/写速度。

ramfs/tmpfs 相对于传统的ramdisk 的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。

tmpfs 的一个缺点是:当系统重新引导时,会丢失所有数据。

(3)网络文件系统

网络文件系统(NFS,Network File System)是FreeBSD 支持的文件系统中的一种,它允许一个系统在网络上共享目录和文件。 通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。 NFS 是由SUN 公司于1984 年推出,它的通信协议设计与主机及嵌式终端系统无关,用户只要在主机中用mount 就可将某个文件夹挂到终端系统上。 在嵌入式Linux 系统的开发调试阶段,可以利用该技术在主机上建立基于NFS 的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Liux的根文件系统。 实际上,Linux 还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc 文件系统),用于获取系统信息;devfs(设备文件系统)和sysfs,用于维护设备文件。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈