找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1274|回复: 3
打印 上一主题 下一主题

Linux flash 文件系统剖析

[复制链接]

100

主题

189

帖子

1631

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1631
跳转到指定楼层
1#
发表于 2008-6-20 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
您之前可能听说过 Journaling Flash File System(JFFS)和 Yet Another Flash File System(YAFFS),但是您知道使用底层 flash 设备的文件系统意味着什么吗?本文将向您介绍 Linux® 的 flash 文件系统,并探索它们如何通过平均读写(wear leveling)处理底层的可消耗设备(flash 部件),并鉴别各种不同的 flash 文件系统以及它们的基本设计。
固态驱动器当前非常流行,但是嵌入式系统很久以前就开始使用固态驱动器进行存储。您可以看到 flash 系统被用于个人数字助理(PDA)、手机、MP3 播放器、数码相机、USB flash 驱动(UFD),甚至笔记本电脑。很多情况下,商业设备的文件系统可以进行定制并且是专有的,但是它们会遇到以下挑战。9 R, F4 _: Q# _. O0 I2 }: H( p
developerWorks 上 Tim 所著的其他剖析…… 系列文章# w, ^6 U8 C0 [1 r) X
基于 Flash 的文件系统形式多种多样。本文将探讨几种只读文件系统,并回顾目前可用的各种读/写文件系统及其工作原理。但是,让我们先看看 flash 设备及其所面对的挑战。. j0 @& j8 v4 e+ V. c
Flash 内存技术: t1 M# h! p3 C. h
Flash 内存(可以通过几种不同的技术实现)是一种非挥发性内存,这意味着断开电源之后其内容仍然保持下来。要了解 flash 内存的辉煌历史,请参阅 参考资料
; B0 U) Q) p% @" u/ Z# H两种最常见的 flash 设备类型为:NOR 和 NAND。基于 NOR 的 flash 技术比较早,它支持较高的读性能,但以降低容量为代价。NAND flash 提供更大容量的同时实现快速的写擦性能。NAND 还需要更复杂的输入/输出(I/O)接口。
2 j# ]2 B0 x  x/ y! n9 ~Flash 部件通常分为多个分区,允许同时进行多个操作(擦除某个分区的同时读取另一个分区)。分区再划分为(通常大小为 64KB 或 128KB)。使用分区的固件可以进一步对块进行独特的分段 — 例如,一个块中有 512 字节的分段,但不包括元数据。
5 I1 A6 T7 ~, a, K7 v7 i( |8 KFlash 设备有一个常见的限制,即与其他存储设备(如 RAM 磁盘)相比,它需要进行设备管理。flash 内存设备中惟一允许的 Write 操作是将 1 修改为 0。如果需要撤销操作,那么必须擦除整个块(将所有数据重置回状态 1)。这意味着必须删除该块中的其他有效数据来实现持久化。NOR flash 内存通常一次可以编写一个字节,而 NAND flash 内存必须编写多个字节(通常为 512 字节)。 . F! G% b$ C" {6 R% `: O; n
这两种内存类型在擦除块方面有所不同。每种类型都需要一个特殊的 Erase 操作,该操作可以涵盖 flash 内存中的一个整块。NOR 技术需要通过一个准备步骤将所有值清零,然后再开始 Erase 操作。Erase 是针对 flash 设备的特殊操作,非常耗费时间。擦除操作与电有关,它将整个块的所有单元中的电子放掉。
% M9 F& ^. |2 |* r: J% UNOR flash 设备通常需要花费几秒时间来执行 Erase 操作,而 NAND 设备只需要几毫秒。flash 设备的一个关键特性是可执行的 Erase 操作的数量。在 NOR 设备中,flash 内存中的每个块可被擦除 100,000 次,而在 NAND flash 内存中可达到一百万次。 ) U9 H0 M- |3 m- @

