NAND FLASH壞塊處理機(jī)制
大家都知道,機(jī)械硬盤會產(chǎn)生壞道,F(xiàn)LASH芯片也會這樣,一般我們稱此為“壞塊(Bad Block)”。在NAND FLASH中,一個塊中含有1個或多個位是壞的,就稱其為壞塊。
產(chǎn)生壞塊的原因有兩種:
(1)出廠時就有的壞塊,稱作Factory masked bad block(廠屏蔽壞塊)或Initial bad/invalid block(初始壞/無效塊),NAND FLASH器件中的壞塊是隨機(jī)分布的。以前做過消除壞塊的努力,但發(fā)現(xiàn)成品率太低,代價太高,成本不劃算。
(2)使用過程中產(chǎn)生的壞塊,稱作Worn-out bad block(破舊的壞塊)。由于使用過程時間長了,在擦除塊時出錯,說明此塊壞了,在程序運(yùn)行過程中發(fā)現(xiàn),并且標(biāo)記成壞塊。
正常的塊寫入讀出都是正常的,而壞塊的讀寫是無法保證的。在Linux系統(tǒng)中,對于NAND FLASH有壞塊管理(BBM,Bad Block Managment)機(jī)制,通過一個對應(yīng)的壞塊表(BBT,Bad Block Table)來記錄好塊,壞塊的信息,以及壞塊是出廠就有的,還是后來使用產(chǎn)生的。
在L i n u x內(nèi)核M T D(M e m o r y Technology Device,內(nèi)存技術(shù)設(shè)備)架構(gòu)和Uboot中的NAND FLASH驅(qū)動,在加載完驅(qū)動后,都會主動掃描壞塊,建立必要的BBT,以備后面壞塊管理所使用。下面是DM800 se機(jī)器在系統(tǒng)啟動過程中,通過超級終端獲取的一段進(jìn)程信息,可以看出執(zhí)行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芯片分區(qū)
D M 8 0 0 s e機(jī)器(包括S R 4機(jī)器)N A N D F L A S H芯片型號為HY27U518S2CTR(2011年前期采用HY27US08121B)(U703),如圖1所示。這是韓國Hynix(海力士)公司的NAND FLASH芯片,采用64M×8bit結(jié)構(gòu),容量為64MB,用于存儲接收機(jī)的系統(tǒng)軟件。
HY27U518S2CTR芯片劃分為三個分區(qū):第1分區(qū)(partition 1)為引導(dǎo)裝載程序(loader)、第2分區(qū)(partition 2)為內(nèi)核啟動系統(tǒng)(boot)、第3分區(qū)(partition 3)為根文件系統(tǒng)(root),分配容量分別為:0.25MB、3.75MB、60MB。FLASH分區(qū)地址信息可以在系統(tǒng)啟動過程中通過超級終端獲?。?/p>
[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機(jī)器的固件(IMG),就知道IMG是由第二引導(dǎo)系統(tǒng)(secondstage,main.bin.gz)、啟動(boot.jffs2)、根系統(tǒng)(root.jffs2)三個部分組成,圖2所示的是《山水評測室》制作的DM800se G3-iCVS8#84B打造版固件的內(nèi)部包,對應(yīng)于上述的三個分區(qū)。
DM800 se NAND FLASH芯片壞塊檢測
對于DM800 se機(jī)器NAND FLASH芯片壞塊檢查,可以安裝FLASH芯片檢查插件檢查出壞塊、空塊、填充塊等數(shù)量(圖3)。在FLASH芯片檢查插件主界面,提供了mtd0整片、mtd1(secondstage loader)、mtd2(boot)、mtd3(root)四項檢查內(nèi)容(圖4)。
檢查前,首先了解各個字符代碼的注釋:每一個壞塊用一個“B”表示,每一個空塊用一個“.”表示,每一個部分使用塊用一個“-”表示,每一個全部使用塊用一個“=”表示,具體如圖5所示。
下面,我們對采用DM800 se G3-iCVS8#84B打造版IMG的NAND FLASH芯片進(jìn)行檢查。
1. mtd0整片檢查
執(zhí)行mtd0檢查整片,如圖6所示。
從圖中可以看出:
(1)一個典型的NAND FLASH都是由4096塊(Block)組成,HY27U518S2CTR芯片每塊大小是16384bytes(即16kB),容量合計:16384×4096=67108864(bytes),也就是67108864÷1024÷1024=64(MB)
《山水評測室》提示:
空閑區(qū)域并非真的“空閑”,它在物理上與其它頁并沒有區(qū)別。ECC、耗損均衡(Wear Leveling)、其它軟件開銷等很多額外的功能要依托于這部分空間來實現(xiàn)。換一句話說:對于一個頁,0~511 bytes為主存儲區(qū),即通常所說的用戶可設(shè)定地址區(qū),用來存儲數(shù)據(jù);512~527共16 bytes為擴(kuò)展存儲區(qū),用來存儲頁的信息。擴(kuò)展區(qū)的16字節(jié)用于描述主存儲區(qū)的512字節(jié)。而對于壞塊,也僅僅是將這16字節(jié)的第6字節(jié)設(shè)置為不等于0xff,來標(biāo)示壞塊。
2. mtd1引導(dǎo)系統(tǒng)檢查
執(zhí)行mtd1檢查,如圖7所示??梢钥闯龇峙淞?6個塊給第二引導(dǎo)系統(tǒng)(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啟動系統(tǒng)檢查
執(zhí)行mtd2檢查,如圖8所示??梢钥闯龇峙淞?40個塊給啟動系統(tǒng)(boot),分配容量容量為240×16=3840kB,即3.75MB,其中已全部使用145個塊,已部分使用1個塊,容量為16×145.5=2328(kB),和制作的boot.jffs2容量2382988÷024=2327.1(kB)完全符合。
4. mtd3根系統(tǒng)檢查
執(zhí)行mtd3檢查,如圖9所示。可以看出分配了3840個塊給根系統(tǒng)(root),分配容量為3840×16=61440(kB),即60MB,具體固件使用容量不再分析了。
5. 壞塊檢查
我們收到一個用戶的故障DM800 se機(jī)器,反映不能安裝某些插件,運(yùn)行不穩(wěn)定。我們刷寫同樣的56MB容量的DM800 se G3-iCVS8#84B打造版固件,經(jīng)過DCC-E2的【Memory Info】選項檢查,故障機(jī)(圖10a)的和《山水評測室》全新的打造版機(jī)器(圖10b)的ROOT占用率分別為92%、89%。
具體檢查對比如圖11~圖16所示,其中(a)圖為故障機(jī)界面,(b)圖為正常機(jī)界面,可見故障機(jī)有很多壞塊,而和全新打造版沒有一個壞塊(注:FLASH芯片末尾壞塊是無需作統(tǒng)計的)。
圖中的第257塊到第4096塊分配給根系統(tǒng)(root),經(jīng)統(tǒng)計,故障機(jī)一共顯示8+31+10+44+14=107壞塊,占用容量為107×16÷1024=1.7(MB),壞塊占用率為1.7÷60=2.8%,因此故障機(jī)FLASH的root占用率=89%(固件空間占用率)+2.8%(壞塊空間占用率),即顯示已占用92%。
分區(qū)壞塊導(dǎo)致DM800 se無法刷機(jī)的解決方法
1. 由于分區(qū)壞塊導(dǎo)致無法刷機(jī)
當(dāng)采用Web網(wǎng)頁RJ-45網(wǎng)口刷寫時,出現(xiàn)如圖17所示的“too much data (or bad sectors) in ……”提示,表示分區(qū)3(partition 3)有壞扇區(qū)。
當(dāng)采用DreamUp軟件USB虛擬串口在刷寫時,如果DreamUp軟件【Log】日志區(qū)域里顯示類似如下提示:
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芯片分區(qū)1(partition 1)有太多的壞扇區(qū),無法刷寫。這些都是由于NAND FLASH芯片壞塊引起的,因為壞了的塊是無法擦除和寫人數(shù)據(jù)的。
2. 刷機(jī)方法
對于NAND FLASH芯片壞塊引起的刷機(jī),如果還是想采用Web網(wǎng)頁進(jìn)行刷寫,我們可以先進(jìn)入機(jī)器的BIOS進(jìn)行設(shè)置一下。
在其中的Misc(雜項)設(shè)置界面中,顯示DM800 se機(jī)器的一些雜項設(shè)置,如圖18所示。
其中的【Flash Sector Recovery】(閃存扇區(qū)恢復(fù))選項,默認(rèn)為禁用狀態(tài),當(dāng)遇到因壞扇區(qū)而無法刷寫軟件時,可以啟用該選項來解決。有時機(jī)器無法啟動,也可以啟用該選項試一試。
如果采用DreamUp軟件刷機(jī),在刷寫前,先點(diǎn)擊DreamUp軟件菜單欄的【Extras】(附加)功能,勾選“recover bad sectors”(恢復(fù)壞扇區(qū))功能,如圖19所示,再重新刷寫一次就可解決。
所謂“恢復(fù)壞扇區(qū)”,實際上就是使用相同的地址可以屏蔽掉壞了的塊,而指針指向好塊,也就是地址重映射,跳過壞塊。
DM800 se NAND FLASH芯片更換
對于Dreambox高清機(jī)來講,NAND FLASH芯片產(chǎn)生壞塊的原因有多種,主要有以下一些因素:① NAND FLASH芯片質(zhì)量差,壽命短,一些機(jī)器甚至采用二手的舊芯;②不正確的機(jī)器操作,如不正確的開關(guān)機(jī),頻繁地刷寫有問題的固件,導(dǎo)致NAND FLASH芯片一些扇區(qū)或塊的過分磨損、出現(xiàn)壞塊;③芯片自然老化、接近生命周期規(guī)定的讀寫次數(shù)。
對于NAND FLASH芯片出現(xiàn)少量的壞塊,用戶不必?fù)?dān)心,因為DM800機(jī)器驅(qū)動在讀寫NAND FLASH芯片時,通常檢測壞塊,同時還在NAND驅(qū)動中加入壞塊管理的功能,使得機(jī)器完全能夠正常工作。
不過NAND FLASH芯片過多的壞塊,除了由此引發(fā)的數(shù)據(jù)丟失而工作不正常外,還會導(dǎo)致剩余容量減小,機(jī)器不能正常安裝一些稍大容量的插件。一般機(jī)器運(yùn)行時,ROOT占用率不能超過93%,即FLASH芯片剩余容量不低于4MB,否則,機(jī)器運(yùn)行可能不穩(wěn)定,易死機(jī)。對于FLASH芯片剩余容量,可以在【藍(lán)色面板】下進(jìn)入山水插件服務(wù)器,從下載頁面左上角查看,如圖20所示。
壞塊過多的NAND FLASH芯片建議更換,找到機(jī)器主板的NAND FLASH芯片(U703),用熱風(fēng)槍將它拆下(圖21),更換一片全新的、帶有DM800 se機(jī)器底層驅(qū)動的NAND FLASH芯片,更換完成后,需要重新刷寫IMG。