JFFS2 文件系统及新特性介绍

admin 2019-3-17 110

出自:http://www.ibm.com/developerworks/cn/linux/l-jffs2/   死 赵复 (forrest.zhao@intel.com), 硬件工程师,启源技巧中间(OTC), Intel(China) Software Center 赵复活,硬件工程师,启源技巧中间(OTC),Intel(China) Software Center,经过 forrest.zhao@intel.com 不妨战他接洽。 简介: JFFS2 是一个启搁源码的名目(www.infradead.org)。 它是正在闪存上利用很是普遍的读/写文献零碎,正在嵌进式零碎中被遍及的利用。那篇文章起首阐发了正在闪存上利用 JFFS2 的需要性,而后具体的论述了 JFFS2完成 的外部体制,包含日记布局的文献零碎,关头的数据布局,挂载进程战渣滓搜集体制。共时也指出了 JFFS2 的限制性,并先容了最新的针对于 JFFS2 的缺乏停止改良的补钉法式。最初对于 JFFS3 的安排思惟战此刻的开辟情况赐与了复杂的先容。 1. 为何须要 JFFS2 那一大节起首先容了闪存绝对于磁盘介量的出格的地方,而后阐发了将磁盘文献零碎运转正在闪存上的缺乏,共时也给出了咱们利用 JFFS2 的来由。 1.1 闪存(Flash Memory) 的特征战节制 那里所先容的闪存的特征战节制皆是从下层的文献零碎的角度去瞅的,而没有会触及到详细的物理特征。总的来讲,有二品种型的 flash memory: NOR flash 战 NAND flash. 先先容一下那二种闪存所具备的配合特征。 A) 闪存的最小觅址单元是字节(byte),而没有是磁盘上的扇区(sector)。那表示着咱们不妨从一齐闪存的肆意偏偏移(offset)读数据,但是其实不标明对于闪存写操纵也是以字节为单元停止的。咱们会鄙人里的论述中找到谜底。 B) 当一齐闪存处正在洁净的形态时(被揩写过,可是借不写操纵产生),正在那块flash上的每位(bit)皆是逻辑1。 C) 闪存上的每位(bit)不妨被写操纵置成逻辑0。 但是把逻辑 0 置成逻辑 1 却不克不及按位(bit)去操纵,而只可按揩写块(erase block)为单元停止揩写操纵。揩写块的年夜小从 4K 到128K 没有等。从下层去瞅,揩写所完毕的功效便是把揩写块内的每位皆沉树立(reset)成逻辑 1。 D) 闪存的利用寿命是无限的。详细来讲,闪存的利用寿命是由揩写块的最年夜可揩写次数去决议的。超越了最年夜可揩写次数,那个揩写块便成为坏块(bad block)了。是以为了不某个揩写块被过分揩写,以致于它先于其余的揩写块到达最年夜可揩写次数,咱们应当正在尽可能小的作用功能的条件下,使揩写操纵平均的散布正在每一个揩写块上。那个进程喊干磨益均衡(wear leveling)。 NOR flash 取 NAND flash 的分歧的地方: A) NOR flash 读/写操纵的根本单元是字节;而 NAND flash 又把揩写块分红页(page), 页是写操纵的根本单元,普通一个页的年夜小是 512 或者 2K 个字节。对一个页的反复写操纵次数是无限造的,分歧厂商出产的 NAND flash 有分歧的节制,有些是一次,有些是四次,六次或者十次。 B)依照 此刻的技巧程度,普通来讲NOR flash揩写块的最年夜可揩写次数正在十万次摆布,NAND flash揩写块的最年夜可揩写次数正在百万次摆布。 1.2 闪存变换层 将磁盘文献零碎(ext2, FAT)运转正在闪存上的很天然的办法便是正在文献零碎战闪存之间供给一个闪存变换层(Flash Translation Layer), 它的功效便是将下层的闪存摹拟成一个具备 512字节扇区年夜小的尺度块装备(block device)。对文献零碎来讲,便像任务正在一个通俗的块装备上一般,不所有的不同。
图一
图一
一个闪存变换层的最复杂的完成便是将摹拟的块装备一对于一的映照到闪存上。举例来讲,当下层的文献零碎要写一个块装备的扇区时,闪存变换层要干上面的操纵去完毕那个写恳求: 1 将那个扇区地点揩写块天数据读到内存中,搁正在慢存(buffer)中 2 将慢存中取那个扇区对于应的实质用新的实质交换失落 3 对于该揩写块履行揩写操纵 4 将慢冲中的数据写回该揩写块 这类完成方法的错误谬误是很分明的: 1 效力矮,对于一个扇区的革新要沉写全部揩写块上的数据,形成数据戴宽很年夜的华侈。 2 不供给磨益均衡,那些被频仍革新的数据地点揩写块将起首酿成坏块。 3十分 没有平安,很轻易惹起数据的丧失。假如正在下面的第三步战第四步之间产生了俄然失落电(power loss),那末全部揩写块中的数据便全数丧失了。那正在俄然失落电常常产生的嵌进式零碎中是不克不及承受的。 MTD 中的内核模块 mtdblock 便是鉴于这类体制完成的,共时借做了一些劣化。只要当文献零碎的写恳求超越了一个揩写块的鸿沟的时辰,它才会履行对于闪存的揩写,写回操纵。 是以,为懂得决下面这类完成方法的成绩,闪存变换层须要干更多的工作。闪存变换层不克不及只完成这类二十五味鬼臼丸 http://www.74bj.com/一对于一的映照,而须要将摹拟块装备的扇区保存正在闪存的分歧地位,而且保持扇区到闪存的映照闭系。更进一步,闪存变换层借必需能懂得下层文献零碎的语义,不然闪存变换层出法子干渣滓收受接管(Garbage Collection)。如许完成最年夜的成绩便是效力没有下,详细来讲,闪存变换层为了能懂得下层文献零碎的语义,必需对于文献零碎的每一个写恳求停止剖析,那必将戴去写操纵功能的降低。别的请求文献零碎上面的一层来懂得文献零碎的语义,很明显那没有是最佳的处理方法。咱们借有很佳的处理成绩的办法,便是完成一个出格针对于闪存的文献零碎。而 JFFS2 便是一个如许的文献零碎。
回页尾 2. JFFS2 有 JFFS2 便要有 JFFS v1,出错,JFFS v1最后 是由瑞典的 Axis Communications AB 公司开辟的,利用正在他们的嵌进式装备中,而且正在 1999 年底鉴于 GNU GPL 宣布出去。最后的宣布版本鉴于 Linux 内核 2.0,厥后 RedHat 将它移植到 Linux 内核 2.2,干了年夜量的尝试战 bug fix 的任务使它波动上去,而且对于签约客户供给贸易撑持。可是正在利用的进程中,JFFS v1 安排中的限制被不竭的表露出去。因而正在 2001年终 的时辰,RedHat 决议 完成一个新的闪存文献零碎,那便是此刻的 JFFS2。上面将具体先容 JFFS2 安排中次要的思惟,关头的数据布局战渣滓搜集体制。那将为咱们完成一个闪存上的文献零碎供给很佳的启迪。起首,JFFS2 是一个日记布局(log-structured)的文献零碎,包括数据战原数据(meta-data)的节面正在闪存上挨次的保存。JFFS2 之以是采用日记布局的保存方法,是由于对于闪存的革新应当是 out-of-place 的革新方法,而没有是对于磁盘的 in-place 的革新方法。正在闪存上 in-place 革新方法的成绩咱们曾经正在闪存变换层一节描绘过了。 2.1 节颔首部界说战兼容性 JFFS2 将文献零碎的数据战原数据以节面的方式保存正在闪存上,详细来讲节颔首部的界说以下:
图两
图二
幻数屏障位:0x1985 用去标记 JFFS2 文献零碎。 节面典型:JFFS2本身 界说了三种节面典型,可是思索到文献零碎可扩大性战兼容性,JFFS2从 ext2自创 了经历,节面典型的最下二位被用去界说节面的兼容属性,详细来讲有上面几种兼容属性: JFFS2_FEATURE_INCOMPAT:当 JFFS2 发明了一个不克不及辨认的节面典型,而且它的兼容属性是 JFFS2_FEATURE_INCOMPAT,那末 JFFS2必需 回绝挂载(mount)文献零碎。 JFFS2_FEATURE_ROCOMPAT:当 JFFS2 发明了一个不克不及辨认的节面典型,而且它的兼容属性是 JFFS2_FEATURE_ROCOMPAT,那末 JFFS2必需 以只读的方法挂载文献零碎。 JFFS2_FEATURE_RWCOMPAT_DELETE:当 JFFS2 发明了一个不克不及辨认的节面典型,而且它的兼容属性是 JFFS2_FEATURE_RWCOMPAT_DELETE,那末正在渣滓收受接管的时辰,那个节面不妨被简略。 JFFS2_FEATURE_RWCOMPAT_COPY:当 JFFS2 发明了一个不克不及辨认的节面典型,而且它的兼容属性是 JFFS2_FEATURE_RWCOMPAT_COPY,那末正在渣滓收受接管的时辰,那个节面要被拷贝到新的地位。 节面总少度:包含节颔首战数据的少度。 节颔首部 CRC 校验:包括节颔首部的校验码,为文献零碎的靠得住性供给了撑持。 2.2 节面典型 JFFS2 界说了三种节面典型: JFFS2_NODETYPE_INODE: INODE 节面包括了i-节面的原数据(i节面号,文献的组 ID, 属主 id,拜访 工夫,偏偏移,少度等),文献数据被附正在 INODE 节面以后。除此以外,每一个 INODE 节面借有一个版本号,它被用去保护属于一个i-节面的一切 INODE 节面的齐序闭系。上面举例来讲明那个齐序闭系正在 JFFS2 的利用:
图三
图三
是以,当文献零碎从闪存上读节面疑息后,会天生上面的映照疑息:
图四
图四
按照那个映照疑息表,文献零碎便晓得到响应的 INODE 节面来读与响应的文献实质。最初要阐明的是,JFFS2 撑持文献数据的紧缩保存,是以正在 INODE 节面中借包括了所利用的紧缩算法,正在读与数据的时辰采用响应的紧缩算法去解紧缩。 JFFS2_NODETYPE_DIRENT:DIRENT 节面便是把文献名取 i 节面对于应起去。正在 DIRENT节面中也有一个版本号,那个版本号的感化次要是用去简略一个 dentry。详细来讲,当咱们要从一个目次中简略一个 dentry 时,咱们要写一个 DIRENT 节面,节面中的文献名取被简略的 dentry 中的文献名不异,i 节面号置为 0,共时树立一个更下的版本号。 JFFS2_NODETYPE_CLEANMARKER:当一个揩写块被揩写终了后,CLEANMARKER 节面会被写正在 NOR flash 的开首,或者 NAND flash 的 OOB(Out-Of-Band) 地区去标明那是一个洁净,可写的揩写块。正在 JFFS v1 中,假如扫描到开首的 1K 皆是 0xFF 便以为那个揩写块是洁净的。可是正在实践的尝试中发明,假如正在揩写的进程中俄然失落电,揩写块上也能够会有年夜块持续 0xFF,可是那其实不标明那个揩写块是洁净的。因而咱们须要 CLEANMARKER 节面去切当的标记一个洁净的揩写块。 2.3 JFFS2节面,揩写块正在内存中的暗示战操纵 JFFS2 保护了几个链表去办理揩写块,按照揩写块上的实质,一个揩写块会正在分歧的链表上。详细来讲,当一个揩写块上皆是正当(valid)的节面时,它会正在 clean_list 上;当一个揩写块包括至多一个过期(obsolete)的节面时,它会正在 dirty_list 上;当一个揩写块被揩写终了,并被写进 CLEANMARKER 节面后,它会正在 free_list 上。 凡是环境下,JFFS2 挨次的正在揩写块上写进分歧的节面,曲到一个揩写块被写谦。此时 JFFS2 从 free_list 上与下一个揩写块,持续从揩写块的开首开端写进节面。当 free_list 上揩写块的数目逐步削减到一个事后设定的阀值的时辰,渣滓收受接管便被触收了,为文献零碎清算出更多的可用揩写块。为了削减对于内存的占用,JFFS2 并不把 i 节面一切的疑息皆保存正在内存中,而不过把那些正在恳求到去时不克不及很快取得的疑息保存正在内存中。详细来讲,对正在闪存上的每一个 i 节面,正在内存里皆有一个 struct jffs2_inode_cache 取之对于应,那个布局里保管了 i 节面号,指背 i 节面的毗连数,和一个指背属于那个 i 节面的物理节面链表的指针。一切的 struct jffs2_inode_cache 保存正在一个哈希表中。闪存上的每一个节面正在内存中由一个 struct jffs2_raw_node_ref 暗示,那个布局里保管了此节面的物理偏偏移,总少度,和二个指背 struct jffs2_raw_node_ref 的指针。一个指针指背此节面正在物理揩写块上的下一个节面,另外一个指针指背属于统一个 i-节面的物理节面链表的下一个节面。
图五
图五
正在闪存上的节面的肇端偏偏移皆是 4 字节对于齐的,以是 struct jffs2_inode_cache 中flash_offset 的最矮二位不被用到。JFFS2 恰好操纵最矮位动作此节面能否过期的标识表记标帜。 上面举一例来讲明 JFFS2 是若何利用那些数据布局的。VFS 挪用 iget() 去获得一个 i 节面的疑息,当那个 i 节面没有正在慢存中的时辰,VFS 便会挪用 JFFS2 的 read_inode() 回调函数去获得 i 节面疑息。传给 read_inode() 的参数是 i 节面号,JFFS2 用那个 i 节面号从哈希表中查找响应的 struct jffs2_inode_cache,而后操纵属于那个 i 节面的节面链表从闪存上读进节面疑息,成立近似于表三的映照疑息。 2.4 JFFS2 挂载进程 JFFS2 的挂载进程分为四个阶段: 1) JFFS2 扫描闪存介量,查抄每一个节面 CRC 校验码的正当性,共时分派了 struct jffs2_inode_cache 战 struct jffs2_raw_node_ref 2) 扫描每一个 i 节面的物理节面链表,标记出过期的物理节面;对于每个正当的 dentry 节面,将响应的 jffs2_inode_cache 中的 nlink 减一。 3 找出 nlink 为 0 的 jffs2_inode_cache,开释响应的节面。 4 开释正在扫描进程中利用的姑且疑息。 2.5 JFFS2渣滓 收受接管体制 当 free_list 上的揩写块数太少了,渣滓收受接管便会被触收。渣滓收受接管次要的使命便是收受接管那些曾经过期的节面,可是除此以外它借要思索磨益均衡的成绩。由于假如一味的从 dirty_list上拔取揩写块停止渣滓收受接管,那末 dirty_list 上的揩写块将先于 clean_list 上的揩写块被磨破坏。JFFS2 的处置方法是以 99% 的几率从 dirty_list,1% 的几率从 clean_list 上与一个揩写块上去。由此不妨瞅出 JFFS2 的安排思惟是方向于功能,共时统筹磨益均衡。对于青鹏软膏那个块上每个不过期的节面履行不异的操纵: 1 找出那个节面所属的 i 节面号(睹图五)。 2 挪用 iget(),成立那个 i 节面的文献映照表。 3 找出那个节面上不过期的数据实质,而且假如正当的数据太少,JFFS2 借汇合并相邻的节面。 4 将数据读进倒慢存里,而后将它拷贝到新的揩写块上。 5 将收受接管的节面置为过期。 当揩写块上一切的节面皆被置为过期,便可以揩写那个揩写块,收受接管利用它。
回页尾 3. JFFS2 的缺乏的地方 3.1 挂载工夫太长 JFFS2 的挂载进程须要对于闪存从头至尾的扫描,那个进程是很缓的,咱们正在尝试中发明,挂载一个 16M 的闪存偶尔须要半分钟以上的工夫。 3.2 磨益均衡的随便性(random nature) JFFS2 对于磨益均衡是用几率的办法去处理的,那很易包管磨益均衡简直定性。正在某些环境下,能够形成对于揩写块不用要的揩写操纵;正在某些环境下,又会惹起对于磨益均衡调剂的没有实时。 3.3 很好的扩大性 JFFS2 中有二个处所的处置是 O(N) 的,那使得它的扩大性很好。 起首,挂载工夫共闪存的年夜小,闪存上节面数量成反比。 其次,固然 JFFS2 尽量的削减内存的占用,但是经过下面对于 JFFS2 的先容咱们不妨晓得实践上它对于内存的占用量是共 i 节面数战闪存上的节面数成反比的。 是以正在实践利用中,JFFS2 最年夜能用正在 128M 的闪存上。
回页尾 4. JFFS2 的新特征 比来参加到 JFFS2 中的二个补钉法式辨别处理了下面提到的挂载工夫太长战磨益均衡随便性的成绩。 4.1 磨益块小结补钉法式(erase block summary patch) 那个补钉法式最根本的思惟便是用空间去换工夫。详细来讲,便是将每一个揩写块每一个节面的原数据疑息写正在那个揩写块的最初,当 JFFS2 挂载的时辰,对于每一个揩写块只须要读一次去读与那个小结节面,是以年夜年夜削减了挂载工夫。利用了磨益块小结补钉法式,一个揩写块的布局便像上面如许:
图六
图六
按照咱们的尝试,利用磨益块小结补钉法式,挂载一个 12M 的闪存须要 2~3 秒,挂载一个 16M 的闪存须要 3~4 秒。 4.2改良 的磨益均衡补钉法式 那个补钉法式的根本思惟是,记实每一个揩写块的揩写次数,当闪存上各个揩写块的揩写次数的差异超越某个预约的阀值,开端停止磨益均衡的调剂。调剂的战略是,正在渣滓收受接管时将揩写次数小的揩写块上的数据迁徙到揩写次数年夜的揩写块上。如许一去咱们进步了磨益均衡简直定性,咱们不妨晓得甚么时辰开端磨益均衡的调剂,也能够晓得拔取哪些揩写块停止磨益均衡的调剂。 4.3 揩写块头部补钉法式 正在写改良的磨益均衡补钉法式的进程当中,咱们须要记实每一个揩写块的揩写次数,那个疑息须要记实正在各自的揩写块上。但是咱们发明 JFFS2 中短少一种矫捷的对于每一个揩写块的疑息停止扩大的体制。因而咱们为每一个揩写块引进了揩写块头部(header),那个头部担任记载每一个揩写块的疑息(比方道揩写次数),而且它供给了矫捷的扩大体制,未来假如有新的疑息须要记实,不妨很轻易的参加到头部当中。
回页尾 5. JFFS3 简介 固然不竭有新的补钉法式去进步 JFFS2 的功能,可是不成扩大性是它最年夜的成绩,可是那是它本身安排的后天缺点,是不法子靠后天去补偿的。是以咱们须要一个崭新的文献零碎,而 JFFS3 便是如许的一个文献零碎,JFFS3 的安排方针是撑持年夜容量闪存(>1TB)的文献零碎。JFFS3 取 JFFS2 正在安排上底子的差别正在于,JFFS3 将索引疑息寄存正在闪存上,而 JFFS2将索引疑息保管正在内存中。比方道,由给定的文献内的偏偏移定位到保存介量上的物理偏偏移地点所需的疑息,查找某个目次下一切的目次项所需的疑息皆是索引疑息的一种。 JFFS3如今 借处于安排阶段,文献零碎的根本布局鉴戒了 Reiser4 的安排思惟,全部文献零碎便是一个 B+ 树。JFFS3 的倡议者正任务于渣滓收受接管体制的安排,那是 JFFS3 中最庞杂,也是最富裕挑衅性的部份。JFFS3 的安排文档不妨正在http://www.linux-mtd.infradead.org/doc/jffs3.html失掉 ,有爱好的读者不妨主动介入到 JFFS3 的安排中,颁发本人的见地,介入会商。
回页尾 称谢 正在那里要出格感激David Woodhouse, Artem B. Bityutskiy,Joern 战 Thomas Gleixner,正在介入到JFFS2的开辟进程中,那几位次要的名目保护者(maintainer)不竭天给尔帮忙,耐烦的答复尔的成绩,正在取他们的会商进程中碰碰出良多聪明的水花战富裕开导性的思惟,特别是他们对于尔的补钉法式提出的”刻薄”的成绩,让尔不竭的尽力考虑(thinking hard),不竭的完美它们。尔念这类启搁,忘我,客不雅的精力恰是启源社区的精华地点,吸收着愈来愈多的开辟者介入出去,并使启源社区不竭的强大。
参照材料 JFFS2: http://sources.redhat.com/jffs2/

JFFS3: http://www.linux-mtd.infradead.org/doc/jffs3.html

闭于作家 赵复活,硬件工程师,启源技巧中间(OTC),Intel(China) Software Center,经过 forrest.zhao@intel.com 不妨战他接洽。
“九必须、九不准、九开除”的“三九”队规,许家印对此表示,这是在原来“三六”队规的基础上,进一步从严管理,对大家提出的更高要求,也是恒大的“军规”,是铁...
编辑:熊乃瑾
最新回复 (0)
返回
发新帖