<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Filesystem on 涯余的博客</title><link>https://hangyan.github.io/categories/filesystem/</link><description>Recent content in Filesystem on 涯余的博客</description><generator>Hugo</generator><language>zh</language><managingEditor>hang.yan@hotmail.com (涯余)</managingEditor><webMaster>hang.yan@hotmail.com (涯余)</webMaster><lastBuildDate>Sat, 20 Apr 2019 22:35:17 +0800</lastBuildDate><atom:link href="https://hangyan.github.io/categories/filesystem/index.xml" rel="self" type="application/rss+xml"/><item><title>JFFS3 文件系统</title><link>https://hangyan.github.io/post/2019-04-20-jffs3/</link><pubDate>Sat, 20 Apr 2019 22:35:17 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2019-04-20-jffs3/</guid><description>&lt;!-- toc --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#%e9%97%aa%e5%ad%98%e5%af%b9%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e7%9a%84%e5%bd%b1%e5%93%8d"&gt;闪存对文件系统的影响&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#%e9%97%aa%e5%ad%98%e8%bd%ac%e6%8d%a2%e5%b1%82"&gt;闪存转换层&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#jffs3"&gt;JFFS3&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#jffs2-%e7%9a%84%e9%97%ae%e9%a2%98"&gt;JFFS2 的问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#index-%e7%9a%84%e5%ad%98%e5%82%a8"&gt;Index 的存储&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#the-journal"&gt;The Journal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#garbage-collection"&gt;Garbage collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#superblock"&gt;Superblock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-20-jffs3/#links"&gt;Links&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- tocstop --&gt;
&lt;p&gt;看完了&lt;a href="https://hangyan.github.io/post/2019-04-18-flash/"&gt;闪存&lt;/a&gt;,继续看文件系统。网上搜了一圈，发现都是讲 Andriod 的目录结构的，讲文件系统本身的少。目前能确认的是历史上曾经用过 ext4,yaffs,yaffs2 等。
估计目前主流的应该是 ext4。不过在搜索的时候先发现了一篇讲 jffs3 的，它在嵌入式系统上应用比较广泛，也是针对 Flash 存储特定设计的文件系统。不太确定现在的使用范围，但是拿出来研究下还是不错的。&lt;/p&gt;
&lt;h2 id="闪存对文件系统的影响"&gt;闪存对文件系统的影响&lt;/h2&gt;
&lt;p&gt;闪存跟磁盘有很多不同的地方，在设计文件系统的时候，二者有很多不同的考量。简单的对比表格如下&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center"&gt;&lt;/th&gt;
&lt;th style="text-align: center"&gt;闪存&lt;/th&gt;
&lt;th style="text-align: center"&gt;磁盘&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;最小寻址单位(读)&lt;/td&gt;
&lt;td style="text-align: center"&gt;字节&lt;/td&gt;
&lt;td style="text-align: center"&gt;扇区&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;最小寻址单位(写)&lt;/td&gt;
&lt;td style="text-align: center"&gt;NOR FLASH 是字节，NAND FLASH 是页，擦除是块&lt;/td&gt;
&lt;td style="text-align: center"&gt;扇区&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;寿命&lt;/td&gt;
&lt;td style="text-align: center"&gt;由擦写块的最大可擦写次数&lt;/td&gt;
&lt;td style="text-align: center"&gt;机械故障&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;闪存的这些特性，导致我们在设计文件系统的时候，必须考虑以下的问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;out of place update&lt;/code&gt;: 对于磁盘来讲，我们更新数据可以直接原地更新。但是闪存不行，因为无法将 bit 位从 0 -&amp;gt; 1。所以对于闪存的数据更新只能是在另外一个地方写入数据，然后将原数据标记为 dirty,再通过 GC 来定期回收.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wear leveling&lt;/code&gt;: 磨损平衡。闪存的使用寿命是由擦写块的最大可擦写次数来决定的。超过了最大可擦写次数，这个擦写块就成为坏块(bad block)了。因此为了避免某个擦写块被过度擦写，以至于它先于其他的擦写块达到最大可擦写次数，我们应该在尽量小的影响性能的前提下，使擦写操作均匀的分布在每个擦写块上&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="闪存转换层"&gt;闪存转换层&lt;/h3&gt;
&lt;p&gt;为了能让普通的文件系统(磁盘上的)能够在闪存上正常运行，需要有一个转换层：Flash Translation Layer（FTL）。它的功能就是将底层的闪存模拟成一个具有 512 字节扇区大小的标准块设备(block device)。对于文件系统来说，就像工作在一个普通的块设备上一样，没有任何的差别。&lt;/p&gt;</description></item></channel></rss>