闪存文件系统(Flash File System)
最近调研了一下闪存文件系统,部分结果展示如下,如有错误欢迎评论指正~
一、背景
闪存(flash memory),是一种电子式可清除程序化存储器的形式,允许在操作中被多次擦或写的存储器。
随着现在闪存价格的降低,闪存越来越普及,闪存是一种非易失性存储器,断电数据并不会丢失,同时它的读写速度比机械硬盘(HDD)要快很多。无论是手机还是一些小型的嵌入式设备,闪存都是作为存储器的方式存在,现在手机的 6+128 或者 8+256 这后面的128以及256就是指的闪存(NAND Flash)的大小。现在PC机中SSD也开始成为主流,现在的SSD几乎都是基于闪存技术,目前基本也可以把SSD与闪存等同起来,但是有些情况也得注意区分。
NOR和NAND是市场上两种主要的闪存技术。
二、闪存特性
2.1 NOR Flash与NAND Flash
NOR Flash与NAND Flash有较大区别,NOR Flash更像内存,它有自己独立的地址线和数据线,它的基本存储单元是bit,用户可以随机访问任何一个bit的信息。NOR Flash价格比较贵,容量也比较小。
NAND Flash更像磁盘,它的地址线和数据线是共用的I/O线,NAND Flash以块为单位进行擦除操作。而且NAND Flash与NOR Flash相比,成本要低一些,容量却大得多。
2.2 编程原理
闪存的写入操作必须在空白区域进行,如果目标区域已经有数据,必须先擦除后写入,因此擦除操作是闪存的基本操作。
闪存编程只能将1写为0,而不能将0写成1。所以在Flash编程之前,必须将对应的块先进行擦除,擦除的过程就是将该块中的所有位都写为1的过程,块内的所有字节变为0xFF。因此可以说,编程是将相应位写0的过程,而擦除是将相应位写1的过程,两者的执行过程完全相反。
2.3 NOR Flash与NAND Flash的区别
如前面所说:NOR Flash更像内存,程序可以直接在上面跑,NAND Flash更像磁盘,需要驱动。
它们的擦除方式也有不同:NAND Flash执行擦除操作是十分简单的,而NOR Flash则要求在进行擦除前,先要将目标块内所有的位都写为0。
NOR Flash由于成本的限制,其大小其实也对应着内存的大小,NAND Flash成本比NOR Flash低,其大小也可以对应着磁盘的大小(例如SSD)。
它们之间的其他区别如下:
- NOR的读速度比NAND稍快一些。
- NAND的写入速度比NOR快很多。
- NAND的擦除速度远比NOR快。
- NAND的擦除单元更小,相应的擦除电路更加简单。
- NAND的实际应用方式要比NOR复杂的多。
2.4 使用要求
区块擦除(Erasing blocks):闪存的区块在写入之前,要先做擦除的动作。擦除区块的时间一般比较长,因此最好利用系统闲置的时间来进行擦除。
磨损均衡(Wear leveling):闪存区块的擦除有次数的限制,重复进行擦除以及写入同一个区块将会造成闪存读取速度变慢,甚至损坏而无法使用,因此闪存设备的驱动程序需要将擦除的区块分散,以此来延长闪存寿命。用于闪存的文件系统,也需要设计出平均写入各区块的功能。
随机存取(Random access):一般的硬盘,读写数据时,需要旋转磁盘,以找到存放的扇区,因此,一般使用于磁盘的文件系统,会作最优化,以避免搜索磁盘的作用。但是闪存可以随机存取,没有查找延迟时间,因此不需要这个最优化。
三、闪存文件系统
传统的文件系统结合闪存转换层(FTL)可以将文件写入闪存,但是它的缺点是写入的效率较差,而且对于闪存的一些特性也没有较好文件系统方案,闪存使用寿命不高。因此,针对闪存特性设计闪存文件系统是十分必要的。
根据前面的信息,感觉现在的闪存文件系统其实就是基于存储器(NAND Flash)。
已经知道了闪存使用的一些特性或要求,设计一个闪存文件系统就要尽量提高闪存的使用寿命,也就是要考虑磨损均衡。同时根据闪存的擦除要求,也就是在写的时候,如果以有数据,那么必须先擦除然后再写入。
3.1 磨损均衡
磨损均衡是闪存文件系统首先要考虑的,如何做到磨损均衡,这对于延长闪存的使用寿命十分重要。
其实做到磨损均衡就是让闪存的每一个区域都被教平衡的访问到,也就是闪存上各个块的热度(访问频率)要达到基本一致。
对于经常被更新的数据块,可以称之为“热”数据块,对长期得不到更新的数据块,称之为“冷”数据块。
数据块经常更新的话,就会经常被擦除,而长期不更行的数据块,不会出现脏页而被擦除,其擦除次数会明显少于存放着经常被更新数据的块。
目前常用的磨损均衡算法大致分为两类,一类是随机性算法,一类是确定性算法。
具体可以参考:https://blog.csdn.net/dongyanxia1000/article/details/79458082
3.2 区块擦除
为了避免区块擦除时,对存储在该块上的其他数据产生干扰,Flash采取异地更新的策略。
当存储数据需要更新时,文件系统将会把新的复本写入一个新的闪存区块,将文件指针重新指向,并在闲置时期将原有的区块抺除。
被更新的文件数据会被放到别的物理页上,而不是覆盖原来的数据。包含新版本数据的页被称为有效页,新版本数据被称为有效数据。包含旧版本数据的页被称为无效页,或称为脏页,脏页经过擦除操作后成为空闲页,才可以重新写入数据。因为Flash是以块为单位执行擦除的,因此需要将脏页所在块上的所有物理页都擦除,在擦除之前需要检查此块上是否存在有效页,如果存在就必须先转移到其他块上。
3.3 垃圾回收
从3.2得知闪存存储数据更新的方式,旧数据被标记为脏页所以也就涉及到了需要进行垃圾回收,闪存文件系统的垃圾回收策略也尤为重要。
3.4 写放大(写干扰)
异地更新、垃圾回收等,又会造成一个写放大问题,这也是闪存文件系统需要尽量降低的地方。
3.5 现有典型闪存文件系统
- JFFS2
- YAFFS
- F2FS
3.6 总结
现在关于闪存文件系统的研究,对于实现整个文件系统其实比较少,18年三星在顶刊上发表了一篇。目前的研究主要针对一些小点进行研究,目前在磨损均衡方面的研究比较少,对于垃圾回收和写放大方面研究比较多。对于文件系统而言,写放大一直是一个研究的点,垃圾回收在闪存文件系统中可能研究得比较多~
参考
1、Flash与文件系统
地址:https://blog.csdn.net/u013178472/article/details/72864428
2、闪存
地址:https://baike.baidu.com/item/%E9%97%AA%E5%AD%98/108500?fromtitle=flash%20memory&fromid=3740729&fr=aladdin
3、NAND flash和NOR flash的区别详解
地址:https://blog.csdn.net/qq_38880380/article/details/78884522
3、闪存文件系统
地址:https://baike.baidu.com/item/%E9%97%AA%E5%AD%98%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/19278229?fr=aladdin
5、Flash磨损均衡技术解析(wear-leveling)
地址:https://blog.csdn.net/dongyanxia1000/article/details/79458082
闪存文件系统(Flash File System)相关推荐
- ESP8266 NodeMCU 闪存文件系统(SPIFFS)
目录 闪存文件系统 ESP8266闪存文件系统基本操作 1. 通过程序向闪存文件系统写入信息 2. 通过程序从闪存文件系统读取信息 3. 通过程序向闪存文件系统文件添加信息 4. 通过程序读取目录内容 ...
- 星际文件系统(InterPlanetary File System,缩写IPFS)
星际文件系统(InterPlanetary File System,缩写IPFS)是个旨在创建持久且分布式存储和共享文件的络传输协议.它是一种内容可寻址的对等超媒体分发协议.在IPFS网络中的节点将构 ...
- ESP8266-NodeMCU网络服务器——通过网页将文件上传到闪存文件系统
ESP8266WebServer esp8266_server(80); / 建立网络服务器对象,该对象用于响应HTTP请求.监听端口(80) File fsUploadFile; / 建立文件对象用 ...
- Esp32-Arduino 学习(闪存文件系统)
目录 闪存文件写入 闪存文件读取 闪存文件删除 从Arduino IDE 上传文件 注:本文代码来自于太极创客团队: www.taichi-maker.com,由于太极创客的教程是基于esp8266, ...
- ESP8266学习 六 通过闪存文件系统上传web端程序
使用闪存文件系统建立功能更加丰富的网络服务器 掌握了如何向ESP8266开发板的闪存文件上传文件,我们就有了更多的空间来存储更加丰富的网页资源,从而让我们实现功能更加丰富的物联网项目. 本节教程里,我 ...
- ESP32利用SPIFFS(闪存文件系统)创建 Web服务器实现引脚控制
ESP32利用SPIFFS(闪存文件系统)创建 Web服务器实现引脚控制 在本教程中,我们将向您展示如何构建一个web服务器,以提供存储在ESP32文件系统中的HTML和CSS文件.我们将创建分离的H ...
- adb 文件传输,解决只读文件系统Read-only file system问题
操作代码: adb push C:\xxdir\project /sdcard/xxx 执行此行代码,有可能会报错:错误如下 failed to copy './xxx' to '/xxx/xxx': ...
- 闪存Nand Flash存储结构浅析
NandFlash存储器由多个Block组成,每一个Block又由多个Page组成,Page的大小一般为2K+64Bytes或512+16Bytes.Page是读取和编程的基本单位,而擦除的基本单位是 ...
- [闪存 1] Flash(闪存)存储器底层原理|闪存存储器重要参数
声明 主页: 元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言. 个人辛苦整理,付费内容,禁止转载. 内容摘要
最新文章
- python 安装PIL包的方法以及简单介绍
- [Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)
- 雷军:我爱编程这个工作,可以肯定我会干上一辈子
- 无需Docker, 5分钟徒手DIY 一个Linux容器
- GridSearchCV( )参数详情
- 如何编写单元测试用例
- 【PostMan】测试Post请求
- 国内镜像站——国外资源的代理站点
- fpga初始化错误_FPGA下载程序出错
- 【Python实战】用Scrapy编写“1024网站种子吞噬爬虫”,送福利
- fmt/core.h:1711:3: error: static assertion failed: Cannot format an argument.解决方案
- 三菱FX系列PLC与三菱变频器通讯应用实例
- c语言程序设计慕课版答案潘晟旻,附件1团队及组成.doc
- python读取微博文本数据,对微博文本进行分句(分句主要以特定的标点符号为主)。...
- 用idea将一个java文件打包成可执行jar包并能正确运行
- 开源自主导航小车MickX4(三)底盘ROS节点
- 对象存储Minio 客户端工具类,实现文件上传、图像压缩、图像添加水印
- Caff-Opencv——图像分类(01)
- discuz!代码内置颜色大全(收藏)
- 小商品销售平台+后台管理系统(day2-day5)练习小项目~