一種Flash的數據寫入和讀取方法
【專利摘要】本發(fā)明公開了一種Flash的數據寫入和讀取方法,屬于存儲器領域。其中,數據寫入的方法包括:檢查物理頁面的數據區(qū)和索引區(qū)的剩余空間是否均充足,是則將本次寫入數據順序存儲到物理頁面的數據區(qū),并生成一條索引日志順序寫入到物理頁面的索引區(qū);否則組織物理頁面中的真實數據,將真實數據存儲到空閑頁面的數據區(qū),并根據真實數據生成索引日志寫入空閑頁面的索引區(qū);數據讀取的方法包括:根據物理頁面的索引區(qū)中的索引日志獲取要讀取的數據的真實存儲地址,從真實存儲地址中讀取數據。本發(fā)明的有益效果在于:既能提高數據的更新和讀取效率,又能保證Flash的空間利用率。
【專利說明】—種Flash的數據寫入和讀取方法
【技術領域】
[0001]本發(fā)明涉及存儲器領域,尤其涉及一種Flash的數據寫入和讀取方法。
【背景技術】
[0002]Flash是存儲芯片的一種,Flash存儲器又稱閃存,它結合了 ROM (只讀存儲器)和RAM (隨機存儲器)的長處,不僅具備電子可擦除可編程的性能,還可以快速讀取數據,使數據不會因為斷電而丟失。
[0003]發(fā)明人在實現本發(fā)明的過程中發(fā)現,基于Flash只能以塊為單位或者對整片執(zhí)行擦除操作的特性,現有技術中至少存在以下不足:有很多Flash芯片的頁面非常大,但是應用中每次需要更新的內容卻比較少,根據目前通用的方法,每次即使是更新幾個字節(jié)的數據,也要重新查找空閑物理頁面,然后將原始頁面的內容在RAM中更新后寫入新的物理頁面,采用這種方法進行數據更新,效率低,且會縮短Flash的壽命;
[0004]針對上述問題的一種解決方式是將物理頁面劃分為有效數據區(qū)和日志區(qū),有效數據區(qū)用于存儲數據,當需要更新有效數據區(qū)中的數據時,不進行擦除操作,而是生成一條包含更新數據的更新日志寫入日志區(qū);這種方法的缺點在于會降低讀取效率和空間利用率。
【發(fā)明內容】
[0005]本發(fā)明的目的是為了克服現有技術的缺陷,提出一種Flash的數據寫入和讀取方法。
[0006]本發(fā)明方法是通過下述技術方案實現的:
[0007]—方面,本發(fā)明提供了一種Flash的數據寫入方法,其基本實施過程如下:
[0008]S10:根據寫入地址計算得到本次寫入數據的邏輯頁號和本次寫入數據的頁內偏移地址,根據邏輯頁號和物理頁號對應關系查找與所述本次寫入數據的邏輯頁號對應的物理頁面;
[0009]S20:判斷所述物理頁面的數據區(qū)和索引區(qū)的剩余空間是否均充足,是則將本次寫入數據順序存儲到所述物理頁面的數據區(qū),并根據所述本次寫入數據的頁內偏移地址、本次寫入數據的長度和本次寫入數據的存儲地址生成一條索引日志,將生成的索引日志順序寫入所述物理頁面的索引區(qū),結束,否則執(zhí)行S30 ;
[0010]S30:查找空閑頁面,執(zhí)行S40 ;
[0011]S40:讀取所述物理頁面的數據區(qū)中存儲的數據,根據所述物理頁面的索引區(qū)中的索引日志和本次寫入數據對讀取到的數據進行組織,得到所述物理頁面的數據區(qū)中的有效數據,將所述有效數據順序寫入所述空閑頁面的數據區(qū),并根據所述有效數據生成索引日志,將生成的索引日志順序寫入所述空閑頁面的索引區(qū),執(zhí)行S50 ;
[0012]S50:更新所述邏輯頁號和物理頁號對應關系;
[0013]具體地,所述根據邏輯頁號和物理頁號對應關系查找與所述本次寫入數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次寫入數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面;
[0014]所述更新所述邏輯頁號和物理頁號對應關系具體包括:將所述邏輯頁號物理頁號映射表中與所述本次寫入數據的邏輯頁號對應的物理頁號更新為所述空閑頁面的物理頁號;
[0015]所述判斷所述物理頁面的數據區(qū)的剩余空間是否充足具體包括:
[0016]步驟Al:根據所述物理頁面的索引區(qū)中的最后一條索引日志計算本次寫入數據的存儲地址;
[0017]步驟A2:計算本次寫入數據的存儲地址加上本次寫入數據的長度,判斷計算結果是否大于所述物理頁面的數據區(qū)的最大頁內偏移地址,是則所述物理頁面的數據區(qū)的剩余空間不充足,否則所述物理頁面的數據區(qū)的剩余空間充足;
[0018]所述步驟Al具體包括:查找所述物理頁面的索引區(qū)中的最后一條索引日志,獲取所述最后一條索引日志中的寫入數據的存儲地址和寫入數據的長度,計算獲取到的寫入數據的存儲地址和寫入數據的長度的和,得到本次寫入數據的存儲地址;
[0019]所述判斷所述物理頁面的索引區(qū)的剩余空間是否充足具體包括:
[0020]步驟B1:計算所述物理頁面的索引區(qū)的剩余空間;
[0021]步驟B2:判斷所述物理頁面索引區(qū)的剩余空間是否大于一條索引日志的長度,是則所述物理頁面的索引區(qū)的剩余空間充足,否則所述物理頁面的索引區(qū)的剩余空間不充足;
[0022]所述步驟BI具體包括:查找所述物理頁面的索引區(qū)中的最后一條索引日志,根據所述最后一條索引日志結尾處在所述物理頁面中的偏移地址得到所述物理頁面的索引區(qū)已使用的字節(jié)數,計算所述物理頁面的索引區(qū)的大小減去所述物理頁面的索引區(qū)已使用的字節(jié)數,得到所述物理頁面的索引區(qū)的剩余空間;
[0023]所述S40具體包括:
[0024]步驟Cl:初始化大小等于所述物理頁面的數據區(qū)大小的內存空間;
[0025]步驟C2:順序讀取所述物理頁面的索引區(qū)中的索引日志,根據索引日志中的寫入數據的存儲地址和寫入數據的長度從所述物理頁面的數據區(qū)中讀取相應的數據,按照索引日志中的寫入數據的頁內偏移地址將讀取到的數據寫入所述內存空間的相應位置;
[0026]步驟C3:按照本次寫入數據的頁內偏移地址將本次寫入數據寫入所述內存空間的相應位置;
[0027]步驟C4:遍歷所述內存空間,每當查找到所述內存空間中的一塊非空閑區(qū)域時,讀取所述非空閑區(qū)域中的數據,將讀取到的數據寫入所述空閑頁面的數據區(qū),并根據讀取到的數據生成一條索引日志寫入所述空閑頁面的索引區(qū);
[0028]進一步地,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:遍歷所述物理頁面的索引區(qū),當查找到連續(xù)的不少于預設個數的值為預設值的字節(jié)數據時,確定這些字節(jié)數據之前的索引日志為所述物理頁面的索引區(qū)中的最后一條索引日志;
[0029]或者,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:
[0030]al:定位所述物理頁面的索引區(qū)中有效存儲空間的首字節(jié)和末字節(jié),將所述首字節(jié)作為當前起始字節(jié)、所述末字節(jié)作為當前結尾字節(jié),執(zhí)行a2 ;
[0031]a2:定位所述當前起始字節(jié)到所述當前結尾字節(jié)的中間字節(jié),作為當前中間字節(jié),執(zhí)行a3 ;
[0032]a3:從當前中間字節(jié)之后的一個字節(jié)開始,向后讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則將當前中間字節(jié)作為當前起始字節(jié),返回a2,否則執(zhí)行a4;
[0033]a4:從當前中間字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則將當前中間字節(jié)作為當前結尾字節(jié),返回a2;
[0034]或者,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:
[0035]bl:定位所述物理頁面的索引區(qū)中有效存儲空間的末字節(jié),將所述末字節(jié)作為當前字節(jié),執(zhí)行b2 ;
[0036]b2:從當前字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索弓舊志,否則執(zhí)行b3;
[0037]b3:將讀取到的數據之前的一個字節(jié)作為當前字節(jié),返回b2 ;
[0038]其中,所述判斷讀取到的數據是否為一條索引日志具體包括:判斷讀取到的數據的每個字節(jié)是否均為預設值,是則判定讀取到的數據不是一條索引日志,否則判定讀取到的數據是一條索引日志。
[0039]另一方面,本發(fā)明還提供了一種Flash的數據讀取方法,其基本實施過程如下:
[0040]T10:根據讀取地址計算本次要讀取的數據的邏輯頁號和本次要讀取的數據的頁內偏移地址,根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面;
[0041]T20:根據本次要讀取的數據的長度設置并復位與本次要讀取的數據對應的讀取標志;
[0042]T30:查找并讀取所述物理頁面的索引區(qū)中的最后一條索引日志,作為當前索引日志;
[0043]T40:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度判斷當前索引日志是否涉及本次要讀取的數據中讀取標志未置位的數據,是則執(zhí)行T60,否則執(zhí)行T50 ;
[0044]T50:讀取當前索引日志的前一條索引日志,作為當前索引日志,返回T40 ;
[0045]T60:根據當前索引日志中的寫入數據的存儲地址從所述物理頁面中讀取涉及到的數據,并將與讀取到的數據對應的讀取標志置位;
[0046]T70:檢查所述與本次要讀取的數據對應的讀取標志,判斷是否讀取到全部的本次要讀取的數據,是則結束,否則返回T50 ;
[0047]具體地,所述根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次要讀取的數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面;
[0048]所述T20具體包括:設置并復位個數等于本次要讀取的數據的長度的讀取標志,分別對應本次要讀取的數據中的每個字節(jié)數據;
[0049]所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:遍歷所述物理頁面的索引區(qū),當查找到連續(xù)的不少于預設個數的值為預設值的字節(jié)數據時,確定這些字節(jié)數據之前的索引日志為所述物理頁面的索引區(qū)中的最后一條索引日志;
[0050]或者,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:
[0051]al:定位所述物理頁面的索引區(qū)中有效存儲空間的首字節(jié)和末字節(jié),將所述首字節(jié)作為當前起始字節(jié)、所述末字節(jié)作為當前結尾字節(jié),執(zhí)行a2 ;
[0052]a2:定位所述當前起始字節(jié)到所述當前結尾字節(jié)的中間字節(jié),作為當前中間字節(jié),執(zhí)行a3 ;
[0053]a3:從當前中間字節(jié)之后的一個字節(jié)開始,向后讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則將當前中間字節(jié)作為當前起始字節(jié),返回a2,否則執(zhí)行a4;
[0054]a4:從當前中間字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則將當前中間字節(jié)作為當前結尾字節(jié),返回a2;
[0055]所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:
[0056]bl:定位所述物理頁面的索引區(qū)中有效存儲空間的末字節(jié),將所述末字節(jié)作為當前字節(jié),執(zhí)行b2 ;
[0057]b2:從當前字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索弓舊志,否則執(zhí)行b3;
[0058]b3:將讀取到的數據之前的一個字節(jié)作為當前字節(jié),返回b2 ;
[0059]其中,所述判斷讀取到的數據是否為一條索引日志具體包括:判斷讀取到的數據的每個字節(jié)是否均為預設值,是則讀取到的數據不是一條索引日志,否則讀取到的數據是一條索引日志;
[0060]所述T40具體包括:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度計算得到當前索引日志涉及的頁內偏移地址范圍,判斷本次要讀取的數據中讀取標志未置位的數據的頁內偏移地址是否有在計算得到的頁內偏移地址范圍內的,是則當前索引日志涉及本次要讀取的數據中讀取標志未置位的數據,執(zhí)行T60,否則前索引日志不涉及本次要讀取的數據中讀取標志未置位的數據,執(zhí)行T50 ;
[0061]所述T70具體包括:判斷與本次要讀取的數據對應的讀取標志是否均置位,是則讀取到全部的本次要讀取的數據,結束,否則沒有讀取到全部的本次要讀取的數據,返回T50。
[0062]又一方面,本發(fā)明還提供了一種Flash的數據讀取方法,其基本實施過程如下:
[0063]U10:根據讀取地址計算本次要讀取的數據的邏輯頁號和本次要讀取的數據的頁內偏移地址,根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面;
[0064]U20:初始化大小等于所述物理頁面的數據區(qū)大小的內存空間;
[0065]U30:順序讀取所述物理頁面的索引區(qū)中的索引日志,根據讀取到的索引日志中的寫入數據的存儲地址和寫入數據的長度從所述物理頁面的數據區(qū)中讀取相應的數據,按照讀取到的索引日志中的寫入數據的頁內偏移地址將讀取到的數據寫入所述內存空間的相應位置;
[0066]U40:根據本次要讀取的數據的頁內偏移地址和本次要讀取的數據的長度從所述內存空間中讀取本次要讀取的數據,結束;
[0067]具體地,所述根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次要讀取的數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面;
[0068]所述U30具體包括:
[0069]Cl:順序讀取一條所述物理頁面的索引區(qū)中的索引日志,作為當前索引日志;
[0070]c2:按照當前索引日志中的寫入數據的存儲地址和寫入數據的長度從所述物理頁面的數據區(qū)中讀取相應的數據,按照索引日志中的寫入數據的頁內偏移地址將讀取到的數據寫入所述內存空間的相應位置;
[0071]c3:判斷所述物理頁面的索引區(qū)中是否還有未讀取的索引日志,是則返回Cl,否則執(zhí)行U40。
[0072]再一方面,本發(fā)明還提供了一種Flash的數據讀取方法,其基本實施過程如下:
[0073]V10:根據讀取地址計算本次要讀取的數據的邏輯頁號和本次要讀取的數據的頁內偏移地址,根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面;
[0074]V20:根據本次要讀取的數據的頁內偏移地址初始化當前頁內偏移地址;
[0075]V30:查找并讀取所述物理頁面的索引區(qū)中的最后一條索引日志,作為當前索引日志,執(zhí)行V40 ;
[0076]V40:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度判斷當前索引日志是否涉及當前頁內偏移地址,是則執(zhí)行V60,否則執(zhí)行V50;
[0077]V50:讀取當前索引日志的前一條索引日志,作為當前索引日志,返回V40 ;
[0078]V60:根據當前索引日志中的寫入數據的存儲地址從所述物理頁面的數據區(qū)中讀取當前索引日志涉及到的本次要讀取的數據中從當前頁內偏移地址開始的數據,并根據讀取到的數據更新當前頁內偏移地址,執(zhí)行V70 ;
[0079]V70:判斷是否讀取到全部的本次要讀取的數據,是則結束,否則返回V30 ;
[0080]具體地,所述根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次要讀取的數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面;
[0081]所述根據本次要讀取的數據的頁內偏移地址初始化當前頁內偏移地址具體包括:初始化當前頁內偏移地址為本次要讀取的數據的頁內偏移地址;
[0082]所述根據讀取到的數據更新當前頁內偏移地址具體包括:更新當前頁內偏移地址為讀取到的數據中的最后一個字節(jié)數據對應的頁內偏移地址的下一頁內偏移地址;
[0083]所述判斷是否讀取到全部的本次要讀取的數據具體包括:計算本次要讀取的數據的頁內偏移地址加上本次要讀取的數據的長度,判斷計算結果是否小于當前頁內偏移地址,是則讀取到全部的要讀取的數據,否則未讀取到全部的要讀取的數據;
[0084]所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:遍歷所述物理頁面的索引區(qū),當查找到連續(xù)的不少于預設個數的值為預設值的字節(jié)數據時,確定這些字節(jié)數據之前的索引日志為所述物理頁面的索引區(qū)中的最后一條索引日志;
[0085]所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:
[0086]al:定位所述物理頁面的索引區(qū)中有效存儲空間的首字節(jié)和末字節(jié),將所述首字節(jié)作為當前起始字節(jié)、所述末字節(jié)作為當前結尾字節(jié),執(zhí)行a2 ;
[0087]a2:定位所述當前起始字節(jié)到所述當前結尾字節(jié)的中間字節(jié),作為當前中間字節(jié),執(zhí)行a3 ;
[0088]a3:從當前中間字節(jié)之后的一個字節(jié)開始,向后讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則將當前中間字節(jié)作為當前起始字節(jié),返回a2,否則執(zhí)行a4;
[0089]a4:從當前中間字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則將當前中間字節(jié)作為當前結尾字節(jié),返回a2 ;
[0090]所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:
[0091]bl:定位所述物理頁面的索引區(qū)中有效存儲空間的末字節(jié),將所述末字節(jié)作為當前字節(jié),執(zhí)行b2 ;
[0092]b2:從當前字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索弓舊志,否則執(zhí)行b3;
[0093]b3:將讀取到的數據之前的一個字節(jié)作為當前字節(jié),返回b2 ;
[0094]其中,所述判斷讀取到的數據是否為一條索引日志具體包括:判斷讀取到的數據的每個字節(jié)是否均為預設值,是則判定讀取到的數據不是一條索引日志,否則判定讀取到的數據是一條索引日志;
[0095]所述根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度判斷當前索引日志是否涉及當前頁內偏移地址,具體包括:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度計算得到當前索引日志涉及的頁內偏移地址范圍,判斷當前頁內偏移地址是否在計算得到的頁內偏移地址范圍內,是則當前索引日志涉及當前頁內偏移地址,否則當前索引日志不涉及當前頁內偏移地址;
[0096]進一步地,所述V20中還包括:初始化當前計數;
[0097]所述V60中,所述根據當前索引日志中的寫入數據的存儲地址從所述物理頁面的數據區(qū)中讀取當前索引日志涉及到的本次要讀取的數據中從當前頁內偏移地址開始的數據,之后還包括:根據讀取到的數據更新當前計數;
[0098]所述V70具體包括:判斷當前計數是否等于預設值,是則讀取到全部的本次要讀取的數據,否則沒有讀取到全部的本次要讀取的數據;
[0099]所述初始化當前計數具體包括:初始化當前計數為本次要讀取的數據的長度;
[0100]所述根據讀取到的數據更新當前計數具體包括:更新當前計數為其當前值減去讀取到的數據的長度;
[0101]所述判斷當前計數是否等于預設值具體包括:判斷當前計數是否等于O ;
[0102]或者,所述初始化當前計數具體包括:初始化當前計數為O ;
[0103]所述根據讀取到的數據更新當前計數具體包括:更新當前計數為其當前值加上讀取到的數據的長度;
[0104]所述判斷當前計數是否等于預設值具體包括:判斷當前計數是否等于本次要讀取的數據的長度。
[0105]本發(fā)明方法的有益效果在于,采用本發(fā)明提供的方法可以提高數據更新的效率,特別是在Flash頁面較大,每次更新的數據量較小的情況下,能夠大幅提升Flash的性能和壽命。
【專利附圖】
【附圖說明】
[0106]為了更清楚的說明本發(fā)明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單的介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
[0107]圖1為本發(fā)明實施例一提供的一種Flash的數據寫入方法的流程圖;
[0108]圖2為本發(fā)明實施例一中所述物理頁面的一種不意圖;
[0109]圖3為向圖2所示的物理頁面中寫入本次寫入數據之后,所述物理頁面的示意圖;
[0110]圖4為向圖3所示的物理頁面中寫入根據本次寫入數據生成的索引日志之后,所述物理頁面的示意圖;
[0111]圖5為本發(fā)明實施例一中所述物理頁面的另一種不意圖;
[0112]圖6為本發(fā)明實施例一中查找到的空閑頁面的示意圖;
[0113]圖7為向圖6所示的空閑頁面中寫入所述物理頁面的數據區(qū)中的有效數據后,所述空閑頁面的示意圖;
[0114]圖8為向圖7所示的空閑頁面中寫入根據所述物理頁面的數據區(qū)中的有效數據生成的索引日志后,所述空閑頁面的示意圖;
[0115]圖9為本發(fā)明實施例二提供的一種Flash的讀取數據方法的流程圖;
[0116]圖10為本發(fā)明實施例三提供的一種Flash的讀取數據方法的流程圖;
[0117]圖11為本發(fā)明實施例四提供的一種Flash的讀取數據方法的流程圖。
【具體實施方式】
[0118]下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
[0119]本發(fā)明提供的一種Flash的數據寫入和讀取方法,將Flash的物理頁面劃分為數據區(qū)和索引區(qū),數據區(qū)用于存儲數據,索引區(qū)用于存儲索引日志,當需要向Flash的物理頁面中寫入數據時,將數據順序寫入該物理頁面的數據區(qū),同時添加一條索引日志到該物理頁面的索引區(qū),當該物理頁面的索引區(qū)和/或數據區(qū)寫滿后,查找一個空閑頁面,用查找到的空閑頁面替換該物理頁面;當需要讀取Flash的物理頁面中的數據時,根據該物理頁面日志區(qū)中的索引日志得到要讀取的頁內偏移地址中的真實數據,讀取所述真實數據并返回。
[0120]本發(fā)明中,索引日志中包含寫入數據的頁內偏移地址、寫入數據的長度和寫入數據的存儲地址,其中,寫入數據的頁內偏移地址為寫入數據應該寫入的地址,寫入數據的存儲地址為寫入數據實際寫入的地址。
[0121]實施例一
[0122]參見圖1,本發(fā)明實施例一提供一種Flash的數據寫入方法,包括:
[0123]步驟101:根據寫入地址計算得到本次寫入數據的邏輯頁號和本次寫入數據的頁內偏移地址;
[0124]例如,本實施例中,要向Flash的邏輯地址0x2005中寫入數據,Flash的物理頁面和邏輯頁面的大小均為4KB,則本次寫入數據的邏輯頁號=I 0x2005/0x1000 | =2,本次寫入數據的頁內偏移地址=0x2005-2*0x1000=0x0005。
[0125]步驟102:根據邏輯頁號和物理頁號對應關系查找與本次寫入數據的邏輯頁號對應的物理頁面;
[0126]優(yōu)選地,本實施例中,邏輯頁號和物理頁號對應關系通過邏輯頁號物理頁號映射表體現,步驟102包括:查詢邏輯頁號物理頁號映射表,得到與本次寫入數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面;
[0127]例如,本實施例中,本次寫入數據的邏輯頁號為2,邏輯頁號物理頁號映射表如下:
[0128]
【權利要求】
1.一種Flash的數據寫入方法,其特征在于,包括: SlO:根據寫入地址計算得到本次寫入數據的邏輯頁號和本次寫入數據的頁內偏移地址,根據邏輯頁號和物理頁號對應關系查找與所述本次寫入數據的邏輯頁號對應的物理頁面; S20:判斷所述物理頁面的數據區(qū)和索引區(qū)的剩余空間是否均充足,是則將本次寫入數據順序存儲到所述物理頁面的數據區(qū),并根據所述本次寫入數據的頁內偏移地址、本次寫入數據的長度和本次寫入數據的存儲地址生成一條索引日志,將生成的索引日志順序寫入所述物理頁面的索引區(qū),結束,否則執(zhí)行S30 ; S30:查找空閑頁面,執(zhí)行S40 ; S40:讀取所述物理頁面的數據區(qū)中存儲的數據,根據所述物理頁面的索引區(qū)中的索引日志和本次寫入數據對讀取到的數據進行組織,得到所述物理頁面的數據區(qū)中的有效數據,將所述有效數據順序寫入所述空閑頁面的數據區(qū),并根據所述有效數據生成索引日志,將生成的索引日志順序寫入所述空閑頁面的索引區(qū),執(zhí)行S50 ; S50:更新所述邏輯頁號和物理頁號對應關系。
2.根據權利要求1所述的方法,其特征在于,所述根據邏輯頁號和物理頁號對應關系查找與所述本次寫入數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次寫入數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面。
3.根據權利要求2所述的方法,其特征在于,所述更新所述邏輯頁號和物理頁號對應關系具體包括:將所述邏輯頁號物理頁號映射表中與所述本次寫入數據的邏輯頁號對應的物理頁號更新為所述空閑頁面的物理頁號。
4.根據權利要求1所述方法,其特征在于,所述判斷所述物理頁面的數據區(qū)的剩余空間是否充足具體包括: 步驟Al:根據所述物理頁面的索引區(qū)中的最后一條索引日志計算本次寫入數據的存儲地址; 步驟A2:計算本次寫入數據的存儲地址加上本次寫入數據的長度,判斷計算結果是否大于所述物理頁面的數據區(qū)的最大頁內偏移地址,是則所述物理頁面的數據區(qū)的剩余空間不充足,否則所述物理頁面的數據區(qū)的剩余空間充足。
5.根據權利要求4述的方法,其特征在于,所述步驟Al具體包括:查找所述物理頁面的索引區(qū)中的最后一條索引日志,獲取所述最后一條索引日志中的寫入數據的存儲地址和寫入數據的長度,計算獲取到的寫入數據的存儲地址和寫入數據的長度的和,得到本次寫入數據的存儲地址。
6.根據權利要求1述的方法,其特征在于,所述判斷所述物理頁面的索引區(qū)的剩余空間是否充足具體包括: 步驟B1:計算所述物理頁面的索引區(qū)的剩余空間; 步驟B2:判斷所述物理頁面索引區(qū)的剩余空間是否大于一條索引日志的長度,是則所述物理頁面的索引區(qū)的剩余空間充足,否則所述物理頁面的索引區(qū)的剩余空間不充足。
7.根據權利要求6所述的方法,其特征在于,所述步驟BI具體包括:查找所述物理頁面的索引區(qū)中的最后一條索引日志,根據所述最后一條索引日志結尾處在所述物理頁面中的偏移地址得到所述物理頁面的索引區(qū)已使用的字節(jié)數,計算所述物理頁面的索引區(qū)的大小減去所述物理頁面的索引區(qū)已使用的字節(jié)數,得到所述物理頁面的索引區(qū)的剩余空間。
8.根據權利要求5或7所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:遍歷所述物理頁面的索引區(qū),當查找到連續(xù)的不少于預設個數的值為預設值的字節(jié)數據時,確定這些字節(jié)數據之前的索引日志為所述物理頁面的索引區(qū)中的最后一條索引日志。
9.根據權利要求5或7所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括: 步驟al:定位所述物理頁面的索引區(qū)中有效存儲空間的首字節(jié)和末字節(jié),將所述首字節(jié)作為當前起始字節(jié)、所述末字節(jié)作為當前結尾字節(jié),執(zhí)行步驟a2 ; 步驟a2:定位所述當前起始字節(jié)到所述當前結尾字節(jié)的中間字節(jié),作為當前中間字節(jié),執(zhí)行步驟a3 ; 步驟a3:從當前中間字節(jié)之后的一個字節(jié)開始,向后讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則將當前中間字節(jié)作為當前起始字節(jié),返回步驟a2,否則執(zhí)行步驟a4 ; 步驟a4:從當前中間字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則將當前中間字節(jié)作為當前結尾字節(jié),返回步驟a2。
10.根據權利要求5或7所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括: 步驟bl:定位所述物理頁面的索引區(qū)中有效存儲空間的末字節(jié),將所述末字節(jié)作為當前字節(jié),執(zhí)行步驟b2 ; 步驟b2:從當前字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則執(zhí)行步驟b3; 步驟b3:將讀取到的數據之前的一個字節(jié)作為當前字節(jié),返回步驟b2。
11.根據權利要求10所述的方法,其特征在于,所述判斷讀取到的數據是否為一條索引日志具體包括:判斷讀取到的數據的每個字節(jié)是否均為預設值,是則讀取到的數據不是一條索引日志,否則讀取到的數據是一條索引日志。
12.根據權利要求1所述的方法,其特征在于,所述S40具體包括: 步驟Cl:初始化大小等于所述物理頁面的數據區(qū)大小的內存空間; 步驟C2:順序讀取所述物理頁面的索引區(qū)中的索引日志,根據索引日志中的寫入數據的存儲地址和寫入數據的長度從所述物理頁面的數據區(qū)中讀取相應的數據,按照索引日志中的寫入數據的頁內偏移地址將讀取到的數據寫入所述內存空間的相應位置; 步驟C3:按照本次寫入數據的頁內偏移地址將本次寫入數據寫入所述內存空間的相應位置; 步驟C4:遍歷所述內存空間,每當查找到所述內存空間中的一塊非空閑區(qū)域時,讀取所述非空閑區(qū)域中的數據,將讀取到的數據寫入所述空閑頁面的數據區(qū),并根據讀取到的數據生成一條索引日志寫入所述空閑頁面的索引區(qū)。
13.—種Flash的數據讀取方法,其特征在于,包括: TlO:根據讀取地址計算本次要讀取的數據的邏輯頁號和本次要讀取的數據的頁內偏移地址,根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面; T20:根據本次要讀取的數據的長度設置并復位與本次要讀取的數據對應的讀取標志; T30:查找并讀取所述物理頁面的索引區(qū)中的最后一條索引日志,作為當前索引日志;T40:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度判斷當前索引日志是否涉及本次要讀取的數據中讀取標志未置位的數據,是則執(zhí)行T60,否則執(zhí)行T50 ; T50:讀取當前索引日志的前一條索引日志,作為當前索引日志,返回T40 ; T60:根據當前索引日志中的寫入數據的存儲地址從所述物理頁面中讀取涉及到的數據,并將與讀取到的數據對應的讀取標志置位; T70:檢查所述與本次要讀取的數據對應的讀取標志,判斷是否讀取到全部的本次要讀取的數據,是則結束,否則返回T50。
14.根據權利要求13所述的方法,其特征在于,所述根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次要讀取的數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面。
15.根據權利要求13所述的方法,其特征在于,所述T20具體包括:設置并復位個數等于本次要讀取的數據的長度的讀取標志,分別對應本次要讀取的數據中的每個字節(jié)數據。
16.根據權利要求13所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:遍歷所述物理頁面的索引區(qū),當查找到連續(xù)的不少于預設個數的值為預設值的字節(jié)數據時,確定這些字節(jié)數據之前的索引日志為所述物理頁面的索引區(qū)中的最后一條索引日志。
17.根據權利要求13所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括: al:定位所述物理頁面的索引區(qū)中有效存儲空間的首字節(jié)和末字節(jié),將所述首字節(jié)作為當前起始字節(jié)、所述末字節(jié)作為當前結尾字節(jié),執(zhí)行a2 ; a2:定位所述當前起始字節(jié)到所述當前結尾字節(jié)的中間字節(jié),作為當前中間字節(jié),執(zhí)行a3 ; a3:從當前中間字節(jié)之后的一個字節(jié)開始,向后讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則將當前中間字節(jié)作為當前起始字節(jié),返回a2,否則執(zhí)行a4 ; a4:從當前中間字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則將當前中間字節(jié)作為當前結尾字節(jié),返回a2。
18.根據權利要求13所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:bl:定位所述物理頁面的索引區(qū)中有效存儲空間的末字節(jié),將所述末字節(jié)作為當前字節(jié),執(zhí)行b2 ; b2:從當前字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則執(zhí)行b3 ; b3:將讀取到的數據之前的一個字節(jié)作為當前字節(jié),返回b2。
19.根據權利要求18所述的方法,其特征在于,所述判斷讀取到的數據是否為一條索引日志具體包括:判斷讀取到的數據的每個字節(jié)是否均為預設值,是則讀取到的數據不是一條索引日志,否則讀取到的數據是一條索引日志。
20.根據權利要求13所述的方法,其特征在于,所述T40具體包括:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度計算得到當前索引日志涉及的頁內偏移地址范圍,判斷本次要讀取的數據中讀取標志未置位的數據的頁內偏移地址是否有在計算得到的頁內偏移地址范圍內的,是則當前索引日志涉及本次要讀取的數據中讀取標志未置位的數據,執(zhí)行T60,否則前索引日志不涉及本次要讀取的數據中讀取標志未置位的數據,執(zhí)行T50。
21.根據權利要求13所述的方法,其特征在于,所述T70具體包括:判斷與本次要讀取的數據對應的讀取標志是否均置位,是則讀取到全部的本次要讀取的數據,結束,否則沒有讀取到全部的本次要讀取的數據,返回T50。
22.—種Flash的數據讀取方法,其特征在于,包括: U10:根據讀取地址計算本次要讀取的數據的邏輯頁號和本次要讀取的數據的頁內偏移地址,根據邏輯頁號和物理`頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面; U20:初始化大小等于所述物理頁面的數據區(qū)大小的內存空間; U30:順序讀取所述物理頁面的索引區(qū)中的索引日志,根據讀取到的索引日志中的寫入數據的存儲地址和寫入數據的長度從所述物理頁面的數據區(qū)中讀取相應的數據,按照讀取到的索引日志中的寫入數據的頁內偏移地址將讀取到的數據寫入所述內存空間的相應位置; U40:根據本次要讀取的數據的頁內偏移地址和本次要讀取的數據的長度從所述內存空間中讀取本次要讀取的數據,結束。
23.根據權利要求22所述的方法,其特征在于,所述根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次要讀取的數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面。
24.根據權利要求22所述的方法,其特征在于,所述U30具體包括: Cl:順序讀取一條所述物理頁面的索引區(qū)中的索引日志,作為當前索引日志;c2:按照當前索引日志中的寫入數據的存儲地址和寫入數據的長度從所述物理頁面的數據區(qū)中讀取相應的數據,按照索引日志中的寫入數據的頁內偏移地址將讀取到的數據寫入所述內存空間的相應位置; c3:判斷所述物理頁面的索引區(qū)中是否還有未讀取的索引日志,是則返回Cl,否則執(zhí)行 U40。
25.—種Flash的數據讀取方法,其特征在于,包括: VlO:根據讀取地址計算本次要讀取的數據的邏輯頁號和本次要讀取的數據的頁內偏移地址,根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面; V20:根據本次要讀取的數據的頁內偏移地址初始化當前頁內偏移地址; V30:查找并讀取所述物理頁面的索引區(qū)中的最后一條索引日志,作為當前索引日志,執(zhí)行V40 ; V40:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度判斷當前索引日志是否涉及當前頁內偏移地址,是則執(zhí)行V60,否則執(zhí)行V50 ; V50:讀取當前索引日志的前一條索引日志,作為當前索引日志,返回V40 ; V60:根據當前索引日志中的寫入數據的存儲地址從所述物理頁面的數據區(qū)中讀取當前索引日志涉及到的本次要讀取的數據中從當前頁內偏移地址開始的數據,并根據讀取到的數據更新當前頁內偏移地址,執(zhí)行V70 ; V70:判斷是否讀取到全部的本次要讀取的數據,是則結束,否則返回V30。
26.根據權利要求25所述的方法,其特征在于,所述根據邏輯頁號和物理頁號對應關系查找與本次要讀取的數據的邏輯頁號對應的物理頁面具體包括:查詢邏輯頁號物理頁號映射表,得到與本次要讀取的數據的邏輯頁號對應的物理頁號,在Flash中查找物理頁號為所述物理頁號的物理頁面。
27.根據權利要求25所述的`方法,其特征在于,所述根據本次要讀取的數據的頁內偏移地址初始化當前頁內偏移地址具體包括:初始化當前頁內偏移地址為本次要讀取的數據的頁內偏移地址; 所述根據讀取到的數據更新當前頁內偏移地址具體包括:更新當前頁內偏移地址為讀取到的數據中的最后一個字節(jié)數據對應的頁內偏移地址的下一頁內偏移地址; 所述判斷是否讀取到全部的本次要讀取的數據具體包括:計算本次要讀取的數據的頁內偏移地址加上本次要讀取的數據的長度,判斷計算結果是否小于當前頁內偏移地址,是則讀取到全部的要讀取的數據,否則未讀取到全部的要讀取的數據。
28.根據權利要求25所述的方法,其特征在于,所述V20中還包括:初始化當前計數; 所述V60中,所述根據當前索引日志中的寫入數據的存儲地址從所述物理頁面的數據區(qū)中讀取當前索引日志涉及到的本次要讀取的數據中從當前頁內偏移地址開始的數據,之后還包括:根據讀取到的數據更新當前計數; 所述V70具體包括:判斷當前計數是否等于預設值,是則讀取到全部的本次要讀取的數據,否則沒有讀取到全部的本次要讀取的數據。
29.根據權利要求28所述的方法,其特征在于,所述初始化當前計數具體包括:初始化當前計數為本次要讀取的數據的長度; 所述根據讀取到的數據更新當前計數具體包括:更新當前計數為其當前值減去讀取到的數據的長度; 所述判斷當前計數是否等于預設值具體包括:判斷當前計數是否等于O。
30.根據權利要求28所述的方法,其特征在于,所述初始化當前計數具體包括:初始化當前計數為O ; 所述根據讀取到的數據更新當前計數具體包括:更新當前計數為其當前值加上讀取到的數據的長度; 所述判斷當前計數是否等于預設值具體包括:判斷當前計數是否等于本次要讀取的數據的長度。
31.根據權利要求25所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括:遍歷所述物理頁面的索引區(qū),當查找到連續(xù)的不少于預設個數的值為預設值的字節(jié)數據時,確定這些字節(jié)數據之前的索引日志為所述物理頁面的索引區(qū)中的最后一條索引日志。
32.根據權利要求25所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括: al:定位所述物理頁面的索引區(qū)中有效存儲空間的首字節(jié)和末字節(jié),將所述首字節(jié)作為當前起始字節(jié)、所述末字節(jié)作為當前結尾字節(jié),執(zhí)行a2 ; a2:定位所述當前起始字節(jié)到所述當前結尾字節(jié)的中間字節(jié),作為當前中間字節(jié),執(zhí)行a3 ; a3:從當前中間字節(jié)之后的一個字節(jié)開始,向后讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則將當前中間字節(jié)作為當前起始字節(jié),返回a2,否則執(zhí)行a4 ; a4:從當前中間字節(jié)開始,`向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則將當前中間字節(jié)作為當前結尾字節(jié),返回a2。
33.根據權利要求25所述的方法,其特征在于,所述查找所述物理頁面的索引區(qū)中的最后一條索引日志具體包括: bl:定位所述物理頁面的索引區(qū)中有效存儲空間的末字節(jié),將所述末字節(jié)作為當前字節(jié),執(zhí)行b2 ; b2:從當前字節(jié)開始,向前讀取長度等于一條索引日志的長度的數據,判斷讀取到的數據是否為一條索引日志,是則讀取到的數據為所述物理頁面的索引區(qū)中的最后一條索引日志,否則執(zhí)行b3 ; b3:將讀取到的數據之前的一個字節(jié)作為當前字節(jié),返回b2。
34.根據權利要求33所述的方法,其特征在于,所述判斷讀取到的數據是否為一條索引日志具體包括:判斷讀取到的數據的每個字節(jié)是否均為預設值,是則判定讀取到的數據不是一條索引日志,否則判定讀取到的數據是一條索引日志。
35.根據權利要求25所述的方法,其特征在于,所述根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度判斷當前索引日志是否涉及當前頁內偏移地址,具體包括:根據當前索引日志中的寫入數據的頁內偏移地址和寫入數據的長度計算得到當前索引日志涉及的頁內偏移地址范圍,判斷當前頁內偏移地址是否在計算得到的頁內偏移地址范圍內,是則當前索引日志涉及當前頁內偏移地址,否則當前索引日志不涉及當前頁內偏移地址。
【文檔編號】G06F12/02GK103729303SQ201410024168
【公開日】2014年4月16日 申請日期:2014年1月20日 優(yōu)先權日:2014年1月20日
【發(fā)明者】陸舟, 于華章 申請人:飛天誠信科技股份有限公司