NAND FLASH壞塊處理機制
大家都知道,機械硬盤會產生壞道,FLASH芯片也會這樣,一般我們稱此為“壞塊(Bad Block)”。在NAND FLASH中,一個塊中含有1個或多個位是壞的,就稱其為壞塊。
產生壞塊的原因有兩種:
(1)出廠時就有的壞塊,稱作Factory masked bad block(廠屏蔽壞塊)或Initial bad/invalid block(初始壞/無效塊),NAND FLASH器件中的壞塊是隨機分布的。以前做過消除壞塊的努力,但發現成品率太低,代價太高,成本不劃算。
(2)使用過程中產生的壞塊,稱作Worn-out bad block(破舊的壞塊)。由于使用過程時間長了,在擦除塊時出錯,說明此塊壞了,在程序運行過程中發現,并且標記成壞塊。
正常的塊寫入讀出都是正常的,而壞塊的讀寫是無法保證的。在Linux系統中,對于NAND FLASH有壞塊管理(BBM,Bad Block Managment)機制,通過一個對應的壞塊表(BBT,Bad Block Table)來記錄好塊,壞塊的信息,以及壞塊是出廠就有的,還是后來使用產生的。
在L i n u x內核M T D(M e m o r y Technology Device,內存技術設備)架構和Uboot中的NAND FLASH驅動,在加載完驅動后,都會主動掃描壞塊,建立必要的BBT,以備后面壞塊管理所使用。下面是DM800 se機器在系統啟動過程中,通過超級終端獲取的一段進程信息,可以看出執行BBT和ECC管理。
[4294669.853000] BrcmNAND mfg ad 76 Hynix HY27US08121A (dream) 64MB
[4294669.854000]
[4294669.854000] Found NAND: A C C = 1 7 f f 1 0 1 0 , c f g = 0 4 0 4 2 3 0 0 , flashId=ad76ad76, tim16
[4294669.855000] BrcmNAND version= 0x0302 64MB @00000000
[ 4 2 9 4 6 6 9 . 8 5 6 0 0 0 ] B 4 : N a n d S e l e c t = 4 0 0 0 0 0 0 2 , nandConfig=04042300, chipSelect=-1
[4294669.856000] brcmnand_probe: CS-1: dev_id=ad76ad76
[ 4 2 9 4 6 6 9 . 8 5 7 0 0 0 ] A f t e r : N a n d S e l e c t = 4 0 0 0 0 0 0 2 , nandConfig=04042300
[4294669.858000] Found NAND chip on Chip Select -1, chipSize=64MB, usable size=x
[4294669.859000] brcmnand_scan: B4 nand_select = 40000002
[4294669.859000] brcmnand_scan: After nand_select = 40000002
[4294669.860000] page_shift=9, bbt_ erase_shift=14, chip_shift=26, phys_erase_ sh4
[4294669.861000] Brcm NAND controller version = 3.2 NAND flash size 64MB @1c0000
[4294669.862000] mtd->oobsize=16, mtd->eccOobSize=16
[4294669.862000] brcmnand_scan: mtd->oobsize=16
[4294669.863000] brcmnand_scan: oobavail=12, eccsize=512, writesize=512
[4294669.864000] brcmnand_scan, eccsize=512, writesize=512, eccsteps=1, eccleve3
[4294669.865000] brcmnand_default_ bbt: bbt_td = bbt_main_descr
[4294669.867000] brcmnandCET: Status -> Deferred
DM800 se NAND FLASH芯片分區
D M 8 0 0 s e機器(包括S R 4機器)N A N D F L A S H芯片型號為HY27U518S2CTR(2011年前期采用HY27US08121B)(U703),如圖1所示。這是韓國Hynix(海力士)公司的NAND FLASH芯片,采用64M×8bit結構,容量為64MB,用于存儲接收機的系統軟件。
HY27U518S2CTR芯片劃分為三個分區:第1分區(partition 1)為引導裝載程序(loader)、第2分區(partition 2)為內核啟動系統(boot)、第3分區(partition 3)為根文件系統(root),分配容量分別為:0.25MB、3.75MB、60MB。FLASH分區地址信息可以在系統啟動過程中通過超級終端獲取:
[4294669.867000] numchips=1, size=4000000
[4294669.868000] Creating 4 MTD partitions on "bcm7xxx-nand.0":
[4294669.869000] 0x0000000000000000-0x0000000004000000 :"complete"
[4294669.873000] 0x0000000000000000-0x0000000000040000 :"loader" ……………………………………partition 1
[4294669.874000] 0x0000000000040000-0 x 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 : " b o o t p a r t i t i o n "……………………………………partition 2
[4294669.875000] 0x0000000000400000-0 x 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 : " r o o t p a r t i t i o n "……………………………………partition 3
如果制作過DM800 se機器的固件(IMG),就知道IMG是由第二引導系統(secondstage,main.bin.gz)、啟動(boot.jffs2)、根系統(root.jffs2)三個部分組成,圖2所示的是《山水評測室》制作的DM800se G3-iCVS8#84B打造版固件的內部包,對應于上述的三個分區。
DM800 se NAND FLASH芯片壞塊檢測
對于DM800 se機器NAND FLASH芯片壞塊檢查,可以安裝FLASH芯片檢查插件檢查出壞塊、空塊、填充塊等數量(圖3)。在FLASH芯片檢查插件主界面,提供了mtd0整片、mtd1(secondstage loader)、mtd2(boot)、mtd3(root)四項檢查內容(圖4)。
檢查前,首先了解各個字符代碼的注釋:每一個壞塊用一個“B”表示,每一個空塊用一個“.”表示,每一個部分使用塊用一個“-”表示,每一個全部使用塊用一個“=”表示,具體如圖5所示。
下面,我們對采用DM800 se G3-iCVS8#84B打造版IMG的NAND FLASH芯片進行檢查。
1. mtd0整片檢查
執行mtd0檢查整片,如圖6所示。
從圖中可以看出:
(1)一個典型的NAND FLASH都是由4096塊(Block)組成,HY27U518S2CTR芯片每塊大小是16384bytes(即16kB),容量合計:16384×4096=67108864(bytes),也就是67108864÷1024÷1024=64(MB)
《山水評測室》提示:
空閑區域并非真的“空閑”,它在物理上與其它頁并沒有區別。ECC、耗損均衡(Wear Leveling)、其它軟件開銷等很多額外的功能要依托于這部分空間來實現。換一句話說:對于一個頁,0~511 bytes為主存儲區,即通常所說的用戶可設定地址區,用來存儲數據;512~527共16 bytes為擴展存儲區,用來存儲頁的信息。擴展區的16字節用于描述主存儲區的512字節。而對于壞塊,也僅僅是將這16字節的第6字節設置為不等于0xff,來標示壞塊。
2. mtd1引導系統檢查
執行mtd1檢查,如圖7所示。可以看出分配了16個塊給第二引導系統(secondstage),分配容量為16×16=256(kB),即0.25MB,其中未使用5個塊,已全部使用11個塊,容量為16×11=176(kB),和制作的main. bin.gz(即secondstage84b.bin)容量176456÷024=175.25(kB)完全符合。
3. mtd2啟動系統檢查
執行mtd2檢查,如圖8所示。可以看出分配了240個塊給啟動系統(boot),分配容量容量為240×16=3840kB,即3.75MB,其中已全部使用145個塊,已部分使用1個塊,容量為16×145.5=2328(kB),和制作的boot.jffs2容量2382988÷024=2327.1(kB)完全符合。
4. mtd3根系統檢查
執行mtd3檢查,如圖9所示。可以看出分配了3840個塊給根系統(root),分配容量為3840×16=61440(kB),即60MB,具體固件使用容量不再分析了。
5. 壞塊檢查
我們收到一個用戶的故障DM800 se機器,反映不能安裝某些插件,運行不穩定。我們刷寫同樣的56MB容量的DM800 se G3-iCVS8#84B打造版固件,經過DCC-E2的【Memory Info】選項檢查,故障機(圖10a)的和《山水評測室》全新的打造版機器(圖10b)的ROOT占用率分別為92%、89%。
具體檢查對比如圖11~圖16所示,其中(a)圖為故障機界面,(b)圖為正常機界面,可見故障機有很多壞塊,而和全新打造版沒有一個壞塊(注:FLASH芯片末尾壞塊是無需作統計的)。
圖中的第257塊到第4096塊分配給根系統(root),經統計,故障機一共顯示8+31+10+44+14=107壞塊,占用容量為107×16÷1024=1.7(MB),壞塊占用率為1.7÷60=2.8%,因此故障機FLASH的root占用率=89%(固件空間占用率)+2.8%(壞塊空間占用率),即顯示已占用92%。
分區壞塊導致DM800 se無法刷機的解決方法
1. 由于分區壞塊導致無法刷機
當采用Web網頁RJ-45網口刷寫時,出現如圖17所示的“too much data (or bad sectors) in ……”提示,表示分區3(partition 3)有壞扇區。
當采用DreamUp軟件USB虛擬串口在刷寫時,如果DreamUp軟件【Log】日志區域里顯示類似如下提示:
Log: +++ 006 verify failed, at 0003c000: e0. Block will be marked as bad.
Flashing failed (!!! 005 too much data(or bad sectors) in partition 1 (end: 00040000, pos: 00040000)), box will be unusable now!!
其意是:FLASH芯片分區1(partition 1)有太多的壞扇區,無法刷寫。這些都是由于NAND FLASH芯片壞塊引起的,因為壞了的塊是無法擦除和寫人數據的。
2. 刷機方法
對于NAND FLASH芯片壞塊引起的刷機,如果還是想采用Web網頁進行刷寫,我們可以先進入機器的BIOS進行設置一下。
在其中的Misc(雜項)設置界面中,顯示DM800 se機器的一些雜項設置,如圖18所示。
其中的【Flash Sector Recovery】(閃存扇區恢復)選項,默認為禁用狀態,當遇到因壞扇區而無法刷寫軟件時,可以啟用該選項來解決。有時機器無法啟動,也可以啟用該選項試一試。
如果采用DreamUp軟件刷機,在刷寫前,先點擊DreamUp軟件菜單欄的【Extras】(附加)功能,勾選“recover bad sectors”(恢復壞扇區)功能,如圖19所示,再重新刷寫一次就可解決。
所謂“恢復壞扇區”,實際上就是使用相同的地址可以屏蔽掉壞了的塊,而指針指向好塊,也就是地址重映射,跳過壞塊。
DM800 se NAND FLASH芯片更換
對于Dreambox高清機來講,NAND FLASH芯片產生壞塊的原因有多種,主要有以下一些因素:① NAND FLASH芯片質量差,壽命短,一些機器甚至采用二手的舊芯;②不正確的機器操作,如不正確的開關機,頻繁地刷寫有問題的固件,導致NAND FLASH芯片一些扇區或塊的過分磨損、出現壞塊;③芯片自然老化、接近生命周期規定的讀寫次數。
對于NAND FLASH芯片出現少量的壞塊,用戶不必擔心,因為DM800機器驅動在讀寫NAND FLASH芯片時,通常檢測壞塊,同時還在NAND驅動中加入壞塊管理的功能,使得機器完全能夠正常工作。
不過NAND FLASH芯片過多的壞塊,除了由此引發的數據丟失而工作不正常外,還會導致剩余容量減小,機器不能正常安裝一些稍大容量的插件。一般機器運行時,ROOT占用率不能超過93%,即FLASH芯片剩余容量不低于4MB,否則,機器運行可能不穩定,易死機。對于FLASH芯片剩余容量,可以在【藍色面板】下進入山水插件服務器,從下載頁面左上角查看,如圖20所示。
壞塊過多的NAND FLASH芯片建議更換,找到機器主板的NAND FLASH芯片(U703),用熱風槍將它拆下(圖21),更換一片全新的、帶有DM800 se機器底層驅動的NAND FLASH芯片,更換完成后,需要重新刷寫IMG。