資料介紹
JFFS2 是一個開放源碼的項目(www.infradead.org)。 它是在閃存上使用非常廣泛的讀/寫文件系統(tǒng),在嵌入式系統(tǒng)中被普遍的應(yīng)用。這篇文章首先分析了在閃存上使用 JFFS2 的必要性,然后詳細的闡述了 JFFS2 實現(xiàn)的內(nèi)部機制,包括日志結(jié)構(gòu)的文件系統(tǒng),關(guān)鍵的數(shù)據(jù)結(jié)構(gòu),掛載過程和垃圾收集機制。同時也指出了 JFFS2 的局限性,并介紹了最新的針對 JFFS2 的不足進行改進的補丁程序。最后對 JFFS3 的設(shè)計思想和現(xiàn)在的開發(fā)狀況給予了簡單的介紹。
1. 為什么需要 JFFS2
這一小節(jié)首先介紹了閃存相對于磁盤介質(zhì)的特別之處,然后分析了將磁盤文件系統(tǒng)運行在閃存上的不足,同時也給出了我們使用 JFFS2 的理由。
1.1 閃存(Flash Memory) 的特性和限制
這里所介紹的閃存的特性和限制都是從上層的文件系統(tǒng)的角度來看的,而不會涉及到具體的物理特性??偟膩碚f,有兩種類型的 flash memory: NOR flash 和 NAND flash. 先介紹一下這兩種閃存所具有的共同特性。
A) 閃存的最小尋址單位是字節(jié)(byte),而不是磁盤上的扇區(qū)(sector)。這意味著我們可以從一塊閃存的任意偏移(offset)讀數(shù)據(jù),但并不表明對閃存寫操作也是以字節(jié)為單位進行的。我們會在下面的闡述中找到答案。
B) 當(dāng)一塊閃存處在干凈的狀態(tài)時(被擦寫過,但是還沒有寫操作發(fā)生),在這塊flash上的每一位(bit)都是邏輯1。
C) 閃存上的每一位(bit)可以被寫操作置成邏輯0。 可是把邏輯 0 置成邏輯 1 卻不能按位(bit)來操作,而只能按擦寫塊(erase block)為單位進行擦寫操作。擦寫塊的大小從 4K 到128K 不等。從上層來看,擦寫所完成的功能就是把擦寫塊內(nèi)的每一位都重設(shè)置(reset)成邏輯 1。
D) 閃存的使用壽命是有限的。具體來說,閃存的使用壽命是由擦寫塊的最大可擦寫次數(shù)來決定的。超過了最大可擦寫次數(shù),這個擦寫塊就成為壞塊(bad block)了。因此為了避免某個擦寫塊被過度擦寫,以至于它先于其他的擦寫塊達到最大可擦寫次數(shù),我們應(yīng)該在盡量小的影響性能的前提下,使擦寫操作均勻的分布在每個擦寫塊上。這個過程叫做磨損平衡(wear leveling)。
NOR flash 與 NAND flash 的不同之處:
A) NOR flash 讀/寫操作的基本單位是字節(jié);而 NAND flash 又把擦寫塊分成頁(page), 頁是寫操作的基本單位,一般一個頁的大小是 512 或 2K 個字節(jié)。對于一個頁的重復(fù)寫操作次數(shù)是有限制的,不同廠商生產(chǎn)的 NAND flash 有不同的限制,有些是一次,有些是四次,六次或十次。
B) 按照現(xiàn)在的技術(shù)水平,一般來說NOR flash擦寫塊的最大可擦寫次數(shù)在十萬次左右,NAND flash擦寫塊的最大可擦寫次數(shù)在百萬次左右。
1.2 閃存轉(zhuǎn)換層
將磁盤文件系統(tǒng)(ext2, FAT)運行在閃存上的很自然的方法就是在文件系統(tǒng)和閃存之間提供一個閃存轉(zhuǎn)換層(Flash Translation Layer), 它的功能就是將底層的閃存模擬成一個具有 512字節(jié)扇區(qū)大小的標(biāo)準(zhǔn)塊設(shè)備(block device)。對于文件系統(tǒng)來說,就像工作在一個普通的塊設(shè)備上一樣,沒有任何的差別。
圖一

