綜述
UBI全稱Unsorted?Block?Images,是一種原始flash設(shè)備的卷管理系統(tǒng)。這個系統(tǒng)能在一個物理的flash設(shè)備上管理操縱多個卷并且能在整個flash芯片上實(shí)現(xiàn)損耗均衡。
從某種意義上說,UBI和LVM有點(diǎn)相似,LVM將邏輯扇區(qū)映射到物理扇區(qū)上面,UBI映射邏輯擦除塊到物理擦除塊。但是除了映射,UBI還實(shí)現(xiàn)了全局的損耗均衡和透明的I/O錯誤處理。
一個UBI卷就是一串連續(xù)的邏輯擦除塊。每一個邏輯擦除塊可以被映射到任何一個物理擦除塊上面。這個映射是由UBI管理,這種映射對用戶是透明的,同時這種映射也是UBI實(shí)現(xiàn)全局的損耗均衡的基礎(chǔ)。通過每一個物理擦除塊記錄的擦除計數(shù),可以將數(shù)據(jù)從損耗嚴(yán)重的物理塊轉(zhuǎn)移到損耗較少的擦除塊。
UBI卷的大小在卷被創(chuàng)建的時候被指定,這個大小也可以動態(tài)的被改變。有用戶空間工具可以用來操作UBI卷。
總共有兩種類型的UBI卷,一種是動態(tài)卷,一種是靜態(tài)卷。靜態(tài)卷是只讀的,內(nèi)容被CRC-32校驗(yàn)保護(hù)。動態(tài)卷可讀可寫,上層軟件負(fù)責(zé)數(shù)據(jù)完整性。
UBI能管理flash的壞塊,這樣上層軟件可以不需要考慮壞塊。UBI有一個預(yù)留的物理塊池,當(dāng)一個物理擦除塊壞掉了,UBI會利用預(yù)留的塊來替代這個壞塊。UBI將數(shù)據(jù)從新出現(xiàn)的壞塊上轉(zhuǎn)移到預(yù)留的好塊上面。這個功能的好處就是應(yīng)用層軟件不會感知到底層的I/O錯誤。
NAND?Flash在讀寫的時候可能會出現(xiàn)bit翻轉(zhuǎn),bit翻轉(zhuǎn)可以被ECC校驗(yàn)來糾正,但是這種現(xiàn)象長期積累會導(dǎo)致數(shù)據(jù)丟失。UBI將出現(xiàn)bit翻轉(zhuǎn)塊上的數(shù)據(jù)轉(zhuǎn)移到其它塊上面。這種機(jī)制叫做沖刷,沖刷過程在后臺完成,對上層軟件是透明的。
下面是UBI特性的列表
1.?UBI提供一種卷的機(jī)制,可以動態(tài)創(chuàng)建、刪除、重設(shè)置卷大小等操作
2.?UBI在整個Flash設(shè)備上提供了損耗平衡的機(jī)制,你可以不斷的對某一個邏輯擦除塊進(jìn)行擦除,UBI會將你的操作均勻分散到其它各個物理塊上面。
3.?UBI透明的處理Flash上面的壞塊
4.?UBI通過沖刷機(jī)制最大限度的減小數(shù)據(jù)丟失的幾率
5.?UBI和MTD分析對比,有如下的特點(diǎn)。
6.?兩者都由擦除塊組成,在UBI中是邏輯擦除塊,在MTD分區(qū)中是物理擦除塊。
7.?兩者都支持三種基本的擦做,read、write和erase
8.?UBI卷沒有擦除塊損耗均衡的限制,用戶層軟件不需要關(guān)注損耗均衡,簡化了用戶層軟件的設(shè)計
9.?UBI卷沒有壞塊的情況需要考慮,這也使得上層軟件設(shè)計簡單
10.?UBI卷可以被動態(tài)創(chuàng)建、刪除和重新分配大小,而MTD分區(qū)是靜態(tài)的。
11.?UBI能處理bit翻轉(zhuǎn)的情況,用戶層軟件不需要考慮bit翻轉(zhuǎn)
12.?UBI提供了卷升級操作,這樣可以簡單的探測軟件升級的中斷并且予以恢復(fù)
13.?UBI提供了原子邏輯擦除塊更換操作,這個操作允許更改邏輯擦除塊中的內(nèi)容過程中如果遇到了斷電重啟等情況不會丟失原來邏輯擦除塊中的內(nèi)容。這個功能對上層軟件比如文件系統(tǒng)特別有用。
14.?UBI提供un-map操作,這種操作只是將邏輯塊和物理塊之間的映射去除掉,然后調(diào)度物理塊進(jìn)行后臺擦除操作,這個過程非常迅速,上層軟件不需要等待較長的擦除時間。
UBI?對外提供一種塊設(shè)備,允許隨機(jī)訪問,塊適應(yīng)的文件系統(tǒng)掛載在UBI卷上面。實(shí)現(xiàn)這種功能的主要原因是UBI卷不需要考慮壞塊。
另外UBI還額外提供一種叫做gluebi的驅(qū)動來在UBI卷上模擬MTD設(shè)備,這種做法看起來有一點(diǎn)奇怪,因?yàn)閁BI本身工作在MTD設(shè)備上面,而gluebi又要在UBI上模擬一個MTD設(shè)備。但是這種做法實(shí)際是可行的,這樣可以在UBI上運(yùn)行諸如jffs2之類的軟件。盡管如此,新軟件還是能充分利用UBI的特性,讓UBI來處理Flash技術(shù)引入的一些問題。
UBI用戶空間工具
下面列舉了UBI相關(guān)的一些工具?ubinfo?-?提供從系統(tǒng)中找到的UBI設(shè)備、UBI卷的相關(guān)信息
1.?ubiattach?-?鏈接MTD設(shè)備(MTD設(shè)備描述原始Flash設(shè)備)到UBI并且創(chuàng)建相應(yīng)的UBI設(shè)備;
2.?ubidetach?-?ubiattach相反的操作,將MTD設(shè)備從UBI設(shè)備上去鏈接;
3.?ubimkvol?-?從UBI設(shè)備上創(chuàng)建UBI卷;
4.?ubirmvol?-?從UBI設(shè)備上刪除UBI卷;
5.?ubiblock?-?管理UBI卷上的block;
6.?ubinize?-?制作UBI鏡像;
7.?ubiformat?-?格式化恐的Flash設(shè)備,擦除Flash,保存擦除計數(shù),寫入UBI鏡像到Flash;
8.?mtdinfo?-?報告從系統(tǒng)中找到的UBI設(shè)備的信息.
UBI頭
UBI存儲兩個64字節(jié)的文件頭在每一個非壞塊的起始位置
1.?擦除計數(shù)頭(或者稱為EC頭)包含物理擦除塊的擦除次數(shù)以及其它一些不太重要的信息
2.?卷標(biāo)記頭(或者稱為VID頭)包含了屬于這塊物理擦除塊的卷ID和邏輯塊號,另外包含了其它一些不太重要的信息
所有的UBI頭都使用CRC-32校驗(yàn)來保護(hù),用戶可以參考/drivers/mtd/ubi/ubi-media.h文件獲得更加詳細(xì)的文件頭內(nèi)容的信息。
當(dāng)UBI鏈接一個MTD設(shè)備時,UBI系統(tǒng)會掃描整個MTD設(shè)備,讀取所有的文件頭,并且校驗(yàn)CRC-32的校驗(yàn)值。之后UBI系統(tǒng)會記錄每個物理擦除塊的擦除操作計數(shù),同時建立邏輯塊到物理塊的映射到內(nèi)存中。用戶可以參考后面相關(guān)的章節(jié)了解這個過程的詳細(xì)描述。
當(dāng)UBI系統(tǒng)擦除了一個物理塊,它會在這個物理塊上寫入一個EC頭并且增加擦除計數(shù)。這意味著物理擦除塊除了在擦除物理塊到寫入EC頭的這段短暫時間內(nèi)總有一個EC頭,如果在上述短暫時間內(nèi)系統(tǒng)發(fā)生了斷電等情況,EC頭會丟失或者損壞,這種情況下UBI系統(tǒng)重新寫入一個EC頭并且使用一個整個掃描計算得到的UBI的平均擦除計數(shù)作為EC頭的擦除計數(shù)。
邏輯擦除塊的去映射操作只是將邏輯塊從映射的物理塊去映射然后調(diào)度物理塊進(jìn)行擦除操作。擦除操作中EC頭會被直接寫入物理塊中,而VID頭并不寫入物理塊
邏輯擦除塊的映射操作以及當(dāng)往一個還沒有映射的邏輯塊中寫入內(nèi)容的時候。UBI尋找一個合適的物理塊并且向其中寫入VID頭(此前EC頭已經(jīng)被寫入到物理塊中了)。需要注意的是如果向一個已經(jīng)映射的邏輯塊中寫入內(nèi)容的話只直接寫入數(shù)據(jù)到映射到的物理塊而不需要操作UBI頭。
UBI系統(tǒng)為每一個物理塊維護(hù)了兩個文件頭,主要的原因是UBI需要在不同的時間向Flash中寫入不同的信息。這兩個不同的時間點(diǎn)如下面所述。
當(dāng)一個物理塊被擦除后,UBI需要迅速向物理塊中寫入EC頭記錄這個物理塊的擦除次數(shù)。以免這個擦除計數(shù)由于斷電重啟而被丟失的概率。
1.?當(dāng)UBI映射一個物理塊到邏輯塊時,VID頭會被寫入到物理塊中。
2.?當(dāng)EC頭被寫入到物理塊中的時候,UBI還不清楚這個物理塊將要對應(yīng)的卷ID和以后將要被映射的邏輯塊號。這就是UBI需要使用兩個分立的文件頭的原因。
UBI?卷表
卷表示UBI系統(tǒng)保存在Flash上的一個數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)保存了一個UBI設(shè)備上面每一個卷的信息。一個卷表是每個卷記錄信息的數(shù)組。每個卷記錄信息包含了下面的具體內(nèi)容:
? ??卷大小,卷名稱,卷類型(靜態(tài)卷或者動態(tài)卷),卷對齊,升級標(biāo)識(如果這個標(biāo)記被設(shè)置標(biāo)識在卷升級操作中操作被打斷),自動重分配大小標(biāo)記,這個卷記錄的CRC-32校驗(yàn)。
? ??每一條記錄描述一個UBI卷,卷表上記錄的索引表示卷ID。比如說卷0由卷表的第0條表項(xiàng)來描述,以此類推。卷表中的表項(xiàng)由邏輯卷的大小來限制,但是最大不能超過128條表項(xiàng)。這就是說UBI設(shè)備不能創(chuàng)建超過128卷。
每次創(chuàng)建、刪除、重新分配卷大小、重新命名卷名、升級操作都會改變相應(yīng)的卷表項(xiàng)。UBI維護(hù)了相同的兩份卷表來增加UBI系統(tǒng)的可靠性。
? ??具體實(shí)現(xiàn)細(xì)節(jié)
? ??在UBI系統(tǒng)內(nèi)部,卷表存儲在特殊用途的卷上面,這個特殊用途的卷被叫做層卷。這個卷只包含了兩個邏輯塊,每一個中都包含了一個卷表的拷貝。層卷是一種UBI系統(tǒng)的"內(nèi)部"卷,用戶不能訪問到這個卷,當(dāng)UBI系統(tǒng)讀寫卷表時,使用和普通卷相同的機(jī)制。
UBI使用下面的算法來更新卷表記錄項(xiàng)。
1.?將卷表的內(nèi)容在內(nèi)存中準(zhǔn)備好。
2.?將層卷中的LEB0邏輯塊進(jìn)行去映射操作。
3.?將新的卷表項(xiàng)寫入到層卷的LEB0邏輯塊中。
4.?將層卷中的LEB1邏輯塊進(jìn)行去映射操作。
5.?將新的卷表項(xiàng)寫入到層卷的LEB1邏輯塊中。
6.?刷新UBI的工作隊(duì)列確保之前去映射的邏輯塊被擦除掉了
當(dāng)UBI鏈接MTD設(shè)備的時候,必須確保兩份卷表內(nèi)容一致。如果兩份卷表的內(nèi)容不一致,就用LEB0邏輯塊的卷標(biāo)拷貝覆蓋LEB1邏輯塊的內(nèi)容。如果其中某一份的內(nèi)容損壞了,就用那份完整的拷貝覆蓋損壞的內(nèi)容。
Flash最小的輸入/輸出單位
UBI使用了一種抽象的Flash模型,簡而言之就是,UBI將MTD設(shè)備看成事由一個個擦除塊組成的,擦除塊分為好塊和壞塊。好塊可以進(jìn)行讀取,寫入,擦除操作。
對Flash的讀寫操作都只能以最小擦除塊的大小進(jìn)行,這個大小取決于Flash的類型
NOR?Flash通常的最小IO大小事1字節(jié),NOR?Flash通常允許單字節(jié)的對Flash進(jìn)行讀寫操作,NOR?Flash甚至可以對設(shè)備上單比特進(jìn)行操作
NAND?Flash通常以512、2048、4096字節(jié)作為設(shè)備IO的最小單位,一般這個最小單位就是NAND?Flash的一頁的大小。NAND?Flash將每一頁的ECC校驗(yàn)值存儲到OOB區(qū)中,這就意味著整個NAND?Flash的一頁內(nèi)容必須一次寫入從而可以計算出整個頁的ECC校驗(yàn)值。整個頁的內(nèi)容頁必須一次性讀出以校驗(yàn)ECC校驗(yàn)值。Flash設(shè)備的最小IO大小是一個很重要的概念,對UBI系統(tǒng)有很多影響,比如說:
UBI系統(tǒng)中VID頭部的位置就取決于Flash設(shè)備的最小IO大小,還有UBI系統(tǒng)中邏輯擦除塊的大小也取決于Flash設(shè)備的最小IO大小。一般來說,最小IO值越大,邏輯擦除塊反而會越小,原因是UBI頭占用的空間會越大。
所有對邏輯擦除塊的寫操作都必須是和最小IO值對齊的,必須是最小IO值的整數(shù)倍。對于讀操作沒有這樣的限制,事實(shí)上在MTD設(shè)備層面也是按照最小IO值大小進(jìn)行讀取的,讀入到一個緩沖空間后,最后只拷貝了用戶請求的字節(jié)數(shù)目給用戶。
?
評論
查看更多