UBI系統原理分析

綜述

UBI全稱Unsorted Block Images,是一種原始flash設備的卷管理系統。這個系統能在一個物理的flash設備上管理操縱多個卷並且能在整個flash芯片上實現損耗均衡。

從某種意義上說,UBI和LVM有點相似,LVM將邏輯扇區映射到物理扇區上面,UBI映射邏輯擦除塊到物理擦除塊。但是除了映射,UBI還實現了全局的損耗均衡和透明的I/O錯誤處理。

  一個UBI卷就是一串連續的邏輯擦除塊。每一個邏輯擦除塊可以被映射到任何一個物理擦除塊上面。這個映射是由UBI管理,這種映射對用戶是透明的,同時這種映射也是UBI實現全局的損耗均衡的基礎。通過每一個物理擦除塊記錄的擦除計數,可以將數據從損耗嚴重的物理塊轉移到損耗較少的擦除塊。

  UBI卷的大小在卷被創建的時候被指定,這個大小也可以動態的被改變。有用戶空間工具可以用來操作UBI卷。

  總共有兩種類型的UBI卷,一種是動態卷,一種是靜態卷。靜態卷是隻讀的,內容被CRC-32校驗保護。動態卷可讀可寫,上層軟件負責數據完整性。

  UBI能管理flash的壞塊,這樣上層軟件可以不需要考慮壞塊。UBI有一個預留的物理塊池,當一個物理擦除塊壞掉了,UBI會利用預留的塊來替代這個壞塊。UBI將數據從新出現的壞塊上轉移到預留的好塊上面。這個功能的好處就是應用層軟件不會感知到底層的I/O錯誤。

  NAND Flash在讀寫的時候可能會出現bit翻轉,bit翻轉可以被ECC校驗來糾正,但是這種現象長期積累會導致數據丟失。UBI將出現bit翻轉塊上的數據轉移到其它塊上面。這種機制叫做沖刷,沖刷過程在後臺完成,對上層軟件是透明的。

  下面是UBI特性的列表

1. UBI提供一種卷的機制,可以動態創建、刪除、重設置卷大小等操作

2. UBI在整個Flash設備上提供了損耗平衡的機制,你可以不斷的對某一個邏輯擦除塊進行擦除,UBI會將你的操作均勻分散到其它各個物理塊上面。

3. UBI透明的處理Flash上面的壞塊

4. UBI通過沖刷機制最大限度的減小數據丟失的機率

5. UBI和MTD分析對比,有如下的特點。

6. 兩者都由擦除塊組成,在UBI中是邏輯擦除塊,在MTD分區中是物理擦除塊。

7. 兩者都支持三種基本的擦做,read、write和erase

8. UBI卷沒有擦除塊損耗均衡的限制,用戶層軟件不需要關注損耗均衡,簡化了用戶層軟件的設計

9. UBI卷沒有壞塊的情況需要考慮,這也使得上層軟件設計簡單

10. UBI卷可以被動態創建、刪除和重新分配大小,而MTD分區是靜態的。

11. UBI能處理bit翻轉的情況,用戶層軟件不需要考慮bit翻轉

12. UBI提供了卷升級操作,這樣可以簡單的探測軟件升級的中斷並且予以恢復

13. UBI提供了原子邏輯擦除塊更換操作,這個操作允許更改邏輯擦除塊中的內容過程中如果遇到了斷電重啓等情況不會丟失原來邏輯擦除塊中的內容。這個功能對上層軟件比如文件系統特別有用。

