資料介紹
JFFS2 是一個開放源碼的項目(www.infradead.org)。 它是在閃存上使用非常廣泛的讀/寫文件系統(tǒng),在嵌入式系統(tǒng)中被普遍的應用。這篇文章首先分析了在閃存上使用 JFFS2 的必要性,然后詳細的闡述了 JFFS2 實現(xiàn)的內(nèi)部機制,包括日志結(jié)構(gòu)的文件系統(tǒng),關鍵的數(shù)據(jù)結(jié)構(gòu),掛載過程和垃圾收集機制。同時也指出了 JFFS2 的局限性,并介紹了最新的針對 JFFS2 的不足進行改進的補丁程序。最后對 JFFS3 的設計思想和現(xiàn)在的開發(fā)狀況給予了簡單的介紹。
1. 為什么需要 JFFS2
這一小節(jié)首先介紹了閃存相對于磁盤介質(zhì)的特別之處,然后分析了將磁盤文件系統(tǒng)運行在閃存上的不足,同時也給出了我們使用 JFFS2 的理由。
1.1 閃存(Flash Memory) 的特性和限制
這里所介紹的閃存的特性和限制都是從上層的文件系統(tǒng)的角度來看的,而不會涉及到具體的物理特性。總的來說,有兩種類型的 flash memory: NOR flash 和 NAND flash. 先介紹一下這兩種閃存所具有的共同特性。
A) 閃存的最小尋址單位是字節(jié)(byte),而不是磁盤上的扇區(qū)(sector)。這意味著我們可以從一塊閃存的任意偏移(offset)讀數(shù)據(jù),但并不表明對閃存寫操作也是以字節(jié)為單位進行的。我們會在下面的闡述中找到答案。
B) 當一塊閃存處在干凈的狀態(tài)時(被擦寫過,但是還沒有寫操作發(fā)生),在這塊flash上的每一位(bit)都是邏輯1。
C) 閃存上的每一位(bit)可以被寫操作置成邏輯0。 可是把邏輯 0 置成邏輯 1 卻不能按位(bit)來操作,而只能按擦寫塊(erase block)為單位進行擦寫操作。擦寫塊的大小從 4K 到128K 不等。從上層來看,擦寫所完成的功能就是把擦寫塊內(nèi)的每一位都重設置(reset)成邏輯 1。
D) 閃存的使用壽命是有限的。具體來說,閃存的使用壽命是由擦寫塊的最大可擦寫次數(shù)來決定的。超過了最大可擦寫次數(shù),這個擦寫塊就成為壞塊(bad block)了。因此為了避免某個擦寫塊被過度擦寫,以至于它先于其他的擦寫塊達到最大可擦寫次數(shù),我們應該在盡量小的影響性能的前提下,使擦寫操作均勻的分布在每個擦寫塊上。這個過程叫做磨損平衡(wear leveling)。
NOR flash 與 NAND flash 的不同之處:
A) NOR flash 讀/寫操作的基本單位是字節(jié);而 NAND flash 又把擦寫塊分成頁(page), 頁是寫操作的基本單位,一般一個頁的大小是 512 或 2K 個字節(jié)。對于一個頁的重復寫操作次數(shù)是有限制的,不同廠商生產(chǎn)的 NAND flash 有不同的限制,有些是一次,有些是四次,六次或十次。
B) 按照現(xiàn)在的技術水平,一般來說NOR flash擦寫塊的最大可擦寫次數(shù)在十萬次左右,NAND flash擦寫塊的最大可擦寫次數(shù)在百萬次左右。
1.2 閃存轉(zhuǎn)換層
將磁盤文件系統(tǒng)(ext2, FAT)運行在閃存上的很自然的方法就是在文件系統(tǒng)和閃存之間提供一個閃存轉(zhuǎn)換層(Flash Translation Layer), 它的功能就是將底層的閃存模擬成一個具有 512字節(jié)扇區(qū)大小的標準塊設備(block device)。對于文件系統(tǒng)來說,就像工作在一個普通的塊設備上一樣,沒有任何的差別。
圖一
一個閃存轉(zhuǎn)換層的最簡單的實現(xiàn)就是將模擬的塊設備一對一的映射到閃存上。舉例來說,當上層的文件系統(tǒng)要寫一個塊設備的扇區(qū)時,閃存轉(zhuǎn)換層要做下面的操作來完成這個寫請求:
1 將這個扇區(qū)所在擦寫塊地數(shù)據(jù)讀到內(nèi)存中,放在緩存(buffer)中
2 將緩存中與這個扇區(qū)對應的內(nèi)容用新的內(nèi)容替換掉
3 對該擦寫塊執(zhí)行擦寫操作
4 將緩沖中的數(shù)據(jù)寫回該擦寫塊
這種實現(xiàn)方式的缺點是很明顯的:
1 效率低,對一個扇區(qū)的更新要重寫整個擦寫塊上的數(shù)據(jù),造成數(shù)據(jù)帶寬很大的浪費。
2 沒有提供磨損平衡,那些被頻繁更新的數(shù)據(jù)所在擦寫塊將首先變成壞塊。
3 非常不安全,很容易引起數(shù)據(jù)的丟失。如果在上面的第三步和第四步之間發(fā)生了突然掉電(power loss),那么整個擦寫塊中的數(shù)據(jù)就全部丟失了。這在突然掉電經(jīng)常發(fā)生的嵌入式系統(tǒng)中是不能接受的。
MTD 中的內(nèi)核模塊 mtdblock 就是基于這種機制實現(xiàn)的,同時還作了一些優(yōu)化。只有當文件系統(tǒng)的寫請求超過了一個擦寫塊的邊界的時候,它才會執(zhí)行對閃存的擦寫,寫回操作。
因此,為了解決上面這種實現(xiàn)方式的問題,閃存轉(zhuǎn)換層需要做更多的事情。閃存轉(zhuǎn)換層不能只實現(xiàn)這種一對一的映射,而需要將模擬塊設備的扇區(qū)存儲在閃存的不同位置,并且維持扇區(qū)到閃存的映射關系。更進一步,閃存轉(zhuǎn)換層還必須能理解上層文件系統(tǒng)的語義,否則閃存轉(zhuǎn)換層沒辦法做垃圾回收(Garbage Collection)。這樣實現(xiàn)最大的問題就是效率不高,具體來說,閃存轉(zhuǎn)換層為了能理解上層文件系統(tǒng)的語義,必須對文件系統(tǒng)的每個寫請求進行解析,這勢必帶來寫操作性能的下降。另外要求文件系統(tǒng)下面的一層去理解文件系統(tǒng)的語義,很顯然這不是最好的解決方式。我們還有很好的解決問題的方法,就是實現(xiàn)一個特別針對閃存的文件系統(tǒng)。而 JFFS2 就是一個這樣的文件系統(tǒng)。
2. JFFS2
有 JFFS2 就要有 JFFS v1,沒錯,JFFS v1 最初是由瑞典的 Axis Communications AB 公司開發(fā)的,使用在他們的嵌入式設備中,并且在 1999 年末基于 GNU GPL 發(fā)布出來。最初的發(fā)布版本基于 Linux 內(nèi)核 2.0,后來 RedHat 將它移植到 Linux 內(nèi)核 2.2,做了大量的測試和 bug fix 的工作使它穩(wěn)定下來,并且對簽約客戶提供商業(yè)支持。但是在使用的過程中,JFFS v1 設計中的局限被不斷的暴露出來。于是在 2001 年初的時候,RedHat 決定實現(xiàn)一個新的閃存文件系統(tǒng),這就是現(xiàn)在的 JFFS2。下面將詳細介紹 JFFS2 設計中主要的思想,關鍵的數(shù)據(jù)結(jié)構(gòu)和垃圾收集機制。這將為我們實現(xiàn)一個閃存上的文件系統(tǒng)提供很好的啟示。首先,JFFS2 是一個日志結(jié)構(gòu)(log-structured)的文件系統(tǒng),包含數(shù)據(jù)和原數(shù)據(jù)(meta-data)的節(jié)點在閃存上順序的存儲。JFFS2 之所以選擇日志結(jié)構(gòu)的存儲方式,是因為對閃存的更新應該是 out-of-place 的更新方式,而不是對磁盤的 in-place 的更新方式。在閃存上 in-place 更新方式的問題我們已經(jīng)在閃存轉(zhuǎn)換層一節(jié)描述過了。
1. 為什么需要 JFFS2
這一小節(jié)首先介紹了閃存相對于磁盤介質(zhì)的特別之處,然后分析了將磁盤文件系統(tǒng)運行在閃存上的不足,同時也給出了我們使用 JFFS2 的理由。
1.1 閃存(Flash Memory) 的特性和限制
這里所介紹的閃存的特性和限制都是從上層的文件系統(tǒng)的角度來看的,而不會涉及到具體的物理特性。總的來說,有兩種類型的 flash memory: NOR flash 和 NAND flash. 先介紹一下這兩種閃存所具有的共同特性。
A) 閃存的最小尋址單位是字節(jié)(byte),而不是磁盤上的扇區(qū)(sector)。這意味著我們可以從一塊閃存的任意偏移(offset)讀數(shù)據(jù),但并不表明對閃存寫操作也是以字節(jié)為單位進行的。我們會在下面的闡述中找到答案。
B) 當一塊閃存處在干凈的狀態(tài)時(被擦寫過,但是還沒有寫操作發(fā)生),在這塊flash上的每一位(bit)都是邏輯1。
C) 閃存上的每一位(bit)可以被寫操作置成邏輯0。 可是把邏輯 0 置成邏輯 1 卻不能按位(bit)來操作,而只能按擦寫塊(erase block)為單位進行擦寫操作。擦寫塊的大小從 4K 到128K 不等。從上層來看,擦寫所完成的功能就是把擦寫塊內(nèi)的每一位都重設置(reset)成邏輯 1。
D) 閃存的使用壽命是有限的。具體來說,閃存的使用壽命是由擦寫塊的最大可擦寫次數(shù)來決定的。超過了最大可擦寫次數(shù),這個擦寫塊就成為壞塊(bad block)了。因此為了避免某個擦寫塊被過度擦寫,以至于它先于其他的擦寫塊達到最大可擦寫次數(shù),我們應該在盡量小的影響性能的前提下,使擦寫操作均勻的分布在每個擦寫塊上。這個過程叫做磨損平衡(wear leveling)。
NOR flash 與 NAND flash 的不同之處:
A) NOR flash 讀/寫操作的基本單位是字節(jié);而 NAND flash 又把擦寫塊分成頁(page), 頁是寫操作的基本單位,一般一個頁的大小是 512 或 2K 個字節(jié)。對于一個頁的重復寫操作次數(shù)是有限制的,不同廠商生產(chǎn)的 NAND flash 有不同的限制,有些是一次,有些是四次,六次或十次。
B) 按照現(xiàn)在的技術水平,一般來說NOR flash擦寫塊的最大可擦寫次數(shù)在十萬次左右,NAND flash擦寫塊的最大可擦寫次數(shù)在百萬次左右。
1.2 閃存轉(zhuǎn)換層
將磁盤文件系統(tǒng)(ext2, FAT)運行在閃存上的很自然的方法就是在文件系統(tǒng)和閃存之間提供一個閃存轉(zhuǎn)換層(Flash Translation Layer), 它的功能就是將底層的閃存模擬成一個具有 512字節(jié)扇區(qū)大小的標準塊設備(block device)。對于文件系統(tǒng)來說,就像工作在一個普通的塊設備上一樣,沒有任何的差別。
圖一
一個閃存轉(zhuǎn)換層的最簡單的實現(xiàn)就是將模擬的塊設備一對一的映射到閃存上。舉例來說,當上層的文件系統(tǒng)要寫一個塊設備的扇區(qū)時,閃存轉(zhuǎn)換層要做下面的操作來完成這個寫請求:
1 將這個扇區(qū)所在擦寫塊地數(shù)據(jù)讀到內(nèi)存中,放在緩存(buffer)中
2 將緩存中與這個扇區(qū)對應的內(nèi)容用新的內(nèi)容替換掉
3 對該擦寫塊執(zhí)行擦寫操作
4 將緩沖中的數(shù)據(jù)寫回該擦寫塊
這種實現(xiàn)方式的缺點是很明顯的:
1 效率低,對一個扇區(qū)的更新要重寫整個擦寫塊上的數(shù)據(jù),造成數(shù)據(jù)帶寬很大的浪費。
2 沒有提供磨損平衡,那些被頻繁更新的數(shù)據(jù)所在擦寫塊將首先變成壞塊。
3 非常不安全,很容易引起數(shù)據(jù)的丟失。如果在上面的第三步和第四步之間發(fā)生了突然掉電(power loss),那么整個擦寫塊中的數(shù)據(jù)就全部丟失了。這在突然掉電經(jīng)常發(fā)生的嵌入式系統(tǒng)中是不能接受的。
MTD 中的內(nèi)核模塊 mtdblock 就是基于這種機制實現(xiàn)的,同時還作了一些優(yōu)化。只有當文件系統(tǒng)的寫請求超過了一個擦寫塊的邊界的時候,它才會執(zhí)行對閃存的擦寫,寫回操作。
因此,為了解決上面這種實現(xiàn)方式的問題,閃存轉(zhuǎn)換層需要做更多的事情。閃存轉(zhuǎn)換層不能只實現(xiàn)這種一對一的映射,而需要將模擬塊設備的扇區(qū)存儲在閃存的不同位置,并且維持扇區(qū)到閃存的映射關系。更進一步,閃存轉(zhuǎn)換層還必須能理解上層文件系統(tǒng)的語義,否則閃存轉(zhuǎn)換層沒辦法做垃圾回收(Garbage Collection)。這樣實現(xiàn)最大的問題就是效率不高,具體來說,閃存轉(zhuǎn)換層為了能理解上層文件系統(tǒng)的語義,必須對文件系統(tǒng)的每個寫請求進行解析,這勢必帶來寫操作性能的下降。另外要求文件系統(tǒng)下面的一層去理解文件系統(tǒng)的語義,很顯然這不是最好的解決方式。我們還有很好的解決問題的方法,就是實現(xiàn)一個特別針對閃存的文件系統(tǒng)。而 JFFS2 就是一個這樣的文件系統(tǒng)。
2. JFFS2
有 JFFS2 就要有 JFFS v1,沒錯,JFFS v1 最初是由瑞典的 Axis Communications AB 公司開發(fā)的,使用在他們的嵌入式設備中,并且在 1999 年末基于 GNU GPL 發(fā)布出來。最初的發(fā)布版本基于 Linux 內(nèi)核 2.0,后來 RedHat 將它移植到 Linux 內(nèi)核 2.2,做了大量的測試和 bug fix 的工作使它穩(wěn)定下來,并且對簽約客戶提供商業(yè)支持。但是在使用的過程中,JFFS v1 設計中的局限被不斷的暴露出來。于是在 2001 年初的時候,RedHat 決定實現(xiàn)一個新的閃存文件系統(tǒng),這就是現(xiàn)在的 JFFS2。下面將詳細介紹 JFFS2 設計中主要的思想,關鍵的數(shù)據(jù)結(jié)構(gòu)和垃圾收集機制。這將為我們實現(xiàn)一個閃存上的文件系統(tǒng)提供很好的啟示。首先,JFFS2 是一個日志結(jié)構(gòu)(log-structured)的文件系統(tǒng),包含數(shù)據(jù)和原數(shù)據(jù)(meta-data)的節(jié)點在閃存上順序的存儲。JFFS2 之所以選擇日志結(jié)構(gòu)的存儲方式,是因為對閃存的更新應該是 out-of-place 的更新方式,而不是對磁盤的 in-place 的更新方式。在閃存上 in-place 更新方式的問題我們已經(jīng)在閃存轉(zhuǎn)換層一節(jié)描述過了。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- FAT32文件系統(tǒng)基礎知識 31次下載
- FAT32文件系統(tǒng)的存儲機制介紹和在單片機上的實現(xiàn)說明 14次下載
- FAT32文件系統(tǒng)說明 16次下載
- 如何制作一個自啟動的Linux根文件系統(tǒng) 1次下載
- JFFS2文件系統(tǒng)在天熠操作系統(tǒng)中的實現(xiàn) 0次下載
- 基于Cramfs的根文件系統(tǒng)配置 23次下載
- FAT32文件系統(tǒng)結(jié)構(gòu)的技術參數(shù)分析
- FAT32文件系統(tǒng)淺析
- 基于s3c2410的CramFS根文件系統(tǒng)的移植
- JFFS2文件系統(tǒng)存儲策略研究
- JFFS2文件系統(tǒng)超級塊管理改進
- uClinux 下JFFS2 文件系統(tǒng)的實現(xiàn)
- 適合嵌入式Linux應用的文件系統(tǒng)—— JFFS
- 適合嵌入式Linux應用的文件系統(tǒng)—— JFFS
- 基于S3C44B0X微處理器的JFFS2件系統(tǒng)的實現(xiàn)
- 如何修改buildroot和debian文件系統(tǒng) 254次閱讀
- Windows文件系統(tǒng)過濾驅(qū)動程序介紹 1241次閱讀
- 事務性日志結(jié)構(gòu)文件系統(tǒng)的設計及實現(xiàn) 541次閱讀
- Linux 文件系統(tǒng)層的主要結(jié)構(gòu) 872次閱讀
- F2FS文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu) 3728次閱讀
- 深入剖析Linux內(nèi)核虛擬文件系統(tǒng) 2952次閱讀
- 什么是分布式文件系統(tǒng) 3990次閱讀
- 一文解讀文件系統(tǒng)的作用性(二) 1668次閱讀
- 嵌入式Linux啟動時間優(yōu)化的秘密之二文件系統(tǒng) 4987次閱讀
- 使用RT-Thread文件系統(tǒng) 8484次閱讀
- spi nor flash應用匯總 淺談spi flash應用原理 1.8w次閱讀
- 文件系統(tǒng)是什么?淺談EXT文件系統(tǒng)歷史 5548次閱讀
- debian安裝zfs文件系統(tǒng) 1w次閱讀
- 玩轉(zhuǎn)Linux,先把文件系統(tǒng)搞懂 2009次閱讀
- 基于DSP視頻系統(tǒng)的CF卡FAT文件系統(tǒng)設計 1640次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統(tǒng)的設計與實現(xiàn)
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發(fā)板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多