" C" T- @( c( e0 N$ n
" S3 C; @  u" C

6 n) ?: [9 S, W0 x

; @. i7 q9 ^- f+ V
回页首

! j# w" b; I2 j+ R2 S' H' ^4 f
1 z- O4 F9 q8 Q6 n5 T: k! s  ]+ JFlash 内存面临的挑战; T* E) O9 c) @# A: m0 C% w. ]
除了前面提到的一些限制以外,管理 flash 设备还面临很多挑战。三个最重大的挑战分别是垃圾收集、管理坏块和平均读写。 + t3 K2 K& R5 q% `
垃圾收集  M; s' }. L5 x5 g6 t. b: b2 Y
垃圾收集 是一个回收无效块的过程(无效块中包含了一些无效数据)。回收过程包括将有效数据移动到新块,然后擦除无效块从而使它变为可用。如果文件系统的可用空间较少,那么通常将在后台执行这一过程(或者根据需要执行)。
1 I1 H9 Y; G6 W5 p管理坏块
5 f+ n1 n/ K& F* t0 E用的时间长了,flash 设备就会出现坏块,甚至在出厂时就会因出现坏块而不能使用。如果 flash 操作(例如 Erase)失败,或者 Write 操作无效(通过无效的错误校正代码发现,Error Correction Code,ECC),那么说明出现了坏块。0 w/ Y; _* u, z4 V- ?0 l# |8 Q3 b5 s
识别出坏块后,将在 flash 内部将这些坏块标记到一个坏块表中。具体操作取决于设备,但是可以通过一组独立的预留块来(不同于普通数据块管理)实现。对坏块进行处理的过程 — 不管是出厂时就有还是在使用过程中出现 — 称为坏块管理。在某些情况下,可以通过一个内部微控制器在硬件中实现,因此对于上层文件系统是透明的。
" A4 i/ S- X% Z平均读写# w, S2 P7 F! b; @
前面提到 flash 设备属于耗损品:在变成坏块以前,可以执行有限次数的反复的 Erase 操作(因此必须由坏块管理进行标记)。平均读写算法能够最大化 flash 的寿命。平均读写有两种形式:动态平均读写静态平均读写1 i1 w1 W+ N1 E, @: T8 Y1 c2 o
动态平均读写解决了块的 Erase 周期的次数限制。动态平均读写算法并不是随机使用可用的块,而是平均使用块,因此,每个块都获得了相同的使用机会。静态平均读写算法解决了一个更有趣的问题。除了最大化 Erase 周期的次数外,某些 flash 设备在两个 Erase 周期之间还受到最大化 Read 周期的影响。这意味着如果数据在块中存储的时间太长并且被读了很多次,数据会逐渐消耗直至丢失。静态平均读写算法解决了这一问题,因为它可以定期将数据移动到新块。$ {6 k/ V! Q& s4 c

" L# N( w0 o+ P* L( }! d/ Z
9 g5 e: m; {5 @+ {" ]4 `