14. UBI提供un-map操作,這種操作只是將邏輯塊和物理塊之間的映射去除掉,然後調度物理塊進行後臺擦除操作,這個過程非常迅速,上層軟件不需要等待較長的擦除時間。

  UBI 對外提供一種塊設備,允許隨機訪問,塊適應的文件系統掛載在UBI捲上面。實現這種功能的主要原因是UBI卷不需要考慮壞塊。

  另外UBI還額外提供一種叫做gluebi的驅動來在UBI捲上模擬MTD設備,這種做法看起來有一點奇怪,因爲UBI本身工作在MTD設備上面,而gluebi又要在UBI上模擬一個MTD設備。但是這種做法實際是可行的,這樣可以在UBI上運行諸如jffs2之類的軟件。儘管如此,新軟件還是能充分利用UBI的特性,讓UBI來處理Flash技術引入的一些問題。

  UBI用戶空間工具

下面列舉了UBI相關的一些工具 ubinfo - 提供從系統中找到的UBI設備、UBI卷的相關信息

1. ubiattach - 鏈接MTD設備(MTD設備描述原始Flash設備)到UBI並且創建相應的UBI設備;

2. ubidetach - ubiattach相反的操作,將MTD設備從UBI設備上去鏈接;

3. ubimkvol - 從UBI設備上創建UBI卷;

4. ubirmvol - 從UBI設備上刪除UBI卷;

5. ubiblock - 管理UBI捲上的block;

6. ubinize - 製作UBI鏡像;

7. ubiformat - 格式化恐的Flash設備,擦除Flash,保存擦除計數,寫入UBI鏡像到Flash;

8. mtdinfo - 報告從系統中找到的UBI設備的信息.

  UBI頭

UBI存儲兩個64字節的文件頭在每一個非壞塊的起始位置

1. 擦除計數頭(或者稱爲EC頭)包含物理擦除塊的擦除次數以及其它一些不太重要的信息

2. 卷標記頭(或者稱爲VID頭)包含了屬於這塊物理擦除塊的卷ID和邏輯塊號,另外包含了其它一些不太重要的信息

所有的UBI頭都使用CRC-32校驗來保護,用戶可以參考/drivers/mtd/ubi/ubi-media.h文件獲得更加詳細的文件頭內容的信息。

當UBI鏈接一個MTD設備時,UBI系統會掃描整個MTD設備,讀取所有的文件頭,並且校驗CRC-32的校驗值。之後UBI系統會記錄每個物理擦除塊的擦除操作計數,同時建立邏輯塊到物理塊的映射到內存中。用戶可以參考後面相關的章節瞭解這個過程的詳細描述。

當UBI系統擦除了一個物理塊,它會在這個物理塊上寫入一個EC頭並且增加擦除計數。這意味着物理擦除塊除了在擦除物理塊到寫入EC頭的這段短暫時間內總有一個EC頭,如果在上述短暫時間內系統發生了斷電等情況,EC頭會丟失或者損壞,這種情況下UBI系統重新寫入一個EC頭並且使用一個整個掃描計算得到的UBI的平均擦除計數作爲EC頭的擦除計數。

邏輯擦除塊的去映射操作只是將邏輯塊從映射的物理塊去映射然後調度物理塊進行擦除操作。擦除操作中EC頭會被直接寫入物理塊中,而VID頭並不寫入物理塊

邏輯擦除塊的映射操作以及當往一個還沒有映射的邏輯塊中寫入內容的時候。UBI尋找一個合適的物理塊並且向其中寫入VID頭(此前EC頭已經被寫入到物理塊中了)。需要注意的是如果向一個已經映射的邏輯塊中寫入內容的話只直接寫入數據到映射到的物理塊而不需要操作UBI頭。

UBI系統爲每一個物理塊維護了兩個文件頭,主要的原因是UBI需要在不同的時間向Flash中寫入不同的信息。這兩個不同的時間點如下面所述。

當一個物理塊被擦除後,UBI需要迅速向物理塊中寫入EC頭記錄這個物理塊的擦除次數。以免這個擦除計數由於斷電重啓而被丟失的概率。

1. 當UBI映射一個物理塊到邏輯塊時,VID頭會被寫入到物理塊中。

