嵌入式文件系统
嵌入式文件系统存储介质一般是Flash
芯片,常用的嵌入式文件系统比较出名的有Cramfs
、JFFS
、Yaffs
三种文件系统。Flash
芯片是嵌入式系统中广泛采用的主流存储器,主要特点是按整体/扇区擦除和按字节编程、低功耗、高密度、小体积。Flash
分为Nor
型和Nand
型:Nor
型速度快,价格高,地址线与数据线分开,可以像SRAM
一样连在数据线上;Nand
型单元尺寸是Nor
型的一半,生产简单,价格低廉。
嵌入式Flash
文件系统要求
1、掉电安全。
2、平均使用。Flash
存储扇区的擦除次数都有限制。文件系统对Flash
的使用必须充分的考虑该特性,最好均匀使用Flash
的每个扇区,以延长Flash
的使用寿命。
3、高效垃圾回收。各种存储器在分配使用一段时间后,会出现空缺和碎片数据,这就需要进行垃圾回收以保证存储器空间高效使用。Flash
存储器以扇区为单位,垃圾回收也应该以扇区为单位,嵌入式Flash
文件系统回收要先移动扇区数据,再擦除整个扇区。
Linux
文件系统三个层次
1、上层用户空间的应用程序对文件系统的系统调用;
2、虚拟文件系统VFS
;
3、挂载到VFS
中的各种实际文件系统。
常用文件系统
ROMFS
是常用的一种文件系统,简单紧凑,只读,不支持动态擦写保存。按顺序存放所有文件数据,所以这种文件系统格式支持应用程序以XIP
(芯片内执行)方式运行,在系统运行时,可以获得可观的RAM
节省空间。UCLinux
通常采用ROMFS
文件系统。
Cramfs
Linus Torvalds
开发的一种可读文件系统。每一页被单独压缩,可以随机访问,压缩比高达2:1
。压缩存储,运行时解压。不支持XIP
方式运行,所有应用程序都要求被复制到RAM
里运行,因为存储的原因,所以不会消耗太多内存。
速度快,效率高。只读特性有利于保护文件系统免受破坏,但是只读使得无法扩充。Cramfs
镜像文件通常放在Flash
中,但是也能放在别的文件系统里,使用loopback
设备可以把它安装到别的文件系统里。使用mkCramfs
工具可以创建Cramfs
镜像文件。
特点:
1、采用实时解压方式,但解压缩的时候有延迟;
2、Cramfs
的数据都是经过处理、打包的,对其进行写操作有一定的困难,所以不支持写操作,这个特性刚好适合嵌入式应用中使用Flash
存储文件系统的场合;
3、在Cramfs
中文件最大不能超过16MB
;
4、支持组标志,但是mkCramfs
只将低8
位保存下来,因为只有这8
位是有效的;
5、支持硬链接;
6、Cramfs
的目录中没有.
和..
这两项,因此Cramfs
中的目录的链接数通常也仅有一个;
7、Cramfs
中不会保存文件的时间戳信息,当然正在使用的文件由于inode
保存在内存中,因此其时间可以暂时的变为更新时间,但是不会保存到Cramfs
中;
8、当前版本的Cramfs
只支持PAGE_CACHE_SIZE
为4096KB
的内核,因此如果发现Cramfs
不能正常读写的时候,可以检查一下内核参数设置。
Ramfs/Tmpfs
Ramfs
也是Linus Torvalds
开发的,Ramfs
把所用文件都放在RAM
里运行,通常存放一些临时或经常要修改的数据。不像ramdisk
的固定大小,Ramfs
的大小可调。
Tmpfs
是基于内存的文件系统,因为它驻留在RAM
中,所以读写都在RAM
中,因此读写瞬间完成。文件系统大小可变。
JFFS2
是RedHat
基于JFFS
开发的闪存文件系统。可读可压缩的日志型文件系统,提供崩溃/掉电安全保护,使用了基于哈希表的日志节点结构,加快了对节点操作速度,支持数据压缩,提供“写平衡”支持,是目前最流行的文件系统。缺点是:文件系统已满,或者接近于满时,JFFS2
运行变慢,因为碎片收集的问题。
Yaffs
和JFFS2
类似的闪存文件系统,专为嵌入式系统使用Nand
型闪存而设计的一种日志文件系统。比JFFS2
少了一个功能,因此速度更快,对内存要求比较小。自带Nand
芯片驱动,提供了直接访问文件系统的API
。用户可以直接对文件系统操作。相反,JFFS2
在Nand
闪存上表现得并不稳定,更适合Nor
闪存。
NFS
是SUN
公司发展并推出的,是一个RPC service
。