! X1 [4 j( h* [
; L8 R- j6 ^  @2 ^# z3 o* C
回页首

6 |4 i& j4 T( F$ B7 s' T$ D' O' ~' k! u
系统架构
7 w4 Z* P; r% |8 S: y& T7 u' }/ c到目前为止,我已经讨论了 flash 设备及其面临的基本挑战。现在,让我们看看这些设备如何组合成为一个分层架构的一部分(参加图 1)。架构的顶层是虚拟文件系统(VFS),它为高级应用程序提供通用接口。VFS 下面是 flash 文件系统(将在下节介绍)。接下来是 Flash 转换层(Flash Translation Layer,FTL),它整体管理 flash 设备,包括从底层 flash 设备分配块、地址转换、动态平均读写和垃圾收集。在某些 flash 设备中,可以在硬件中实现一部分 FTL 。' \0 k4 }: W  t7 `& p  _6 i

" A0 ^/ ~4 H4 {图 1. flash 系统的基本架构 8 v' C' p& x7 J6 ?

  [! m4 \7 \" lLinux 内核使用内存技术设备(Memory Technology Device,MTD)接口,这是针对 flash 系统的通用接口。MTD 可以自动检测 flash 设备总线的宽度以及实现总线宽度所需设备的数量。) B2 g# }+ I5 w

( x3 Z/ k8 {7 E4 x4 \8 [. E
. ^& N* l% i$ U  ~$ `* e7 d6 u
3 S0 X6 J6 k+ i# g9 l  X+ D. [
( O, G' T  g2 a! H" s+ ?1 z
回页首

. F. C. e- K9 N' G% ]! ?# o( l) t
4 g, v& f+ b+ N- _! J& FFlash 文件系统% ^0 G" B) _0 S! z2 @  `
Linux 可以使用多种 flash 文件系统。下一小节将解释每种文件系统的设计和优点。
/ Z* K& D$ ^/ X- ~3 UJournaling Flash File System
+ Y0 p1 b8 q7 Q  \; |' \$ ~Journaling Flash File System 是针对 Linux 的最早 flash 文件系统之一。 JFFS 是一种专门为 NOR flash 设备设计的日志结构文件系统。它非常独特,能够解决许多 flash 设备问题,但同时也导致一些新问题。
7 C5 |" o( C( S! b5 y4 ]! AJFFS 将 flash 设备视为一种循环的块日志。写入 flash 的数据被写到了空间的末尾,开始部分的块则被收回,而两者之间的空间是空闲的;当空间变少时,将执行垃圾收集。垃圾收集器将有效块移动到日志的尾部,跳过无效或废弃块,并擦除它们(参见图 2)。因此这种文件系统可以自动实现静态和动态平均读写。这种架构的主要缺点是过于频繁地执行擦除操作(而没有使用最佳擦除策略),从而使设备迅速磨损。- a" y6 K7 f" G5 A1 l6 L# Z: E

" U  X9 P( q2 w# ?图 2. 在垃圾收集之前和之后循环日志& H0 w+ d9 K9 f) L6 d# E2 p* j
5 d4 W4 X) A, C( E
挂载 JFFS 时结构细节将读取到内存中,这将延缓挂载时间并消耗更多的内存。 / C% {1 p5 e% U: f# P  _
Journaling Flash File System 2% ~4 E# o* ?: B( y; ]0 N3 B) g
尽管 JFFS 在早期非常有用,但是它的平均读写算法容易缩短 NOR flash 设备的寿命。因此重新设计了底层算法,去掉了循环日志。JFFS2 算法专门为 NAND flash 设备设计,并且改善压缩性能。. b7 `2 j2 ~. N8 ^! _8 A$ b
在 JFFS2 中,flash 中的每个块都是单独处理的。JFFS2 通过维护块列表来充分地对设备执行平均读写。clean 列表表示设备中的块全部为有效节点。dirty 列表中的块至少包含有一个废弃节点。最后,free 列表包含曾经执行过擦除操作并且可以使用的块。
9 G% C8 q5 |" q; |; d" Z垃圾收集算法通过合理的方法智能地判断应该回收的块。目前,这个算法根据概率从 clean 或 dirty 列表中选择。dirty 列表的选择概率为 99%(将有效内容移到另一个块),而 clean 列表的选择概率为 1%(将内容移到新的块)。在这两种情况中,对选择的块执行擦除操作,然后将其置于 free 列表(参见图 3)。这允许垃圾收集器重用废弃的块,但是仍然围绕 flash 移动数据,以支持静态平均读写。$ E, V6 x7 B: n& ~( d1 O5 c

" }- p3 y$ ?# O) p/ H: S( P图 3. JFFS2 中的块管理和垃圾收集" C% t" d% _$ B. U6 H

& M8 H' O( y+ TYet Another Flash File System+ A2 J$ H0 ?) L) K* C
YAFFS 是针对 NAND flash 开发的另一种 flash 文件系统。最早的版本(YAFFS)支持 512 字节页面的 flash 设备,但是较新的版本(YAFFS2)支持页面更大的新设备以及更大的 Write 限制。 , Z- ^5 ~% @' z: T
大多数 flash 文件系统会对废弃块进行标记,但是 YAFFS2 使用单调递增数字序列号额外地标记块。在挂载期间扫描文件系统时,可以快速标识有效的 inode。YAFFS 保留在 RAM 中的树以表示 flash 设备的块结构,包括通过检查点(checkpointing)实现快速挂载 — 这个过程将在正常卸载时将 RAM 树结构保存到 flash 设备,以在挂载时快速读取和恢复到 RAM(参见图 4)。与其他 flash 文件系统相比,YAFFS2 的挂载时性能是它的最大优势。
2 r- l# J" `4 O( n& l0 Y* ~$ c  n! h
图 4. YAFFS2 中的块管理和垃圾收集
4 Q/ P6 L# }5 y& R% D* N1 J3 ^' F
& v: E7 q# y  J! N+ E8 L2 b3 P2 }7 b) K2 e

% D  P0 O, S/ b2 w( w  K8 H
. r' F- d! A6 ]: N
6 z; Y3 x3 \- D6 @+ s; C
回页首

3 k( G5 i5 L4 ~# C5 ?: x( y3 s' C6 {* b# i5 X% P& E
只读式压缩文件系统
$ b! C6 P& s+ a4 u在某些嵌入式系统中,没有必要提供可更改的文件系统:一个不可更改(immutable)的文件系统已经足够。Linux 支持多种只读文件系统,最有用的两种是 cramfsSquashFS3 f  F! m2 u. K- c3 t( C
Cramfs8 u' f6 Q( a' n3 R7 b
cramfs 文件系统是一种可用于 flash 设备的压缩式 Linux 只读文件系统。cramfs 的主要特点是简单和较高的空间利用率。这种文件系统用于内存占用较小的嵌入式设计。
6 V+ X. `; [* c& j2 B) @虽然 cramfs 元数据没有经过压缩,但是 cramfs 针对每个页面使用 zlib 压缩,从而允许随机的页面访问(访问时对页面进行解压缩)。6 o4 S7 e5 R# E2 E0 p' p
您可以通过 mkcramfs 实用工具和 loopback 设备尝试使用 cramfs。 . w: X& A6 a6 S/ N# R( I$ `- Q
SquashFS9 x, ]" @/ ~5 c4 C4 ~
SquashFS 是另一种可用于 flash 设备的压缩式 Linux 只读文件系统。您可以在很多 Live CD Linux 发行版中找到 SquashFS。除了支持 zlib 压缩外,SquashFS 还使用 Lembel-Ziv-Markov chain Algorithm (LZMA) 改善压缩并提高速度。 $ n4 D9 |9 O; x1 l& E2 |8 V8 I
和 cramfs 一样,您可以通过 mksquashfs 和 loopback 设备在标准 Linux 系统上使用 SquashFS。
% [# B4 s9 c: W6 z2 F
9 |# P6 l5 o% }. s0 H

- W5 x8 A) p* L& i3 y+ @
' m2 S6 ?! d, s7 z# `) u  M
" w. ~# T1 a: i; k: {! w
回页首
2 u6 t9 h% J* {6 v
, |& S, t3 K( I' l3 \
结束语
) m8 h; A1 X# P) m4 R4 n/ M/ Q+ k- |和大多数开放源码一样,软件在不断演变,并且新的 flash 文件系统正在开发之中。一种还处于开发阶段的有趣的备选文件系统是 LogFS,它包含了一些非常新颖的想法。例如,LogFS 在 flash 设备中保持了一个树结构,因此挂载时间和传统的文件系统差不多(比如 ext2)。它还使用一种复杂的树实现垃圾收集(一种 B+树形式)。然而,LogFS 最有趣的地方是它具有出色的可伸缩性并且支持大型 flash 部件。
; O2 ^4 R" M  L0 l4 g随着 flash 文件系统的日益流行,您将看到针对它们的大量研究。LogFS 就是一个例子,但是其他类似于 UbiFS 的文件系统也在不断发展。Flash 文件系统的架构非常有趣,并在还将是未来技术创新的源泉。

评分

参与人数 1贡献 +20 收起 理由
Allen + 20 感谢分享

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

4

主题

35

帖子

-8957

积分

未知游客(0)

积分
-8957
2#
发表于 2011-11-13 22:45 | 只看该作者
学习了,谢谢

5

主题

1254

帖子

2680

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2680
3#
发表于 2011-11-14 17:33 | 只看该作者
谢谢分享!!

5

主题

188

帖子

3973

积分

五级会员(50)

Rank: 5

积分
3973
4#
发表于 2011-11-14 18:59 | 只看该作者
做个记号,慢慢看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-5-2 13:01 , Processed in 0.064888 second(s), 37 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表