一個閃存轉(zhuǎn)換層的最簡單的實現(xiàn)就是將模擬的塊設(shè)備一對一的映射到閃存上。舉例來說,當(dāng)上層的文件系統(tǒng)要寫一個塊設(shè)備的扇區(qū)時,閃存轉(zhuǎn)換層要做下面的操作來完成這個寫請求:
1 將這個扇區(qū)所在擦寫塊地數(shù)據(jù)讀到內(nèi)存中,放在緩存(buffer)中
2 將緩存中與這個扇區(qū)對應(yīng)的內(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)化。只有當(dāng)文件系統(tǒng)的寫請求超過了一個擦寫塊的邊界的時候,它才會執(zhí)行對閃存的擦寫,寫回操作。
因此,為了解決上面這種實現(xiàn)方式的問題,閃存轉(zhuǎn)換層需要做更多的事情。閃存轉(zhuǎn)換層不能只實現(xiàn)這種一對一的映射,而需要將模擬塊設(shè)備的扇區(qū)存儲在閃存的不同位置,并且維持扇區(qū)到閃存的映射關(guān)系。更進一步,閃存轉(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ā)的,使用在他們的嵌入式設(shè)備中,并且在 1999 年末基于 GNU GPL 發(fā)布出來。最初的發(fā)布版本基于 Linux 內(nèi)核 2.0,后來 RedHat 將它移植到 Linux 內(nèi)核 2.2,做了大量的測試和 bug fix 的工作使它穩(wěn)定下來,并且對簽約客戶提供商業(yè)支持。但是在使用的過程中,JFFS v1 設(shè)計中的局限被不斷的暴露出來。于是在 2001 年初的時候,RedHat 決定實現(xiàn)一個新的閃存文件系統(tǒng),這就是現(xiàn)在的 JFFS2。下面將詳細介紹 JFFS2 設(shè)計中主要的思想,關(guān)鍵的數(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)的存儲方式,是因為對閃存的更新應(yīng)該是 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)的角度來看的,而不會涉及到具體的物理特性??偟膩碚f,有兩種類型的 flash memory: NOR flash 和 NAND flash. 先介紹一下這兩種閃存所具有的共同特性。
A) 閃存的最小尋址單位是字節(jié)(byte),而不是磁盤上的扇區(qū)(sector)。這意味著我們可以從一塊閃存的任意偏移(offset)讀數(shù)據(jù),但并不表明對閃存寫操作也是以字節(jié)為單位進行的。我們會在下面的闡述中找到答案。
B) 當(dāng)一塊閃存處在干凈的狀態(tài)時(被擦寫過,但是還沒有寫操作發(fā)生),在這塊flash上的每一位(bit)都是邏輯1。
C) 閃存上的每一位(bit)可以被寫操作置成邏輯0。 可是把邏輯 0 置成邏輯 1 卻不能按位(bit)來操作,而只能按擦寫塊(erase block)為單位進行擦寫操作。擦寫塊的大小從 4K 到128K 不等。從上層來看,擦寫所完成的功能就是把擦寫塊內(nèi)的每一位都重設(shè)置(reset)成邏輯 1。
D) 閃存的使用壽命是有限的。具體來說,閃存的使用壽命是由擦寫塊的最大可擦寫次數(shù)來決定的。超過了最大可擦寫次數(shù),這個擦寫塊就成為壞塊(bad block)了。因此為了避免某個擦寫塊被過度擦寫,以至于它先于其他的擦寫塊達到最大可擦寫次數(shù),我們應(yīng)該在盡量小的影響性能的前提下,使擦寫操作均勻的分布在每個擦寫塊上。這個過程叫做磨損平衡(wear leveling)。
NOR flash 與 NAND flash 的不同之處:
A) NOR flash 讀/寫操作的基本單位是字節(jié);而 NAND flash 又把擦寫塊分成頁(page), 頁是寫操作的基本單位,一般一個頁的大小是 512 或 2K 個字節(jié)。對于一個頁的重復(fù)寫操作次數(shù)是有限制的,不同廠商生產(chǎn)的 NAND flash 有不同的限制,有些是一次,有些是四次,六次或十次。
B) 按照現(xiàn)在的技術(shù)水平,一般來說NOR flash擦寫塊的最大可擦寫次數(shù)在十萬次左右,NAND flash擦寫塊的最大可擦寫次數(shù)在百萬次左右。
1.2 閃存轉(zhuǎn)換層
將磁盤文件系統(tǒng)(ext2, FAT)運行在閃存上的很自然的方法就是在文件系統(tǒng)和閃存之間提供一個閃存轉(zhuǎn)換層(Flash Translation Layer), 它的功能就是將底層的閃存模擬成一個具有 512字節(jié)扇區(qū)大小的標(biāo)準(zhǔn)塊設(shè)備(block device)。對于文件系統(tǒng)來說,就像工作在一個普通的塊設(shè)備上一樣,沒有任何的差別。
圖一

