nand flash壞塊管理OOB,BBT,ECC
0.NAND的操作管理方式
創(chuàng)新互聯(lián)專注于合作企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站建設(shè)。合作網(wǎng)站建設(shè)公司,為合作等地區(qū)提供建站服務(wù)。全流程按需策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)NAND FLASH的管理方式:以三星FLAHS為例,一片Nand flash為一個(gè)設(shè)備(device),1 (Device) = xxxx (Blocks),1 (Block) = xxxx (Pages),1(Page) =528 (Bytes) = 數(shù)據(jù)塊大小(512Bytes) + OOB 塊大小(16Bytes,除OOB第六字節(jié)外,通常至少把OOB的前3個(gè)字節(jié)存放Nand Flash硬件ECC碼)。
1.為什么會(huì)出現(xiàn)壞塊
由于NAND Flash的工藝不能保證NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生產(chǎn)中及使用過(guò)程中會(huì)產(chǎn)生壞塊。壞塊的特性是:當(dāng)編程/擦除這個(gè)塊時(shí),會(huì)造成Page Program和Block Erase操作時(shí)的錯(cuò)誤,相應(yīng)地反映到Status Register的相應(yīng)位。
2.壞塊的分類
總體上,壞塊可以分為兩大類:(1)固有壞塊:這是生產(chǎn)過(guò)程中產(chǎn)生的壞塊,一般芯片原廠都會(huì)在出廠時(shí)都會(huì)將每個(gè)壞塊第一個(gè)page的spare area的第6個(gè)byte標(biāo)記為不等于0xff的值。(2)使用壞塊:這是在NAND Flash使用過(guò)程中,如果Block Erase或者Page Program錯(cuò)誤,就可以簡(jiǎn)單地將這個(gè)塊作為壞塊來(lái)處理,這個(gè)時(shí)候需要把壞塊標(biāo)記起來(lái)。為了和固有壞塊信息保持一致,將新發(fā)現(xiàn)的壞塊的第一個(gè)page的 spare area的第6個(gè)Byte標(biāo)記為非0xff的值。
3.壞塊管理
根據(jù)上面的這些敘述,可以了解NAND Flash出廠時(shí)在spare area中已經(jīng)反映出了壞塊信息,因此,如果在擦除一個(gè)塊之前,一定要先check一下第一頁(yè)的spare area的第6個(gè)byte是否是0xff,如果是就證明這是一個(gè)好塊,可以擦除;如果是非0xff,那么就不能擦除,以免將壞塊標(biāo)記擦掉。當(dāng)然,這樣處理可能會(huì)犯一個(gè)錯(cuò)誤―――“錯(cuò)殺偽壞塊”,因?yàn)樵谛酒僮鬟^(guò)程中可能由于電壓不穩(wěn)定等偶然因素會(huì)造成NAND操作的錯(cuò)誤。但是,為了數(shù)據(jù)的可靠性及軟件設(shè)計(jì)的簡(jiǎn)單化,還是需要遵照這個(gè)標(biāo)準(zhǔn)。
可以用BBT:bad block table,即壞塊表來(lái)進(jìn)行管理。各家對(duì)nand的壞塊管理方法都有差異。比如專門用nand做存儲(chǔ)的,會(huì)把bbt放到block0,因?yàn)榈?塊一定是好的塊。但是如果nand本身被用來(lái)boot,那么第0塊就要存放程序,不能放bbt了。有的把bbt放到最后一塊,當(dāng)然,這一塊堅(jiān)決不能為壞塊。bbt的大小跟nand大小有關(guān),nand越大,需要的bbt也就越大。
4.壞塊糾正
ECC:NAND Flash出錯(cuò)的時(shí)候一般不會(huì)造成整個(gè)Block或是Page不能讀取或是全部出錯(cuò),而是整個(gè)Page(例如512Bytes)中只有一個(gè)或幾個(gè)bit出錯(cuò)。一般使用一種比較專用的校驗(yàn)——ECC。ECC能糾正單比特錯(cuò)誤和檢測(cè)雙比特錯(cuò)誤,而且計(jì)算速度很快,但對(duì)1比特以上的錯(cuò)誤無(wú)法糾正,對(duì)2比特以上的錯(cuò)誤不保證能檢測(cè)。
ECC一般每256字節(jié)原始數(shù)據(jù)生成3字節(jié)ECC校驗(yàn)數(shù)據(jù),這三字節(jié)共24比特分成兩部分:6比特的列校驗(yàn)和16比特的行校驗(yàn),多余的兩個(gè)比特置1。(512生成兩組ECC?)
當(dāng)往NAND Flash的page中寫入數(shù)據(jù)的時(shí)候,每256字節(jié)我們生成一個(gè)ECC校驗(yàn)和,稱之為原ECC校驗(yàn)和,保存到PAGE的OOB(out-of-band)數(shù)據(jù)區(qū)中。其位置就是eccpos[]。校驗(yàn)的時(shí)候,根據(jù)上述ECC生成原理不難推斷:將從OOB區(qū)中讀出的原ECC校驗(yàn)和新ECC校驗(yàn)和按位異或,若結(jié)果為0,則表示不存在錯(cuò)(或是出現(xiàn)了ECC無(wú)法檢測(cè)的錯(cuò)誤);若3個(gè)字節(jié)異或結(jié)果中存在11個(gè)比特位為1,表示存在一個(gè)比特錯(cuò)誤,且可糾正;若3個(gè)字節(jié)異或結(jié)果中只存在1個(gè)比特位為1,表示OOB區(qū)出錯(cuò);其他情況均表示出現(xiàn)了無(wú)法糾正的錯(cuò)誤。
5.補(bǔ)充
(1)需要對(duì)前面由于Page Program錯(cuò)誤發(fā)現(xiàn)的壞塊進(jìn)行一下特別說(shuō)明。如果在對(duì)一個(gè)塊的某個(gè)page進(jìn)行編程的時(shí)候發(fā)生了錯(cuò)誤就要把這個(gè)塊標(biāo)記為壞塊,首先就要把塊里其他好的面的內(nèi)容備份到另外一個(gè)空的好塊里面,然后,把這個(gè)塊標(biāo)記為壞塊。當(dāng)然,這可能會(huì)犯“錯(cuò)殺”之誤,一個(gè)補(bǔ)救的辦法,就是在進(jìn)行完塊備份之后,再將這個(gè)壞塊擦除一遍,如果Block Erase發(fā)生錯(cuò)誤,那就證明這個(gè)塊是個(gè)真正的壞塊,那就毫不猶豫地將它打個(gè)“戳”吧!
(2)可能有人會(huì)問(wèn),為什么要使用每個(gè)塊第一頁(yè)的spare area的第六個(gè)byte作為壞塊標(biāo)記。這是NAND Flash生產(chǎn)商的默認(rèn)約定,你可以看到Samsung,Toshiba,STMicroelectronics都是使用這個(gè)Byte作為壞塊標(biāo)記的。
(3)為什么好塊用0xff來(lái)標(biāo)記?因?yàn)镹and Flash的擦除即是將相應(yīng)塊的位全部變?yōu)?,寫操作時(shí)只能把芯片每一位(bit)只能從1變?yōu)?,而不能從0變?yōu)?。0XFF這個(gè)值就是標(biāo)識(shí)擦除成功,是好塊。