JFFS2?是將節點信息保存在內存中
?
Flash上日志型文件系統的資料,了解到傳統的基于閃存轉換層(FLT)的文件系統存在的主要問題:
1. 效率低。因為每次都要把要修改的數據所在擦寫塊放入內存,產生了許多不必要的讀操作;寫入時,要將原來的擦寫塊擦除,然后再將內存中修改的數據寫入該擦寫塊。這樣就造成了數據帶寬的嚴重浪費。
2. 降低了Flash的壽命。因為有大量無用的擦寫動作,使得許多不需要擦除的塊被擦除重寫,這導致了整個Flash使用壽命的降低。
3. 沒有提供磨損平衡,也會降低Flash的壽命。因為只要一個擦寫塊壞了,整塊Flash也就不能用了,而那些頻繁修改的塊將會比其它塊更快地成為壞塊。
4. 不安全。如果在擦寫過程中突然?掉電?,那么整個擦寫塊的數據將可能丟失。
日志型文件系統(LogFS)就是為解決以上問題而產生的,它將對文件的修改描述成日志,從而減少對Flash的擦寫。只有當擦寫請求超過一個擦寫塊的邊界時,文件系統才會對Flash進行擦寫。這種更新方式也叫out-of-place。
JFFS2?就是Flash上應用最廣的一個日志結構的文件系統。它提供的垃圾回收機制,使得我們不需要馬上對擦寫越界的塊進行擦寫,而只需要將其設置一個標志,標明為臟塊。當可用的塊數不足時,垃圾回收機制才開始回收這些節點。同時,由于JFFS2?基于日志結構,在意外掉電?后仍然可以保持數據的完整性,而不會丟失數據。
然而,JFFS2?仍然有其缺點,這也是人們提出JFFS3的原因。
因為掛載時需要掃描整塊Flash,來確定節點的合法性以及建立必要的數據結構,這使得JFFS2?掛載時間比較長。
又由于JFFS2?是將節點信息保存在內存中的,使得它所占用的內存量和節點數目成正比。
另外,由于JFFS2?是通過隨機方式來實現磨損平衡的,它不能保證磨損平衡的確定性。
?
?
?
日志式文件系統在強調數據完整性的企業級服務器中有著重要的需求,是文件系統發展的方向。日志式文件系統的思想來自于如Oracle等大型數據庫。數據庫操作往往是由多個相關的、相互依賴的子操作組成,任何一個子操作的失敗都意味著整個操作的無效性,對數據庫數據的任何修改都要回復到操作以前的狀態。日志式文件系統采用了類似的技術。??
在分區中保存有一個日志記錄文件,文件系統寫操作首先是對記錄文件進行操作,若整個寫操作由于某種原因(如系統掉電)而中斷,則在下次系統啟動時就會讀日志記錄文件的內容來恢復沒有完成的寫操作。而這個過程一般只需要幾秒鐘到幾分鐘,而不是ext2文件系統的fsck那樣在大型服務器情況下可能需要幾個小時來完成掃描。?
我所說的?損壞的數據并不是指?flash?上的壞塊,?jiffs?是有壞塊管理的,或者說它能夠避開壞塊,不去使用壞塊。
所謂的壞塊,其實就是不能完全擦除干凈的塊,其實還是能寫入數據的。
所謂損壞的數據,?比如你現在的情況,?剛擦除,還沒寫入就掉電了,?這種就算是了。
另外還有一些,比如硬件不夠穩定,導致寫入的數據不完整,?或者驅動寫得不夠健壯,
都有可能引起數據不完整的情況出現,?而這些數據就是?jiffs?不認可的數據,但是?flash?硬件并沒有問題,
或者說這個塊并不是壞塊。
是不是如果一個分區里只要有一個壞block,jffs2就mount不上呢?如果不是這樣的話,那么導致
===========================================
壞的數據可能導致?jiffs2?mount?不起來,?但是?flash?上的壞塊卻不會導致?mount?不起來。
jiffs2?mount?不上的原因只能去讀代碼了,?就是要看哪些情況對程序來書哦是不合法的。
yaffs2的代碼我閱讀過,?jiff2?的沒仔細研究過,所以不好說。。。
至于?flash?IC?自己會標識壞塊,?這個說法也是錯誤的。
標識壞塊要靠軟件去做,或者說驅動去?修改每個?block?的?第一個?page?的?oob?信息。?具體可以參考?nand?flash?的規范。
硬件自己可干不了這事,?具體可參考?內核中的?nand_base.c?和?nand_bbt.c