当前位置: 首页 > 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问题
  • 分享的文章《人生如棋》
  • 分享一款快速APP功能测试工具
  • [译]前端离线指南(上)
  • es6--symbol
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • java中的hashCode
  • mysql中InnoDB引擎中页的概念
  • Python语法速览与机器学习开发环境搭建
  • underscore源码剖析之整体架构
  • 大数据与云计算学习:数据分析(二)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 前端临床手札——文件上传
  • 数据科学 第 3 章 11 字符串处理
  • Spring第一个helloWorld
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​​​​​​​​​​​​​​Γ函数
  • #{}和${}的区别?
  • #define 用法
  • #数学建模# 线性规划问题的Matlab求解
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (LeetCode) T14. Longest Common Prefix
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (超详细)语音信号处理之特征提取
  • (二十四)Flask之flask-session组件
  • (生成器)yield与(迭代器)generator
  • (四)库存超卖案例实战——优化redis分布式锁
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)大型网站架构演变和知识体系
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET企业级应用架构设计系列之开场白
  • ;号自动换行
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @Valid和@NotNull字段校验使用