專(zhuān)利名稱(chēng):一種閃存的安全讀寫(xiě)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種閃存的安全讀寫(xiě)方法,尤其涉及一種用于嵌入式系統(tǒng)的安全讀寫(xiě)方法。
背景技術(shù):
隨著嵌入式系統(tǒng)的迅速發(fā)展和廣泛應(yīng)用,大量需要一種能多次編程,容量大,讀寫(xiě)、擦除快捷、方便、簡(jiǎn)單,外圍器件少,價(jià)格低廉的非易揮發(fā)存儲(chǔ)器件。閃存(Flash Memory)存儲(chǔ)介質(zhì)就是在這種背景需求下應(yīng)運(yùn)而生的。它是一種基于半導(dǎo)體的存儲(chǔ)器,具有系統(tǒng)掉電后仍可保留內(nèi)部信息,及在線(xiàn)擦寫(xiě)等功能特點(diǎn),是一種替代EEPROM存儲(chǔ)介質(zhì)的新型存儲(chǔ)器。而且它的讀寫(xiě)速度比EEPROM更快,在相同容量的情況下成本更低。正因?yàn)樗哂械筒僮麟妷?、低功耗、大容量、擦?xiě)速度快等特點(diǎn),因此閃存(Flash Memory)正成為嵌入式系統(tǒng)中的一個(gè)重要組成單元。
然而閃存(Flash Memory)的一些特性造成了其在應(yīng)用上的不足,特別是其讀寫(xiě)操作做防掉電保護(hù)處理這個(gè)難題一直沒(méi)有很好的解決。
閃存(Flash Memory)區(qū)別于其它存儲(chǔ)介質(zhì)的特性主要有以下幾個(gè)1)閃存的最小尋址單位是字節(jié)(byte),而不是磁盤(pán)上的扇區(qū)(sector)。這意味著可以從一塊閃存的任意偏移(offset)讀數(shù)據(jù),但并不表明對(duì)閃存擦寫(xiě)操作也是以字節(jié)為單位進(jìn)行的。
2)當(dāng)一塊閃存處在干凈的狀態(tài)時(shí)(被擦除過(guò),但是還沒(méi)有寫(xiě)操作發(fā)生),在這塊flash上的每一位(bit)都是邏輯1。
3)閃存上的每一位(bit)可以被寫(xiě)操作置成邏輯0??墒前堰壿?置成邏輯1卻不能按位(bit)來(lái)操作,而只能按擦寫(xiě)塊(eraseblock)為單位進(jìn)行擦寫(xiě)操作。在一個(gè)擦寫(xiě)塊中進(jìn)行存儲(chǔ)時(shí),一旦對(duì)某一擦寫(xiě)塊中的某一位寫(xiě)0,再要改變成1,則必須先對(duì)整個(gè)block進(jìn)行擦除,然后才能修改。從上層來(lái)看,擦寫(xiě)所完成的功能就是把擦寫(xiě)塊內(nèi)的每一位都重設(shè)置(reset)成邏輯1。
4)閃存的使用壽命是有限的。具體來(lái)說(shuō),閃存的使用壽命是由擦寫(xiě)塊的最大可擦寫(xiě)次數(shù)來(lái)決定的。超過(guò)了最大可擦寫(xiě)次數(shù),這個(gè)擦寫(xiě)塊就成為壞塊(bad block)了。因此為了避免某個(gè)擦寫(xiě)塊被過(guò)度擦寫(xiě),以至于它先于其他的擦寫(xiě)塊達(dá)到最大可擦寫(xiě)次數(shù),我們應(yīng)該在盡量小的影響性能的前提下,使擦寫(xiě)操作均勻的分布在每個(gè)擦寫(xiě)塊上。這個(gè)過(guò)程叫做磨損平衡(wear leveling)。
由于閃存介質(zhì)的這些特性,目前運(yùn)行在閃存上文件系統(tǒng)要改寫(xiě)一個(gè)塊設(shè)備的扇區(qū)時(shí),通常是將這個(gè)扇區(qū)所在擦寫(xiě)塊地?cái)?shù)據(jù)讀到內(nèi)存中,放在緩存(buffer)中,然后將緩存中與這個(gè)扇區(qū)對(duì)應(yīng)的內(nèi)容用新的內(nèi)容替換掉,再對(duì)該擦寫(xiě)塊執(zhí)行擦寫(xiě)操作,最后將緩沖中的數(shù)據(jù)寫(xiě)回該擦寫(xiě)塊。
這種實(shí)現(xiàn)方式的缺點(diǎn)是很明顯的效率低,對(duì)一個(gè)扇區(qū)的更新要重寫(xiě)整個(gè)擦寫(xiě)塊上的數(shù)據(jù),也造成內(nèi)存空間很大的浪費(fèi);沒(méi)有提供磨損平衡,那些被頻繁更新的數(shù)據(jù)所在擦寫(xiě)塊將首先變成壞塊;非常不安全,很容易引起數(shù)據(jù)的丟失。如果在上面的操作最后兩步之間發(fā)生了突然掉電(power loss),那么整個(gè)擦寫(xiě)塊中的數(shù)據(jù)就全部丟失了。這在突然掉電經(jīng)常發(fā)生的嵌入式系統(tǒng)中是不能接受的。
發(fā)明內(nèi)容
本發(fā)明要解決的問(wèn)題是要克服上述閃存讀寫(xiě)操作當(dāng)中的磨損不平衡、不安全和內(nèi)存占用過(guò)多的缺點(diǎn),提供了一種安全、磨損平衡而且節(jié)省內(nèi)存的針對(duì)閃存的安全讀寫(xiě)的方法。
本發(fā)明解決技術(shù)問(wèn)題所采取的技術(shù)方案是一種閃存的安全讀寫(xiě)方法,基于錯(cuò)位讀寫(xiě),錯(cuò)位讀寫(xiě)是相對(duì)于通常所采用的本位讀寫(xiě)來(lái)說(shuō)的。所謂本位的寫(xiě)存儲(chǔ)器的方法是在經(jīng)過(guò)擦除的存儲(chǔ)原數(shù)據(jù)的存儲(chǔ)塊上重新寫(xiě)上需要修改的內(nèi)容,具體操作過(guò)程在背景技術(shù)已經(jīng)詳細(xì)描述。錯(cuò)位讀寫(xiě)方法最關(guān)鍵的就是在對(duì)閃存中的數(shù)據(jù)進(jìn)行修改的時(shí)候不在原來(lái)的物理地址上面,而是寫(xiě)在新的物理地址。閃存以擦寫(xiě)塊為單位進(jìn)行擦除操作,文件以文件頭加數(shù)據(jù)體的形式存儲(chǔ)在擦寫(xiě)塊上面,對(duì)閃存的改寫(xiě)步驟為1)根據(jù)文件頭信息讀取相應(yīng)的文件信息;2)在內(nèi)存當(dāng)中將數(shù)據(jù)體中需要修改的數(shù)據(jù)改為需要的數(shù)據(jù)內(nèi)容,修改文件頭信息;3)重新找一塊沒(méi)有使用過(guò)或者擦除后沒(méi)有使用的存儲(chǔ)區(qū),將內(nèi)存中的修改后的內(nèi)容按文件組織格式寫(xiě)入這個(gè)新的存儲(chǔ)區(qū)中相應(yīng)的位置;所述文件頭采用日志結(jié)構(gòu)記錄,其包括文件名、地址偏移、數(shù)據(jù)體長(zhǎng)度、文件總長(zhǎng)度、文件頭檢驗(yàn)碼、訪(fǎng)問(wèn)時(shí)間、版本號(hào)。
同一個(gè)文件以版本號(hào)新的為有效數(shù)據(jù),讀取文件信息時(shí),檢索版本號(hào)新的文件進(jìn)行讀取。
在寫(xiě)數(shù)據(jù)的過(guò)程中發(fā)生掉電,通過(guò)重新掃描閃存,根據(jù)文件頭檢驗(yàn)碼檢查每個(gè)文件日志信息的合法性,恢復(fù)成上一版本有效數(shù)據(jù)。
閃存的擦寫(xiě)塊剩下不多時(shí),系統(tǒng)會(huì)觸發(fā)垃圾回收功能。通過(guò)掃描文件頭信息,系統(tǒng)可以知道每個(gè)擦寫(xiě)塊上面的數(shù)據(jù)的有效性,當(dāng)一個(gè)擦寫(xiě)塊上面存儲(chǔ)的數(shù)據(jù)都為無(wú)效的時(shí)候,系統(tǒng)就可以重新擦寫(xiě)此擦寫(xiě)塊以回收利用它。如果相鄰擦寫(xiě)塊彼此的有效數(shù)據(jù)能合并為一個(gè)擦寫(xiě)塊時(shí),系統(tǒng)會(huì)自動(dòng)合并它們。
本發(fā)明具有以下優(yōu)越效果1.能安全而有效的達(dá)到閃存寫(xiě)的目的,即使在寫(xiě)數(shù)據(jù)的過(guò)程中發(fā)生掉電的情況,系統(tǒng)通過(guò)重新掃描閃存介質(zhì),檢查每個(gè)文件日志信息的合法性,也能很容易的恢復(fù)系統(tǒng)的數(shù)據(jù)。
2.不會(huì)為了改寫(xiě)某一個(gè)數(shù)據(jù)而需要將存儲(chǔ)這個(gè)數(shù)據(jù)的擦寫(xiě)塊全部擦除然后重新寫(xiě)一遍,能有效的避免頻繁的擦寫(xiě)某一個(gè)擦寫(xiě)塊,以至于它先于其他的擦寫(xiě)塊達(dá)到最大可擦寫(xiě)次數(shù),從而起到磨損平衡,提高閃存使用壽命的作用。
3.不需要每次重新讀寫(xiě)整個(gè)擦寫(xiě)塊,能有效的節(jié)省系統(tǒng)內(nèi)存的使用量,從而提高系統(tǒng)性能。
具體實(shí)施例方式
下面結(jié)合具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述本發(fā)明是采用的基于錯(cuò)位讀寫(xiě)的思想,錯(cuò)位是相對(duì)于以前通常所采用的本位來(lái)說(shuō)的。所謂本位的寫(xiě)存儲(chǔ)器的方法是在經(jīng)過(guò)擦除的存儲(chǔ)原數(shù)據(jù)的存儲(chǔ)塊上重新寫(xiě)上需要修改的內(nèi)容,具體操作過(guò)程在上面已經(jīng)詳細(xì)描述。
錯(cuò)位讀寫(xiě)的關(guān)鍵就是在對(duì)閃存的中的數(shù)據(jù)進(jìn)行修改的時(shí)候不在原來(lái)的物理地址上面,而是寫(xiě)在新的物理地址。這種方法最大的好處就是不會(huì)為了修改某一個(gè)地方而擦除整個(gè)擦寫(xiě)塊,然后重新讀寫(xiě)數(shù)據(jù),這樣不需要頻繁的擦寫(xiě)某個(gè)固定的擦寫(xiě)塊,同時(shí)也不需要占用過(guò)多的內(nèi)存容量,而且在一定機(jī)制下可以有效地達(dá)到防掉電的目的。為此對(duì)存儲(chǔ)在閃存的文件采用了一個(gè)日志結(jié)構(gòu)的方法,基于這樣一種日志管理的方法,很容易實(shí)現(xiàn)針對(duì)閃存的錯(cuò)位安全寫(xiě)。下面具體闡述整個(gè)過(guò)程的實(shí)現(xiàn)原理。
將系統(tǒng)數(shù)據(jù)以文件頭加數(shù)據(jù)體的形式存儲(chǔ)在閃存上面。文件頭日志包括文件名、地址偏移、數(shù)據(jù)體長(zhǎng)度、文件總長(zhǎng)度、文件頭檢驗(yàn)碼、訪(fǎng)問(wèn)時(shí)間、版本號(hào)(還可以根據(jù)具體的應(yīng)用來(lái)進(jìn)行擴(kuò)充)。如下表1表1
現(xiàn)分別解釋如下文件名文件的ID;地址偏移寫(xiě)操作的起始地址;數(shù)據(jù)體長(zhǎng)度文件數(shù)據(jù)體長(zhǎng)度;
文件總長(zhǎng)度文件總長(zhǎng)度,包括文件頭和數(shù)據(jù)體的長(zhǎng)度;訪(fǎng)問(wèn)時(shí)間系統(tǒng)訪(fǎng)問(wèn)此次日志文件的時(shí)間;文件頭檢驗(yàn)碼包含文件頭部的校驗(yàn)碼,保證文件的可靠性;版本號(hào)維護(hù)屬于上述文件頭所有元素的一個(gè)全序關(guān)系。
這個(gè)全序關(guān)系在整個(gè)操作過(guò)程中至關(guān)重要,下面詳細(xì)介紹一下這個(gè)全序關(guān)系。
如上表所示,假設(shè)某個(gè)文件有三個(gè)版本號(hào),分別是版本號(hào)1、2、3,他們對(duì)應(yīng)的地址偏移分別為0、200、175,數(shù)據(jù)長(zhǎng)度為200、200、50,寫(xiě)入數(shù)據(jù)分別為A、B、C,則當(dāng)系統(tǒng)從閃存上讀取文件頭信息后,會(huì)生成下面的映射信息
版本號(hào)1偏移0長(zhǎng)度200
版本號(hào)2偏移200長(zhǎng)度200
版本號(hào)3偏移175長(zhǎng)度50版本1的操作為從偏移0開(kāi)始寫(xiě)200個(gè)字節(jié)的‘A’,版本2的操作為從偏移200開(kāi)始寫(xiě)200個(gè)字節(jié)的‘B’,版本3的操作為從偏移175開(kāi)始寫(xiě)50個(gè)字節(jié)的‘C’,需要說(shuō)明的是這里的偏移地址均是對(duì)邏輯地址而言,而實(shí)際上三個(gè)版本的文件寫(xiě)在不同的物理地址上面,他們本身在物理地址上面并不存在重疊。根據(jù)這個(gè)映射信息表,系統(tǒng)就知道到相應(yīng)的存儲(chǔ)區(qū)去讀取相應(yīng)的文件內(nèi)容。同一個(gè)文件以版本號(hào)高的為有效數(shù)據(jù),因此,最后此文件的有效數(shù)據(jù)為版本3的從邏輯偏移175到225的50個(gè)字節(jié)‘C’。
當(dāng)需要改寫(xiě)某個(gè)文件的時(shí)候,不去管以前的文件的存儲(chǔ)物理地址,重新分配一塊存儲(chǔ)區(qū),還是按文件頭加數(shù)據(jù)體的形式寫(xiě)到閃存上面,只不過(guò)文件頭日志信息作出相應(yīng)改變,這樣系統(tǒng)根據(jù)掃描日志信息就能讀取到修改后的文件內(nèi)容。具體操作過(guò)程如下1)系統(tǒng)在內(nèi)存當(dāng)中將數(shù)據(jù)體中需要修改的數(shù)據(jù)改為需要的數(shù)據(jù)內(nèi)容;2)重新找一塊干凈的存儲(chǔ)區(qū)(沒(méi)有使用過(guò)或者擦除后沒(méi)有使用),將內(nèi)存中的修改后的內(nèi)容按文件組織格式寫(xiě)入這個(gè)新的存儲(chǔ)區(qū)中相應(yīng)的地方;3)寫(xiě)入部分日志信息,比方說(shuō)地址偏移、數(shù)據(jù)體長(zhǎng)度、文件總長(zhǎng)度、訪(fǎng)問(wèn)時(shí)間、文件頭檢驗(yàn)碼等;4)設(shè)置新版本號(hào)為原版本號(hào)加1。
以上技術(shù)方案可以清楚看出,本發(fā)明采用的閃存的錯(cuò)位寫(xiě)的方法能安全而有效的達(dá)到閃存讀寫(xiě)的目的,即使在寫(xiě)數(shù)據(jù)的過(guò)程中發(fā)生掉電的情況,系統(tǒng)通過(guò)重新掃描閃存介質(zhì),檢查每個(gè)文件日志信息的合法性,也能很容易的恢復(fù)系統(tǒng)的數(shù)據(jù)。另外如果閃存的擦寫(xiě)塊剩下不多時(shí),系統(tǒng)會(huì)觸發(fā)垃圾回收功能。通過(guò)掃描文件頭信息,系統(tǒng)可以知道每個(gè)擦寫(xiě)塊上面的數(shù)據(jù)的有效性,當(dāng)一個(gè)擦寫(xiě)塊上面存儲(chǔ)的數(shù)據(jù)都為無(wú)效的時(shí)候,系統(tǒng)就可以重新擦寫(xiě)此擦寫(xiě)塊以回收利用它。并且如果相鄰擦寫(xiě)塊彼此的有效數(shù)據(jù)較少時(shí),系統(tǒng)還會(huì)自動(dòng)合并它們。
通過(guò)以上操作,可以發(fā)現(xiàn)文件內(nèi)容已經(jīng)安全地改寫(xiě)為預(yù)定的值,只是寫(xiě)在其他物理地址上面,在這個(gè)過(guò)程當(dāng)中任何時(shí)候發(fā)生掉電都不會(huì)引起數(shù)據(jù)的丟失,從而達(dá)到了安全寫(xiě)的目的,而且錯(cuò)位寫(xiě)的方法也能有效的保證磨損平衡,不會(huì)因?yàn)轭l繁擦寫(xiě)某一個(gè)擦寫(xiě)塊而導(dǎo)致其提前成為壞塊。同時(shí)因?yàn)椴恍枰?jīng)常地讀寫(xiě)整個(gè)擦寫(xiě)塊,能有效地節(jié)省系統(tǒng)內(nèi)存,提高系統(tǒng)性能。
權(quán)利要求
1.一種閃存的安全讀寫(xiě)方法,閃存以擦寫(xiě)塊為單位進(jìn)行擦除操作,文件以采用日志結(jié)構(gòu)記錄的文件頭加數(shù)據(jù)體的形式存儲(chǔ)在擦寫(xiě)塊上面,對(duì)閃存的改寫(xiě)步驟為1)根據(jù)文件頭信息讀取相應(yīng)的文件信息;2)在內(nèi)存中將數(shù)據(jù)體中需要修改的數(shù)據(jù)改為需要的數(shù)據(jù)內(nèi)容,修改文件頭信息;3)重新找一塊沒(méi)有使用過(guò)或者擦除后沒(méi)有使用的存儲(chǔ)區(qū),將內(nèi)存中的修改后的內(nèi)容按文件組織格式寫(xiě)入這個(gè)新的存儲(chǔ)區(qū)中相應(yīng)的區(qū)域。
2.如權(quán)利要求1所述的閃存的安全讀寫(xiě)方法,其特征在于所述文件頭包括文件名、地址偏移、數(shù)據(jù)體長(zhǎng)度、文件總長(zhǎng)度、文件頭檢驗(yàn)碼、訪(fǎng)問(wèn)時(shí)間、版本號(hào)。
3.如權(quán)利要求2所述的閃存的安全讀寫(xiě)方法,其特征在于同一個(gè)文件以版本號(hào)新的為有效數(shù)據(jù)。
4.如權(quán)利要求2或3所述的閃存的安全讀寫(xiě)方法,其特征在于在寫(xiě)數(shù)據(jù)的過(guò)程中發(fā)生掉電,通過(guò)重新掃描閃存,根據(jù)文件頭檢驗(yàn)碼檢查每個(gè)文件日志信息的合法性,恢復(fù)數(shù)據(jù)。
5.如權(quán)利要求3所述的閃存的安全讀寫(xiě)方法,其特征在于讀取文件信息時(shí),檢索版本號(hào)新的文件進(jìn)行讀取。
6.如權(quán)利要求3所述的閃存的安全讀寫(xiě)方法,其特征在于改寫(xiě)文件頭信息包括設(shè)置版本號(hào)為原版本號(hào)加1。
7.如權(quán)利要求5所述的閃存的安全讀寫(xiě)方法,其特征在于通過(guò)掃描文件頭信息,檢查每個(gè)擦寫(xiě)塊上面的數(shù)據(jù)的有效性,當(dāng)一個(gè)擦寫(xiě)塊上面存儲(chǔ)的數(shù)據(jù)都為無(wú)效的存儲(chǔ)的數(shù)據(jù),就重新擦除此擦寫(xiě)塊以回收利用它。
8.如權(quán)利要求5所述的閃存的安全讀寫(xiě)方法,其特征在于當(dāng)相鄰擦寫(xiě)塊彼此的有效數(shù)據(jù)能合并為一個(gè)擦寫(xiě)塊就合并在一起。
全文摘要
本發(fā)明公開(kāi)了一種閃存的安全讀寫(xiě)方法,該方法閃存以擦寫(xiě)塊為單位進(jìn)行擦除操作,文件以采用日志結(jié)構(gòu)記錄的文件頭加數(shù)據(jù)體的形式存儲(chǔ)在擦寫(xiě)塊上面,根據(jù)文件頭對(duì)文件進(jìn)行讀、寫(xiě)操作。對(duì)閃存中的數(shù)據(jù)進(jìn)行修改的時(shí)候不在原來(lái)的物理地址上面,而是寫(xiě)在新的物理地址。本發(fā)明即使在寫(xiě)數(shù)據(jù)的過(guò)程中發(fā)生掉電的情況,系統(tǒng)通過(guò)重新掃描閃存介質(zhì),檢查每個(gè)文件頭日志信息的合法性,也能很容易的恢復(fù)系統(tǒng)的數(shù)據(jù)。而且閃存錯(cuò)位寫(xiě)的方法也能有效的保證閃存磨損平衡,不會(huì)因?yàn)轭l繁擦寫(xiě)某一個(gè)物理塊而導(dǎo)致其提前成為壞塊。因?yàn)椴恍枰?jīng)常地擦寫(xiě)整個(gè)擦寫(xiě)塊,能有效地節(jié)省系統(tǒng)內(nèi)存,提高系統(tǒng)性能。
文檔編號(hào)G06F17/30GK1851672SQ20061007291
公開(kāi)日2006年10月25日 申請(qǐng)日期2006年4月5日 優(yōu)先權(quán)日2006年4月5日
發(fā)明者陸舟, 于華章 申請(qǐng)人:北京飛天誠(chéng)信科技有限公司