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

一個(gè)閃存轉(zhuǎn)換層的最簡單的實(shí)現(xiàn)就是將模擬的塊設(shè)備一對(duì)一的映射到閃存上。舉例來說,當(dāng)上層的文件系統(tǒng)要寫一個(gè)塊設(shè)備的扇區(qū)時(shí),閃存轉(zhuǎn)換層要做下面的操作來完成這個(gè)寫請(qǐng)求:
1 將這個(gè)扇區(qū)所在擦寫塊地?cái)?shù)據(jù)讀到內(nèi)存中,放在緩存(buffer)中
2 將緩存中與這個(gè)扇區(qū)對(duì)應(yīng)的內(nèi)容用新的內(nèi)容替換掉
3 對(duì)該擦寫塊執(zhí)行擦寫操作
4 將緩沖中的數(shù)據(jù)寫回該擦寫塊
這種實(shí)現(xiàn)方式的缺點(diǎn)是很明顯的:
1 效率低,對(duì)一個(gè)扇區(qū)的更新要重寫整個(gè)擦寫塊上的數(shù)據(jù),造成數(shù)據(jù)帶寬很大的浪費(fèi)。
2 沒有提供磨損平衡,那些被頻繁更新的數(shù)據(jù)所在擦寫塊將首先變成壞塊。
3 非常不安全,很容易引起數(shù)據(jù)的丟失。如果在上面的第三步和第四步之間發(fā)生了突然掉電(power loss),那么整個(gè)擦寫塊中的數(shù)據(jù)就全部丟失了。這在突然掉電經(jīng)常發(fā)生的嵌入式系統(tǒng)中是不能接受的。
MTD 中的內(nèi)核模塊 mtdblock 就是基于這種機(jī)制實(shí)現(xiàn)的,同時(shí)還作了一些優(yōu)化。只有當(dāng)文件系統(tǒng)的寫請(qǐng)求超過了一個(gè)擦寫塊的邊界的時(shí)候,它才會(huì)執(zhí)行對(duì)閃存的擦寫,寫回操作。
因此,為了解決上面這種實(shí)現(xiàn)方式的問題,閃存轉(zhuǎn)換層需要做更多的事情。閃存轉(zhuǎn)換層不能只實(shí)現(xiàn)這種一對(duì)一的映射,而需要將模擬塊設(shè)備的扇區(qū)存儲(chǔ)在閃存的不同位置,并且維持扇區(qū)到閃存的映射關(guān)系。更進(jìn)一步,閃存轉(zhuǎn)換層還必須能理解上層文件系統(tǒng)的語義,否則閃存轉(zhuǎn)換層沒辦法做垃圾回收(Garbage Collection)。這樣實(shí)現(xiàn)最大的問題就是效率不高,具體來說,閃存轉(zhuǎn)換層為了能理解上層文件系統(tǒng)的語義,必須對(duì)文件系統(tǒng)的每個(gè)寫請(qǐng)求進(jìn)行解析,這勢必帶來寫操作性能的下降。另外要求文件系統(tǒng)下面的一層去理解文件系統(tǒng)的語義,很顯然這不是最好的解決方式。我們還有很好的解決問題的方法,就是實(shí)現(xiàn)一個(gè)特別針對(duì)閃存的文件系統(tǒng)。而 JFFS2 就是一個(gè)這樣的文件系統(tǒng)。
2. JFFS2
有 JFFS2 就要有 JFFS v1,沒錯(cuò),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)定下來,并且對(duì)簽約客戶提供商業(yè)支持。但是在使用的過程中,JFFS v1 設(shè)計(jì)中的局限被不斷的暴露出來。于是在 2001 年初的時(shí)候,RedHat 決定實(shí)現(xiàn)一個(gè)新的閃存文件系統(tǒng),這就是現(xiàn)在的 JFFS2。下面將詳細(xì)介紹 JFFS2 設(shè)計(jì)中主要的思想,關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)和垃圾收集機(jī)制。這將為我們實(shí)現(xiàn)一個(gè)閃存上的文件系統(tǒng)提供很好的啟示。首先,JFFS2 是一個(gè)日志結(jié)構(gòu)(log-structured)的文件系統(tǒng),包含數(shù)據(jù)和原數(shù)據(jù)(meta-data)的節(jié)點(diǎn)在閃存上順序的存儲(chǔ)。JFFS2 之所以選擇日志結(jié)構(gòu)的存儲(chǔ)方式,是因?yàn)閷?duì)閃存的更新應(yīng)該是 out-of-place 的更新方式,而不是對(duì)磁盤的 in-place 的更新方式。在閃存上 in-place 更新方式的問題我們已經(jīng)在閃存轉(zhuǎn)換層一節(jié)描述過了。
1. 為什么需要 JFFS2
這一小節(jié)首先介紹了閃存相對(duì)于磁盤介質(zhì)的特別之處,然后分析了將磁盤文件系統(tǒng)運(yùn)行在閃存上的不足,同時(shí)也給出了我們使用 JFFS2 的理由。
1.1 閃存(Flash Memory) 的特性和限制
這里所介紹的閃存的特性和限制都是從上層的文件系統(tǒng)的角度來看的,而不會(huì)涉及到具體的物理特性。總的來說,有兩種類型的 flash memory: NOR flash 和 NAND flash. 先介紹一下這兩種閃存所具有的共同特性。
A) 閃存的最小尋址單位是字節(jié)(byte),而不是磁盤上的扇區(qū)(sector)。這意味著我們可以從一塊閃存的任意偏移(offset)讀數(shù)據(jù),但并不表明對(duì)閃存寫操作也是以字節(jié)為單位進(jìn)行的。我們會(huì)在下面的闡述中找到答案。
B) 當(dāng)一塊閃存處在干凈的狀態(tài)時(shí)(被擦寫過,但是還沒有寫操作發(fā)生),在這塊flash上的每一位(bit)都是邏輯1。
C) 閃存上的每一位(bit)可以被寫操作置成邏輯0。 可是把邏輯 0 置成邏輯 1 卻不能按位(bit)來操作,而只能按擦寫塊(erase block)為單位進(jìn)行擦寫操作。擦寫塊的大小從 4K 到128K 不等。從上層來看,擦寫所完成的功能就是把擦寫塊內(nèi)的每一位都重設(shè)置(reset)成邏輯 1。
D) 閃存的使用壽命是有限的。具體來說,閃存的使用壽命是由擦寫塊的最大可擦寫次數(shù)來決定的。超過了最大可擦寫次數(shù),這個(gè)擦寫塊就成為壞塊(bad block)了。因此為了避免某個(gè)擦寫塊被過度擦寫,以至于它先于其他的擦寫塊達(dá)到最大可擦寫次數(shù),我們應(yīng)該在盡量小的影響性能的前提下,使擦寫操作均勻的分布在每個(gè)擦寫塊上。這個(gè)過程叫做磨損平衡(wear leveling)。
NOR flash 與 NAND flash 的不同之處:
A) NOR flash 讀/寫操作的基本單位是字節(jié);而 NAND flash 又把擦寫塊分成頁(page), 頁是寫操作的基本單位,一般一個(gè)頁的大小是 512 或 2K 個(gè)字節(jié)。對(duì)于一個(gè)頁的重復(fù)寫操作次數(shù)是有限制的,不同廠商生產(chǎn)的 NAND flash 有不同的限制,有些是一次,有些是四次,六次或十次。
B) 按照現(xiàn)在的技術(shù)水平,一般來說NOR flash擦寫塊的最大可擦寫次數(shù)在十萬次左右,NAND flash擦寫塊的最大可擦寫次數(shù)在百萬次左右。
1.2 閃存轉(zhuǎn)換層
將磁盤文件系統(tǒng)(ext2, FAT)運(yùn)行在閃存上的很自然的方法就是在文件系統(tǒng)和閃存之間提供一個(gè)閃存轉(zhuǎn)換層(Flash Translation Layer), 它的功能就是將底層的閃存模擬成一個(gè)具有 512字節(jié)扇區(qū)大小的標(biāo)準(zhǔn)塊設(shè)備(block device)。對(duì)于文件系統(tǒng)來說,就像工作在一個(gè)普通的塊設(shè)備上一樣,沒有任何的差別。
圖一