2. 當EC頭被寫入到物理塊中的時候,UBI還不清楚這個物理塊將要對應的卷ID和以後將要被映射的邏輯塊號。這就是UBI需要使用兩個分立的文件頭的原因。


    UBI 卷表


    卷表示UBI系統保存在Flash上的一個數據結構,這個數據結構保存了一個UBI設備上面每一個卷的信息。一個卷表是每個卷記錄信息的數組。每個卷記錄信息包含了下面的具體內容:
    卷大小,卷名稱,卷類型(靜態卷或者動態卷),卷對齊,升級標識(如果這個標記被設置標識在卷升級操作中操作被打斷),自動重分配大小標記,這個卷記錄的CRC-32校驗。
    每一條記錄描述一個UBI卷,卷表上記錄的索引表示卷ID。比如說卷0由卷表的第0條表項來描述,以此類推。卷表中的表項由邏輯卷的大小來限制,但是最大不能超過128條表項。這就是說UBI設備不能創建超過128卷。
每次創建、刪除、重新分配卷大小、重新命名卷名、升級操作都會改變相應的卷表項。UBI維護了相同的兩份卷表來增加UBI系統的可靠性。
    具體實現細節
    在UBI系統內部,卷表存儲在特殊用途的捲上面,這個特殊用途的卷被叫做層卷。這個卷只包含了兩個邏輯塊,每一箇中都包含了一個卷表的拷貝。層卷是一種UBI系統的"內部"卷,用戶不能訪問到這個卷,當UBI系統讀寫卷表時,使用和普通卷相同的機制。
UBI使用下面的算法來更新卷表記錄項。
1. 將卷表的內容在內存中準備好。
2. 將層卷中的LEB0邏輯塊進行去映射操作。
3. 將新的卷表項寫入到層卷的LEB0邏輯塊中。
4. 將層卷中的LEB1邏輯塊進行去映射操作。
5. 將新的卷表項寫入到層卷的LEB1邏輯塊中。
6. 刷新UBI的工作隊列確保之前去映射的邏輯塊被擦除掉了


    當UBI鏈接MTD設備的時候,必須確保兩份卷表內容一致。如果兩份卷表的內容不一致,就用LEB0邏輯塊的卷標拷貝覆蓋LEB1邏輯塊的內容。如果其中某一份的內容損壞了,就用那份完整的拷貝覆蓋損壞的內容。


Flash最小的輸入/輸出單位

UBI使用了一種抽象的Flash模型,簡而言之就是,UBI將MTD設備看成事由一個個擦除塊組成的,擦除塊分爲好塊和壞塊。好塊可以進行讀取,寫入,擦除操作。

對Flash的讀寫操作都只能以最小擦除塊的大小進行,這個大小取決於Flash的類型

NOR Flash通常的最小IO大小事1字節,NOR Flash通常允許單字節的對Flash進行讀寫操作,NOR Flash甚至可以對設備上單比特進行操作

NAND Flash通常以512、2048、4096字節作爲設備IO的最小單位,一般這個最小單位就是NAND Flash的一頁的大小。NAND Flash將每一頁的ECC校驗值存儲到OOB區中,這就意味着整個NAND Flash的一頁內容必須一次寫入從而可以計算出整個頁的ECC校驗值。整個頁的內容頁必須一次性讀出以校驗ECC校驗值。Flash設備的最小IO大小是一個很重要的概念,對UBI系統有很多影響,比如說:

UBI系統中VID頭部的位置就取決於Flash設備的最小IO大小,還有UBI系統中邏輯擦除塊的大小也取決於Flash設備的最小IO大小。一般來說,最小IO值越大,邏輯擦除塊反而會越小,原因是UBI頭佔用的空間會越大。

所有對邏輯擦除塊的寫操作都必須是和最小IO值對齊的,必須是最小IO值的整數倍。對於讀操作沒有這樣的限制,事實上在MTD設備層面也是按照最小IO值大小進行讀取的,讀入到一個緩衝空間後,最後只拷貝了用戶請求的字節數目給用戶。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章