資料介紹
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 就是基于這種機制實現的,同時還作了一些優化。只有當文件系統的寫請求超過了一個擦寫塊的邊界的時候,它才會執行對閃存的擦寫,寫回操作。
因此,為了解決上面這種實現方式的問題,閃存轉換層需要做更多的事情。閃存轉換層不能只實現這種一對一的映射,而需要將模擬塊設備的扇區存儲在閃存的不同位置,并且維持扇區到閃存的映射關系。更進一步,閃存轉換層還必須能理解上層文件系統的語義,否則閃存轉換層沒辦法做垃圾回收(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 更新方式的問題我們已經在閃存轉換層一節描述過了。
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 就是基于這種機制實現的,同時還作了一些優化。只有當文件系統的寫請求超過了一個擦寫塊的邊界的時候,它才會執行對閃存的擦寫,寫回操作。
因此,為了解決上面這種實現方式的問題,閃存轉換層需要做更多的事情。閃存轉換層不能只實現這種一對一的映射,而需要將模擬塊設備的扇區存儲在閃存的不同位置,并且維持扇區到閃存的映射關系。更進一步,閃存轉換層還必須能理解上層文件系統的語義,否則閃存轉換層沒辦法做垃圾回收(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 更新方式的問題我們已經在閃存轉換層一節描述過了。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- FAT32文件系統基礎知識 31次下載
- FAT32文件系統的存儲機制介紹和在單片機上的實現說明 14次下載
- FAT32文件系統說明 16次下載
- 如何制作一個自啟動的Linux根文件系統 1次下載
- JFFS2文件系統在天熠操作系統中的實現 0次下載
- 基于Cramfs的根文件系統配置 23次下載
- FAT32文件系統結構的技術參數分析
- FAT32文件系統淺析
- 基于s3c2410的CramFS根文件系統的移植
- JFFS2文件系統存儲策略研究
- JFFS2文件系統超級塊管理改進
- uClinux 下JFFS2 文件系統的實現
- 適合嵌入式Linux應用的文件系統—— JFFS
- 適合嵌入式Linux應用的文件系統—— JFFS
- 基于S3C44B0X微處理器的JFFS2件系統的實現
- 如何修改buildroot和debian文件系統 254次閱讀
- Windows文件系統過濾驅動程序介紹 1241次閱讀
- 事務性日志結構文件系統的設計及實現 541次閱讀
- Linux 文件系統層的主要結構 872次閱讀
- F2FS文件系統的數據結構 3728次閱讀
- 深入剖析Linux內核虛擬文件系統 2952次閱讀
- 什么是分布式文件系統 3990次閱讀
- 一文解讀文件系統的作用性(二) 1668次閱讀
- 嵌入式Linux啟動時間優化的秘密之二文件系統 4987次閱讀
- 使用RT-Thread文件系統 8484次閱讀
- spi nor flash應用匯總 淺談spi flash應用原理 1.8w次閱讀
- 文件系統是什么?淺談EXT文件系統歷史 5548次閱讀
- debian安裝zfs文件系統 1w次閱讀
- 玩轉Linux,先把文件系統搞懂 2009次閱讀
- 基于DSP視頻系統的CF卡FAT文件系統設計 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的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 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數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 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次下載 | 免費
評論
查看更多