一個(gè)閃存轉(zhuǎn)換層的最簡單的實(shí)現(xiàn)就是將模擬的塊設(shè)備一對(duì)一的映射到閃存上。舉例來說,當(dāng)上層的文件系統(tǒng)要寫一個(gè)塊設(shè)備的扇區(qū)時(shí),閃存轉(zhuǎn)換層要做下面的操作來完成這個(gè)寫請(qǐng)求:
1 將這個(gè)扇區(qū)所在擦寫塊地?cái)?shù)據(jù)讀到內(nèi)存中,放在緩存(buffer)中
2 將緩存中與這個(gè)扇區(qū)對(duì)應(yīng)的內(nèi)容用新的內(nèi)容替換掉
3 對(duì)該擦寫塊執(zhí)行擦寫操作
4 將緩沖中的數(shù)據(jù)寫回該擦寫塊
這種實(shí)現(xiàn)方式的缺點(diǎn)是很明顯的:
1 效率低,對(duì)一個(gè)扇區(qū)的更新要重寫整個(gè)擦寫塊上的數(shù)據(jù),造成數(shù)據(jù)帶寬很大的浪費(fèi)。
2 沒有提供磨損平衡,那些被頻繁更新的數(shù)據(jù)所在擦寫塊將首先變成壞塊。
3 非常不安全,很容易引起數(shù)據(jù)的丟失。如果在上面的第三步和第四步之間發(fā)生了突然掉電(power loss),那么整個(gè)擦寫塊中的數(shù)據(jù)就全部丟失了。這在突然掉電經(jīng)常發(fā)生的嵌入式系統(tǒng)中是不能接受的。
MTD 中的內(nèi)核模塊 mtdblock 就是基于這種機(jī)制實(shí)現(xiàn)的,同時(shí)還作了一些優(yōu)化。只有當(dāng)文件系統(tǒng)的寫請(qǐng)求超過了一個(gè)擦寫塊的邊界的時(shí)候,它才會(huì)執(zhí)行對(duì)閃存的擦寫,寫回操作。
因此,為了解決上面這種實(shí)現(xiàn)方式的問題,閃存轉(zhuǎn)換層需要做更多的事情。閃存轉(zhuǎn)換層不能只實(shí)現(xiàn)這種一對(duì)一的映射,而需要將模擬塊設(shè)備的扇區(qū)存儲(chǔ)在閃存的不同位置,并且維持扇區(qū)到閃存的映射關(guān)系。更進(jìn)一步,閃存轉(zhuǎn)換層還必須能理解上層文件系統(tǒng)的語義,否則閃存轉(zhuǎn)換層沒辦法做垃圾回收(Garbage Collection)。這樣實(shí)現(xiàn)最大的問題就是效率不高,具體來說,閃存轉(zhuǎn)換層為了能理解上層文件系統(tǒng)的語義,必須對(duì)文件系統(tǒng)的每個(gè)寫請(qǐng)求進(jìn)行解析,這勢必帶來寫操作性能的下降。另外要求文件系統(tǒng)下面的一層去理解文件系統(tǒng)的語義,很顯然這不是最好的解決方式。我們還有很好的解決問題的方法,就是實(shí)現(xiàn)一個(gè)特別針對(duì)閃存的文件系統(tǒng)。而 JFFS2 就是一個(gè)這樣的文件系統(tǒng)。
2. JFFS2
有 JFFS2 就要有 JFFS v1,沒錯(cuò),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)定下來,并且對(duì)簽約客戶提供商業(yè)支持。但是在使用的過程中,JFFS v1 設(shè)計(jì)中的局限被不斷的暴露出來。于是在 2001 年初的時(shí)候,RedHat 決定實(shí)現(xiàn)一個(gè)新的閃存文件系統(tǒng),這就是現(xiàn)在的 JFFS2。下面將詳細(xì)介紹 JFFS2 設(shè)計(jì)中主要的思想,關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)和垃圾收集機(jī)制。這將為我們實(shí)現(xiàn)一個(gè)閃存上的文件系統(tǒng)提供很好的啟示。首先,JFFS2 是一個(gè)日志結(jié)構(gòu)(log-structured)的文件系統(tǒng),包含數(shù)據(jù)和原數(shù)據(jù)(meta-data)的節(jié)點(diǎn)在閃存上順序的存儲(chǔ)。JFFS2 之所以選擇日志結(jié)構(gòu)的存儲(chǔ)方式,是因?yàn)閷?duì)閃存的更新應(yīng)該是 out-of-place 的更新方式,而不是對(duì)磁盤的 in-place 的更新方式。在閃存上 in-place 更新方式的問題我們已經(jīng)在閃存轉(zhuǎn)換層一節(jié)描述過了。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- FAT32文件系統(tǒng)基礎(chǔ)知識(shí) 31次下載
- FAT32文件系統(tǒng)的存儲(chǔ)機(jī)制介紹和在單片機(jī)上的實(shí)現(xiàn)說明 14次下載
- FAT32文件系統(tǒng)說明 16次下載
- 如何制作一個(gè)自啟動(dòng)的Linux根文件系統(tǒng) 1次下載
- JFFS2文件系統(tǒng)在天熠操作系統(tǒng)中的實(shí)現(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)存儲(chǔ)策略研究
- JFFS2文件系統(tǒng)超級(jí)塊管理改進(jìn)
- uClinux 下JFFS2 文件系統(tǒng)的實(shí)現(xiàn)
- 適合嵌入式Linux應(yīng)用的文件系統(tǒng)—— JFFS
- 適合嵌入式Linux應(yīng)用的文件系統(tǒng)—— JFFS
- 基于S3C44B0X微處理器的JFFS2件系統(tǒng)的實(shí)現(xiàn)
- 如何修改buildroot和debian文件系統(tǒng) 524次閱讀
- Windows文件系統(tǒng)過濾驅(qū)動(dòng)程序介紹 1551次閱讀
- 事務(wù)性日志結(jié)構(gòu)文件系統(tǒng)的設(shè)計(jì)及實(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啟動(dòng)時(shí)間優(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è)計(jì) 1723次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論