NAND Flash的壞塊管理設計
2.2 壞塊映射表的描述
在預留空間存在4種形式的塊:空閑的好塊、壞塊、被映射的塊、存放映射表的塊。
存放映射表的塊較為特殊,其中映射表不僅描述基本空間中的壞塊映射相關(guān)信息,還描述預留空間占整個(gè)Flash空間的比例等。
設計中一張壞塊表存于一個(gè)Flash塊,表的信息存于塊中最前面的相關(guān)頁(yè)中。表的頭部長(cháng)度固定,表的整個(gè)長(cháng)度可變,與壞塊數目相關(guān)。
壞塊映射表結構描述如下:本文引用地址:http://dyxdggzs.com/article/151348.htm
其中hdr_crc和tbl_crc用于檢驗表的完整性;rese_start_blk即預留空間的起始塊號;version用于標識該表的版本;num_bad_blk用于描述已發(fā)現的壞塊數,即壞塊映射表項的數目;map_tbl為記錄壞塊映射表項內容的首地址。任何一個(gè)映射表項包括壞塊塊號及其映射的好塊的塊號。
由于使用過(guò)程中會(huì )產(chǎn)生新的壞塊,映射表中的表項需要增加,從而要更新Flash中的映射表。為了防止系統意外掉電產(chǎn)生映射表不一致問(wèn)題,采用日志技術(shù)。其中version版本號標識映射表的新舊,在更新Flash映射表的同時(shí),版本號遞增,同時(shí)Flash舊版本映射表并不立即擦除。只有出現預留空間不足的情況,擦除舊版本映射表的動(dòng)作才執行。此方案還有利于調試,查看映射表的更改歷史記錄。
在出現壞塊Bn后,通常包括兩個(gè)動(dòng)作:寫(xiě)映射表和標識壞塊。標識壞塊是通過(guò)在塊的00B相應字節寫(xiě)非0xFF來(lái)實(shí)現。
為了支持意外掉電情形,每個(gè)版本的映射表必須在Flash里保存兩份,如果發(fā)現最高的版本映射表沒(méi)有兩份,或者兩份不一致,則屬于非正常情況,必須重新建立映射表。
考慮如下情況:寫(xiě)完映射表Vn,接著(zhù)標識壞塊Bn,此時(shí)掉電,則下次系統啟動(dòng)后,出現映射表的壞快Bn,實(shí)際上并沒(méi)有被標識,導致不一致問(wèn)題。寫(xiě)2份Vn可以解決此問(wèn)題:寫(xiě)第一份Vn后,標識壞塊Bn,接著(zhù)再寫(xiě)第二份Vn。這樣即使在標識壞塊Bn時(shí)掉電,下次系統加電時(shí)由于沒(méi)有發(fā)現2份版本相同且最高的映射表,從而識別出此非正常情況。
同時(shí),維護2份同版本壞塊表可以處理存放映射表的塊突然壞死而導致系統無(wú)法啟動(dòng)的異常,起到備份的作用。
2.2.1 壞塊映射表的管理算法
系統初始化時(shí)讀入壞塊表的內容,在內存中建立所有壞塊的映射信息。由于每次發(fā)現新的壞塊而更新壞塊表時(shí),都會(huì )寫(xiě)入兩個(gè)版本一樣的壞塊表,所以在讀入壞塊表時(shí)就要檢查兩個(gè)表是否有效和一致,可以分為以下情況:
①發(fā)現2張最高版本并且有效的壞塊表Vn+1——系統按表Vn+1建立映射;
②只發(fā)現1張最高版本并且有效的壞塊表Vn+1,并且有2張有效壞塊表Vn——發(fā)生在上次寫(xiě)完一個(gè)Vn+1后突然掉電,使得第二個(gè)表Vn+1未寫(xiě)入或寫(xiě)入不完整,這時(shí)需要恢復,以建立完整映射,恢復算法如圖3所示。
評論