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