一個閃存轉(zhuǎn)換層的最簡單的實現(xiàn)就是將模擬的塊設(shè)備一對一的映射到閃存上。舉例來說,當(dāng)上層的文件系統(tǒng)要寫一個塊設(shè)備的扇區(qū)時,閃存轉(zhuǎn)換層要做下面的操作來完成這個寫請求:
1 將這個扇區(qū)所在擦寫塊地數(shù)據(jù)讀到內(nèi)存中,放在緩存(buffer)中
2 將緩存中與這個扇區(qū)對應(yīng)的內(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)化。只有當(dāng)文件系統(tǒng)的寫請求超過了一個擦寫塊的邊界的時候,它才會執(zhí)行對閃存的擦寫,寫回操作。
因此,為了解決上面這種實現(xiàn)方式的問題,閃存轉(zhuǎn)換層需要做更多的事情。閃存轉(zhuǎn)換層不能只實現(xiàn)這種一對一的映射,而需要將模擬塊設(shè)備的扇區(qū)存儲在閃存的不同位置,并且維持扇區(qū)到閃存的映射關(guān)系。更進一步,閃存轉(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ā)的,使用在他們的嵌入式設(shè)備中,并且在 1999 年末基于 GNU GPL 發(fā)布出來。最初的發(fā)布版本基于 Linux 內(nèi)核 2.0,后來 RedHat 將它移植到 Linux 內(nèi)核 2.2,做了大量的測試和 bug fix 的工作使它穩(wěn)定下來,并且對簽約客戶提供商業(yè)支持。但是在使用的過程中,JFFS v1 設(shè)計中的局限被不斷的暴露出來。于是在 2001 年初的時候,RedHat 決定實現(xiàn)一個新的閃存文件系統(tǒng),這就是現(xiàn)在的 JFFS2。下面將詳細介紹 JFFS2 設(shè)計中主要的思想,關(guān)鍵的數(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)的存儲方式,是因為對閃存的更新應(yīng)該是 out-of-place 的更新方式,而不是對磁盤的 in-place 的更新方式。在閃存上 in-place 更新方式的問題我們已經(jīng)在閃存轉(zhuǎn)換層一節(jié)描述過了。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- FAT32文件系統(tǒng)基礎(chǔ)知識 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ù)參數(shù)分析
- FAT32文件系統(tǒng)淺析
- 基于s3c2410的CramFS根文件系統(tǒng)的移植
- JFFS2文件系統(tǒng)存儲策略研究
- JFFS2文件系統(tǒng)超級塊管理改進
- uClinux 下JFFS2 文件系統(tǒng)的實現(xiàn)
- 適合嵌入式Linux應(yīng)用的文件系統(tǒng)—— JFFS
- 適合嵌入式Linux應(yīng)用的文件系統(tǒng)—— JFFS
- 基于S3C44B0X微處理器的JFFS2件系統(tǒng)的實現(xiàn)
- 如何修改buildroot和debian文件系統(tǒng) 524次閱讀
- Windows文件系統(tǒng)過濾驅(qū)動程序介紹 1551次閱讀
- 事務(wù)性日志結(jié)構(gòu)文件系統(tǒng)的設(shè)計及實現(xiàn) 770次閱讀
- Linux 文件系統(tǒng)層的主要結(jié)構(gòu) 1034次閱讀
- F2FS文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu) 4301次閱讀
- 深入剖析Linux內(nèi)核虛擬文件系統(tǒng) 3108次閱讀
- 什么是分布式文件系統(tǒng) 4286次閱讀
- 一文解讀文件系統(tǒng)的作用性(二) 1767次閱讀
- 嵌入式Linux啟動時間優(yōu)化的秘密之二文件系統(tǒng) 5196次閱讀
- 使用RT-Thread文件系統(tǒng) 8889次閱讀
- spi nor flash應(yīng)用匯總 淺談spi flash應(yīng)用原理 1.8w次閱讀
- 文件系統(tǒng)是什么?淺談EXT文件系統(tǒng)歷史 5723次閱讀
- debian安裝zfs文件系統(tǒng) 1w次閱讀
- 玩轉(zhuǎn)Linux,先把文件系統(tǒng)搞懂 2083次閱讀
- 基于DSP視頻系統(tǒng)的CF卡FAT文件系統(tǒng)設(shè)計 1723次閱讀
下載排行
本周
- 1EMC電路設(shè)計工程師必備的EMC基礎(chǔ)
- 0.42 MB | 4次下載 | 2 積分
- 2AU3116 2×60W模擬輸入雙通道Class-D 音頻功率放大器數(shù)據(jù)手冊
- 1.19 MB | 1次下載 | 免費
- 3低壓降肖特基整流管SR340L數(shù)據(jù)手冊
- 0.78 MB | 1次下載 | 免費
- 4ZX8002E 觸摸調(diào)光LED集成IC數(shù)據(jù)手冊
- 2.27 MB | 次下載 | 免費
- 5SOD-323塑料封裝ESD保護二極管SD05T系列規(guī)格書
- 1.07 MB | 次下載 | 免費
- 6SOT-23塑料封裝ESD保護二極管SMxx Series系列規(guī)格書
- 0.93 MB | 次下載 | 免費
- 7高效率整流二極管HER151 THRU HER158數(shù)據(jù)手冊
- 0.54 MB | 次下載 | 免費
- 8低壓降肖特基整流管SL22 THRU SL210數(shù)據(jù)手冊
- 1.03 MB | 次下載 | 免費
本月
- 1三相逆變主電路的原理圖和PCB資料合集免費下載
- 27.35 MB | 111次下載 | 1 積分
- 2運算放大器基本電路中文資料
- 1.30 MB | 16次下載 | 免費
- 3蘋果iphone 11電路原理圖
- 4.98 MB | 11次下載 | 5 積分
- 4TL494工業(yè)用開關(guān)電源原理圖資料
- 0.22 MB | 10次下載 | 1 積分
- 5常用電子元器件介紹
- 3.21 MB | 8次下載 | 免費
- 6QW2893應(yīng)急燈專用檢測芯片
- 590.40 KB | 4次下載 | 免費
- 7相關(guān)協(xié)議信號總結(jié)
- 0.94 MB | 4次下載 | 免費
- 8EMC電路設(shè)計工程師必備的EMC基礎(chǔ)
- 0.42 MB | 4次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935130次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191390次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183344次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81591次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65989次下載 | 10 積分
評論