当前位置: 首页 > news >正文

嵌入式文件系统

嵌入式文件系统存储介质一般是Flash芯片,常用的嵌入式文件系统比较出名的有CramfsJFFSYaffs三种文件系统。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_SIZE4096KB的内核,因此如果发现Cramfs不能正常读写的时候,可以检查一下内核参数设置。

Ramfs/Tmpfs

Ramfs也是Linus Torvalds开发的,Ramfs把所用文件都放在RAM里运行,通常存放一些临时或经常要修改的数据。不像ramdisk的固定大小,Ramfs的大小可调。

Tmpfs是基于内存的文件系统,因为它驻留在RAM中,所以读写都在RAM中,因此读写瞬间完成。文件系统大小可变。

JFFS2

RedHat基于JFFS开发的闪存文件系统。可读可压缩的日志型文件系统,提供崩溃/掉电安全保护,使用了基于哈希表的日志节点结构,加快了对节点操作速度,支持数据压缩,提供“写平衡”支持,是目前最流行的文件系统。缺点是:文件系统已满,或者接近于满时,JFFS2运行变慢,因为碎片收集的问题。

Yaffs

jffs2类似的闪存文件系统,专为嵌入式系统使用Nand型闪存而设计的一种日志文件系统。比jffs2少了一个功能,因此速度更快,对内存要求比较小。自带Nand芯片驱动,提供了直接访问文件系统的API。用户可以直接对文件系统操作。相反,Jffs2Nand闪存上表现得并不稳定,更适合Nor闪存。

NFS

SUN公司发展并推出的,是一个RPC service

参考文章

嵌入式Linux文件系统及其存储机制分析
嵌入式根文件系统的移植和制作详解
嵌入式文件系统

相关文章:

  • Linux下快速迁移海量文件的操作记录
  • 如何:创建和使用 C# DLL(C# 编程指南)
  • 看电商发展过程中,前端技术的演进
  • 又来了,拖后腿没?全国各城市最新平均月薪出炉
  • JZ2440 裸机驱动 第7章 内存管理单元MMU
  • php验证身份证合法性
  • gcc/g++ 编译选项
  • Metro Style App 异步-简洁而不简单的异步
  • centos 7 环境变量PATH 、 cp命令、mv命令、 文档查看cat/more/less/head/tail
  • Oracle基本操作命令
  • 【Java学习笔记之三十四】超详解Java多线程基础
  • An unexpected exception has been detected in native code outside the VM
  • FFmpeg AVPacket和AVFrame区别
  • 我为什么选择Angular 2?
  • 安装OpenStack问题
  • css布局,左右固定中间自适应实现
  • Django 博客开发教程 16 - 统计文章阅读量
  • HTML中设置input等文本框为不可操作
  • nodejs实现webservice问题总结
  • Object.assign方法不能实现深复制
  • PHP 的 SAPI 是个什么东西
  • Redash本地开发环境搭建
  • Redis字符串类型内部编码剖析
  • windows下使用nginx调试简介
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 一个JAVA程序员成长之路分享
  • 以太坊客户端Geth命令参数详解
  • 用element的upload组件实现多图片上传和压缩
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 国内开源镜像站点
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • $.ajax()方法详解
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (转)EOS中账户、钱包和密钥的关系
  • (转)mysql使用Navicat 导出和导入数据库
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net 使用ajax控件后如何调用前端脚本
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @JoinTable会自动删除关联表的数据
  • [ 数据结构 - C++]红黑树RBTree
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [CISCN 2023 初赛]go_session
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [Google Guava] 2.1-不可变集合
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • [Java][方法引用]构造方法的引用事例分析
  • [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用...
  • [leetcode]Flatten Binary Tree to Linked List
  • [LeetCode]Max Points on a Line
  • [LeetCode]Pow(x,n)