一種基于nand flash的高可靠線性文件系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種基于nand?flash的高可靠線性文件系統(tǒng),nand?flash包括sdram存儲器,nvram非易失存儲器和nand?flash存儲陣列;該文件系統(tǒng)包括硬件抽象層和軟件層,所述硬件抽象層用于實現(xiàn)對硬件IO的訪問,所述軟件層通過訪問硬件抽象層的接口實現(xiàn)對文件的操作,所述軟件層包括分區(qū)表初始化模塊、文件管理模塊和文件存取模塊。本發(fā)明實現(xiàn)了對基于nand?flash的設(shè)備的文件管理,具有可移植性高、效率高、以文件方式實現(xiàn)數(shù)據(jù)存取、自動循環(huán)記錄、斷電保護文件等特點。
【專利說明】—種基于nand flash的高可靠線性文件系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機存儲領(lǐng)域,尤其涉及一種基于nand flash的高可靠線性文件系 統(tǒng)。
【背景技術(shù)】
[0002]nand flash是一種大容量的存儲芯片,其特點是容量密度大,制造成本低,訪問 速度快,通常作為U盤、固態(tài)盤、存儲卡等設(shè)備上的存儲芯片,但其也存在一些不足:它屬于 地址、數(shù)據(jù)共用類型訪問方式,訪問相對麻煩,它由于本身出廠是就存在壞塊,需要“跳過” 壞塊進行訪問,需要專門的管理方法進行塊的管理。目前對數(shù)據(jù)的管理主要分以下兩種方 式:
[0003](I)無文件系統(tǒng)方式訪問,使用者需調(diào)用函數(shù)對存儲單元進行直接操作,實現(xiàn)難度 低,但使用難度高;
[0004](2)文件系統(tǒng)方式訪問,使用者以文件的方式對存儲系統(tǒng)進行訪問,實現(xiàn)難度高, 但使用難度低。
[0005]文件系統(tǒng)的優(yōu)點在于不需要使用者關(guān)注數(shù)據(jù)的存放位置,文件系統(tǒng)來管理數(shù)據(jù), 屏蔽了物理介質(zhì)的不同。由于文件系統(tǒng)對使用者實現(xiàn)數(shù)據(jù)管理的透明,完全接管數(shù)據(jù)的存 儲,一旦文件系統(tǒng)崩潰會導(dǎo)致數(shù)據(jù)丟失,所以對文件系統(tǒng)的可靠性要求較高,能經(jīng)受長時間 的考驗。
[0006]本發(fā)明涉及一種基于nand flash的高可靠線性文件系統(tǒng)的軟件。用于由nand flash組成的存儲陣列中實現(xiàn)以文件的方式進行訪問管理。本文件系統(tǒng)與windows上使用 的文件系統(tǒng)不同,windows等操作系統(tǒng)上使用的文件系統(tǒng)屬于“基于頁表結(jié)構(gòu)”形式,而本 文件系統(tǒng)屬于線性文件系統(tǒng)。所謂“線性文件系統(tǒng)”是指數(shù)據(jù)記錄在順序的地址單元中,而 常見的文件系統(tǒng)都是“基于頁表結(jié)構(gòu)”形式,即數(shù)據(jù)記錄在不連續(xù)的地址單元中,各地址單 元通過一個鏈表相連接。線性文件系統(tǒng)的特點是管理簡單,記錄效率高,而常見頁表形式的 文件系統(tǒng)管理頁表較復(fù)雜,無掉電保護特性,效率稍低。本發(fā)明非常適合于需要一種高可靠 性、高效率、方便使用的記錄設(shè)備的環(huán)境下。
【發(fā)明內(nèi)容】
[0007]本發(fā)明要解決的技術(shù)問題在于針對上述現(xiàn)有技術(shù)中的缺陷,提供一種基于nand flash的高可靠線性文件系統(tǒng)及線性文件存取方法。
[0008]本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
[0009]本發(fā)明提供了一種基于nand flash的高可靠線性文件系統(tǒng),所述文件系統(tǒng)包括硬 件抽象層和軟件層,所述硬件抽象層用于實現(xiàn)對硬件IO的訪問,所述軟件層通過訪問硬件 抽象層的接口實現(xiàn)對文件的操作,所述軟件層包括:
[0010]分區(qū)表初始化模塊,用于對分區(qū)表進行初始化;
[0011]文件信息初始化模塊,用于初始化文件的始末地址、打開方式、文件名和文件大小信息;
[0012]文件管理模塊,用于對文件進行管理;
[0013]所述文件管理模塊包括:
[0014]文件創(chuàng)建子模塊,用于完成創(chuàng)建新文件;
[0015]文件存取模塊,用于控制文件的讀取與寫入操作;
[0016]所述文件存取模塊包括:
[0017]文件寫入子模塊,用于按采用順序地址方式將數(shù)據(jù)從sdram存儲器中的緩沖區(qū)搬 移至分區(qū)中文件指針指向的存儲區(qū)域;
[0018]文件循環(huán)寫入子模塊,用于分區(qū)空間滿時,自動刪除最舊文件并寫入新文件;
[0019]文件實時寫入子模塊,用于將數(shù)據(jù)寫入分區(qū)前先緩沖至nvram非易失存儲器中;
[0020]文件讀取子模塊,用于將數(shù)據(jù)從分區(qū)讀取到sdram存儲器中,然后從sdram存儲器 中取走。
[0021]按上述方案,所述文件創(chuàng)建子模塊包括:
[0022]文件名非法糾正模塊,用于進行文件名非法自處糾正;
[0023]同名文件判斷模塊,用于判斷是否存在同名文件;
[0024]“自動追加”模式判斷模塊,用于判斷是否“自動追加”模式,如果是則對文件名自 動追加后綴序號;
[0025]文件個數(shù)判斷模塊,用于判斷是否文件個數(shù)已滿;
[0026]循環(huán)模式判斷模塊,用于需要判斷是否是循環(huán)模式,如果是循環(huán)模式,則刪除最老 的文件;
[0027]文件信息創(chuàng)建模塊,用于在分區(qū)表中找到一個位置,創(chuàng)建文件信息,并返回指向該 位置的文件指針,并根據(jù)文件的大小更新分區(qū)表。
[0028]按上述方案,所述分區(qū)表初始化模塊包括:
[0029]芯片硬件初始化子模塊,用于通過初始化獲得芯片的屬性信息,并防止對芯片進 行異常訪問;
[0030]壞塊信息掃描子模塊,用于識別nand芯片的所有壞塊;
[0031]好塊/壞塊替換表,用于建立壞塊到好塊的物理位置的映射關(guān)系;
[0032]文件分區(qū)劃分子模塊,用于按照分區(qū)時的參數(shù)進行分區(qū)大小劃分。
[0033]按上述方案,所述文件管理模塊還包括:
[0034]掉電文件處理子模塊,用于恢復(fù)由于異常掉電丟失的文件:在寫入文件時,同時將 文件的日志記錄到nand flash的一片nvram存儲器中在寫入文件時若掉電,當重新上電 時,讀取nvram存儲器中的日志數(shù)據(jù),通過讀取該部分數(shù)據(jù)追朔至掉電前數(shù)據(jù)記錄物理地 址,查詢到最后寫入的數(shù)據(jù)的內(nèi)容,將未寫入至nand存儲器的數(shù)據(jù)從nvram非易失存儲器 中重新寫入到nand的某分區(qū)中。
[0035]按上述方案,所述文件管理模塊還包括:
[0036]文件刪除子模塊,用于將文件從分區(qū)表中刪除,釋放存儲空間;
[0037]壞塊替換子模塊,用于在文件寫入時根據(jù)好塊/壞塊替換表替換無效數(shù)據(jù)塊。
[0038]按上述方案,所述文件系統(tǒng)還包括文件遠程操控模塊和人機界面;所述文件遠程 操控模塊用于與遠程PC機進行通訊,實現(xiàn)遠程PC機對文件系統(tǒng)的控制。[0039]按上述方案,所述分區(qū)表初始化模塊還包括分區(qū)備份子模塊,用于文件系統(tǒng)分區(qū) 表同時存儲在從nand flash存儲陣列開始的128block中查找的3個好塊中作為3個備份。
[0040]本發(fā)明產(chǎn)生的有益效果是:
[0041]1、傳統(tǒng)文件系統(tǒng)基本都是運行在操作系統(tǒng)上調(diào)用相應(yīng)的驅(qū)動實現(xiàn),而在某些嵌入 式應(yīng)用領(lǐng)域,沒有操作系統(tǒng)的支持,對大容量nand flash陣列的數(shù)據(jù)訪問還停留在對底層 芯片IO方式;本發(fā)明對大容量nand flash陣列提供一種無需操作系統(tǒng)的文件形式訪問,適 用于需要一種高可靠性、高效率、方便使用的嵌入式系統(tǒng)中;
[0042]2、文件在nand flash中的記錄采用順序地址方式記錄,以并行流水方式操作,提 升數(shù)據(jù)訪問速度;
[0043]3、文件分區(qū)表記錄在nand flash中,并且分區(qū)表多備份,防止文件分區(qū)表損壞時 無法修復(fù);
[0044]4、對重名文件有自動添加后綴功能、可連續(xù)讀取自動添加后綴的文件;
[0045]5、分區(qū)數(shù)據(jù)滿后,實現(xiàn)循環(huán)記錄功能;
[0046]6、實現(xiàn)實時記錄功能;
[0047]7、具有斷電保護功能,任意時刻掉電保證文件不丟失,文件系統(tǒng)不崩潰。
【專利附圖】
【附圖說明】
[0048]下面將結(jié)合附圖及實施例對本發(fā)明作進一步說明,附圖中:
[0049]圖1是本發(fā)明實施例的文件系統(tǒng)工作的原理框圖;
[0050]圖2是本發(fā)明實施例的文件系統(tǒng)的功能模塊圖;
[0051]圖3是本發(fā)明實施例的文件循環(huán)寫入子模塊的工作流程圖;
[0052]圖4是本發(fā)明實施例的文件系統(tǒng)的分層結(jié)構(gòu)圖;
[0053]圖5是本發(fā)明實施例的典型多片并行的硬件設(shè)計結(jié)構(gòu)圖;
[0054]圖6是本發(fā)明實施例的軟件層結(jié)構(gòu)組成圖;
[0055]圖7是本發(fā)明實施例的文件創(chuàng)建子模塊的工作流程圖;
[0056]圖8是本發(fā)明實施例的異常掉電文件處理子模塊的工作流程圖;
[0057]圖9是本發(fā)明實施例的分區(qū)表與文件關(guān)系圖;
[0058]圖10是本發(fā)明實施例的分區(qū)表框圖;
[0059]圖11是本發(fā)明實施例的某分區(qū)的詳細描述;
[0060]圖12是本發(fā)明實施例的壞塊記錄表;
[0061]圖13是本發(fā)明實施例的文件系統(tǒng)整體描述信息表;
[0062]圖14是本發(fā)明實施例的文件分區(qū)表多備份方法;
[0063]圖15是本發(fā)明實施例的分區(qū)表更新方法。
【具體實施方式】
[0064]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對 本發(fā)明進行進一步詳細說明。應(yīng)當理解,此處所描述的具體實施例僅用以解釋本發(fā)明,并不 用于限定本發(fā)明。
[0065]圖1為本發(fā)明的nand flash文件系統(tǒng)工作的原理框圖。圖1中,CPU處理器I連接數(shù)據(jù)總線6與數(shù)據(jù)接口 7,CPU處理器I在FS (file-system)文件系統(tǒng)2的調(diào)度下,負 責(zé)將數(shù)據(jù)從數(shù)據(jù)接口 7搬移至nand flash存儲陣列5或?qū)?shù)據(jù)從nand flash存儲陣列5 搬移至數(shù)據(jù)接口 7。SDRAM存儲器3用于CPU處理器I的數(shù)據(jù)緩沖,NVRAM非易失存儲器4 用于記錄CPU處理器I搬移數(shù)據(jù)至nand flash存儲陣列5過程中的“步驟記錄”,“步驟記 錄”是指數(shù)據(jù)被搬移至哪里、是否記錄完成、以及部分緩沖數(shù)據(jù)等信息,以便保證數(shù)據(jù)記錄 的“線索”不丟失。系統(tǒng)掉電重新上電后,CPU處理器I根據(jù)NVRAM非易失存儲器4中記錄 的“線索”獲取掉電之前的記錄狀態(tài),根據(jù)“線索”將緩沖數(shù)據(jù)寫入文件、關(guān)閉未正常關(guān)閉的 文件等操作。
[0066]如圖4所示:本文件系統(tǒng)分為硬件抽象層和軟件層兩層。硬件抽象層主要實現(xiàn)對 硬件IO的訪問,包括基本的寫保護、復(fù)位、單元讀寫、頁讀寫、塊擦除等基本函數(shù)。軟件層訪 問硬件抽象層的接口,實現(xiàn)對文件系統(tǒng)的創(chuàng)建、文件的管理、文件的存取、自動循環(huán)記錄、斷 電保護文件、分區(qū)信息多備份、自動壞塊替換等功能。
[0067]具體如下:
[0068]—種基于nand flash的高可靠線性文件系統(tǒng),本實施例采用的nand flash包括 sdram存儲器,nvram非易失存儲器和nand flash存儲陣列;該文件系統(tǒng)包括硬件抽象層和 軟件層,所述硬件抽象層用于實現(xiàn)對硬件IO的訪問,所述軟件層通過訪問硬件抽象層的接 口實現(xiàn)對文件的操作;軟件層結(jié)構(gòu)組成如圖6所示,所述軟件層包括分區(qū)表初始化模塊、文 件管理模塊和文件存取模塊;
[0069]分區(qū)表初始化模塊,用于對分區(qū)表進行初始化;所述分區(qū)表初始化模塊包括:芯 片硬件初始化子模塊,用于通過初始化獲得芯片的屬性信息,并防止對芯片進行異常訪 問;
[0070]芯片硬件初始化子模塊的工作步驟為:向nand flash發(fā)出讀ID的命令,將讀取到 的nand flashID信息與已支持的芯片類型ID進行比對,如果符合則通過初始化得到芯片 的特性信息:包括有多少個block,每block的page數(shù)等,否則停止后續(xù)操作,防止對芯片 進行異常訪問。
[0071]壞塊信息掃描子模塊,用于識別nand芯片的所有壞塊;
[0072]壞塊信息掃描子模塊的工作步驟為:讀取nand芯片的每個block的前2個page 的spare區(qū),若該spare區(qū)的信息不為Oxff,則該block為壞塊;掃描nand芯片的每一個 block,直至識別出所有的壞塊,即完成壞塊信息的掃描。
[0073]好塊/壞塊替換表,用于建立壞塊到好塊的物理位置的映射關(guān)系;具體如下:建立 一張壞塊,即無效塊到保留區(qū)的映射表,當訪問到無效塊時,通過查表訪問被映射的好塊的 物理位置。保留區(qū)設(shè)置在nand芯片的末尾3%的區(qū)域,因為nand芯片的壞塊率基本在1% 以下,保留3%的區(qū)域可保證所有的壞塊均可被替換,還有一定的余量供后續(xù)使用中發(fā)現(xiàn)的 壞塊進行替換。在運行中發(fā)現(xiàn)新的壞塊時,標記壞塊,并從保留區(qū)找到一個好塊,將數(shù)據(jù)拷 貝至該好塊中,壞塊計數(shù)器加I。
[0074]文件分區(qū)劃分子模塊,用于按照分區(qū)時的參數(shù)進行分區(qū)劃分;
[0075]分區(qū)大小是分區(qū)時的參數(shù)指定的,與硬盤重分區(qū)時對硬盤的劃分方法一致:找到 一段連續(xù)的空間,標記其起始地址、大小等信息。每個分區(qū)的數(shù)據(jù)都只能在該分區(qū)中存在, 不能進入其他分區(qū)。[0076]文件信息初始化模塊,用于初始化文件的始末地址、打開方式、文件名和文件大小
信息;
[0077]初始化每個文件的始末地址、打開方式、文件名、文件大小等信息為默認值。本文
件系統(tǒng)的文件個數(shù)是有限的,每分區(qū)為100個文件,都存于分區(qū)表中。文件信息包括始末地
址、打開方式、文件名、文件大小等信息。文件信息的結(jié)構(gòu)如下所示。
[0078]
typcdc I'struct
{
bool FilcNotEmplyFlag; //文件是否為空,為空則后續(xù)信息無效 int FiIcFinishcd;//文件是正常關(guān)閉,用于判斷異常斷電
int bclongto;//文件屬于哪個分區(qū)
int OpcnModc;//文件打開模式:寫入、實時、讀出、循環(huán)模式等
charFilcNamc[FILENAME_LEN]; //文件名
int FiIeI ndcx;//文件序列號
int SameFileCnt; //同名文件個數(shù)
unsigned SiarlRaidPagc; /7起:始 page IikJl1:
unsigned EndRaidPagc; HM) d page J也J ll:
long long FiIcSizc;節(jié) lT1-^V.unsigned EndOffsclInRaidPagc; //Ud page 內(nèi) fei移地Jll:
unsigned CurrcniRaidPagc; //當前page地址
unsigned CurrcntOflsctInRaidPage; //'1I fjlj page 內(nèi) 1?移地址
unsigned CycMaxRegion;,V當前最大可寫的page地址,用于循環(huán)記錄
unsigned ClycleWrtFlag;//是否循環(huán)成功標志
unsigned EccFlag; //本文件是否出現(xiàn)了壞塊標志
IFRFILE;
[0079]緩沖初始化:初始化文件的讀寫所用到的sdram指針,每個分區(qū)都有一段sdram作
為該分區(qū)的數(shù)據(jù)緩沖。當寫入數(shù)據(jù)時,首先將數(shù)據(jù)寫入至sdram中,當數(shù)據(jù)達到一個page
時,將數(shù)據(jù)寫入nand中,效率達到最高。當讀取數(shù)據(jù)時,首先將數(shù)據(jù)讀取到sdram中,然后
從sdram中取走,當數(shù)據(jù)不在當前緩沖中時,貝U重新從分區(qū)中讀取數(shù)據(jù)至sdram中。
[0080]文件管理模塊,用于對文件進行管理;所述文件管理模塊包括
[0081]文件創(chuàng)建子模塊,用于創(chuàng)建新文件;本發(fā)明實現(xiàn)的文件的創(chuàng)建指以fopen函數(shù)為
接口的函數(shù)調(diào)用,實現(xiàn)在分區(qū)表中找到一個位置,創(chuàng)建文件信息,并返回指向該位置的文件指針。[0082]文件創(chuàng)建子模塊包括:
[0083]文件名非法糾正模塊,用于進行文件名非法自處糾正;
[0084]同名文件判斷模塊,用于判斷是否存在同名文件;
[0085]“自動追加”模式判斷模塊,用于判斷是否“自動追加”模式,如果是則對文件名自 動追加后綴序號;
[0086]文件個數(shù)判斷模塊,用于判斷是否文件個數(shù)已滿;
[0087]循環(huán)模式判斷模塊,用于需要判斷是否是循環(huán)模式,如果是循環(huán)模式,則刪除最老 的文件;
[0088]文件信息創(chuàng)建模塊,用于在分區(qū)表中找到一個位置,創(chuàng)建文件信息,并返回指向該 位置的文件指針,并根據(jù)文件的大小更新分區(qū)表。
[0089]文件創(chuàng)建流程圖如圖7所示。文件創(chuàng)建子模塊的工作步驟是:
[0090]1.進行文件名非法自處糾正;
[0091]因為本系統(tǒng)中文件名只能是字符或數(shù)字,不允許超過20字符,故需要對文件名進 行合法性檢測,去除非法字符;
[0092]2.判斷是否存在同名文件,如果不存在同名文件,轉(zhuǎn)入步驟6,否則轉(zhuǎn)入步驟3;
[0093]3.判斷是否“自動追加”模式,如果是轉(zhuǎn)入步驟4,否則創(chuàng)建失?。?br>
[0094]4.判斷是否文件個數(shù)已滿,如果已滿,則轉(zhuǎn)入步驟6,否則轉(zhuǎn)入步驟5 ;
[0095]5.創(chuàng)建添加“后綴序號”的文件;
[0096]6.需要判斷是否是循環(huán)模式(可刪除文件),如果是循環(huán)模式,則刪除最老的文件;
[0097]7.在分區(qū)表中找到一個位置,創(chuàng)建文件信息,并返回指向該位置的文件指針,并根 據(jù)文件的大小更新分區(qū)表;
[0098]8.創(chuàng)建完成。
[0099]文件刪除子模塊,用于將文件從分區(qū)表中刪除,釋放存儲空間;
[0100]文件的刪除實際上只是將文件從分區(qū)表中刪除,釋放出所占用的空間,而不對用 過的空間進行擦出。由于nand芯片的特性是在編程前需要對存儲單元進行擦除,使所有的 存儲單元都變?yōu)镮,存儲過程只能把I變成0,無法把0編程I。在嵌入式系統(tǒng)中,對系統(tǒng)的 實時性要求較高,需要隨時相應(yīng)讀寫指令。而擦除I個block動作需要若干毫秒,擦除某個 文件所占用的區(qū)域需要更多的時間,這在實時系統(tǒng)中是不允許的。本發(fā)明針對這種狀況采 取的方法分兩種,第一種是在寫入數(shù)據(jù)前,需要對nand芯片組成的陣列進行格式化(擦除) 操作;第二種是在循環(huán)寫入方式下,即需要刪除并覆蓋以前的文件,采取的測量是“擦一塊、 寫一塊”的方法,破整為零,以提供系統(tǒng)的實時性。
[0101]掉電文件處理子模塊,用于恢復(fù)由于異常掉電丟失的文件;
[0102]本文件系統(tǒng)的高可靠性主要表現(xiàn)在系統(tǒng)的防掉電設(shè)計,即任意時刻掉電保證文件 不丟失,數(shù)據(jù)損失最少,文件系統(tǒng)不崩潰。完成異常掉電文件的處理需要在寫入文件時,同 時記錄文件的日志到一片nvram存儲器中。nvram存儲器掉電后數(shù)據(jù)能保存,下次再上電后 仍可讀取日志數(shù)據(jù),通過讀取該部分數(shù)據(jù)即可追朔至掉電前數(shù)據(jù)記錄至何處,從而保證數(shù) 據(jù)丟失最少(保證只要數(shù)據(jù)被記錄到物理存儲器中即可被找到)。在本發(fā)明的實時記錄模式 下,數(shù)據(jù)緩沖為非易失的nvram存儲器,掉電后該部分緩沖的數(shù)據(jù)也不會丟失,重新上電后 該部分數(shù)據(jù)可以被識別,并記錄到nand陣列的文件中,可以保證數(shù)據(jù)不會發(fā)生任何字節(jié)丟失。
[0103]如圖8所示,若寫入文件時掉電,重新上電后,本文件系統(tǒng)進入以下處理流程:
[0104]從nvram存儲器讀取日志數(shù)據(jù),判斷日志是否正常(校驗碼是否正確),若正常則 進入步驟2,否則進入災(zāi)難恢復(fù)流程(通過掃描文件系統(tǒng)的特殊區(qū)域?qū)崿F(xiàn)恢復(fù)),如果恢復(fù)成 功,則進入步驟2,否則重新生成一個日志記錄(可能造成部分數(shù)據(jù)丟失);
[0105]刪除被標記需要刪除的文件,刪除完成進入步驟3。為了保證文件訪問的實時性, 文件的刪除工作在文件記錄階段是不運行的,否則會造成一定時間(2ms)內(nèi)文件系統(tǒng)不響 應(yīng)命令,影響系統(tǒng)的實時性。在循環(huán)寫入模式下,需要自動刪除“最舊”的文件,但刪除動作 只是在nvram日志中做標記,等下次上電初始化時再刪除;
[0106]找到斷電未關(guān)閉的文件,并找到文件斷電時的“斷點”,進入步驟4;
[0107]判斷是否實時寫入,如果是則進入步驟5,否則進入步驟6 ;
[0108]讀取在nvram中緩沖的數(shù)據(jù),寫入到nand陣列中。因為實時模式下,nvram是作 為緩存的,掉電后緩存的數(shù)據(jù)仍然可用,需要將數(shù)據(jù)寫入到nand陣列中,為了盡量不丟失 數(shù)據(jù);
[0109]處理文件末尾字段,記錄文件末尾的地址,寫入文件系統(tǒng)分區(qū)表中;
[0110]計算文件大小、總使用大小、下個可用空間等信息;
[0111]更新分區(qū)表,即保存分區(qū)表到nand陣列中,計算校驗碼,并保存分區(qū)表的三個備 份;
[0112]更新nvram中的日志信息。
[0113]在本文件系統(tǒng)所使用的nvram存儲器中保存著當前正在操作的文件的狀態(tài)信息,
數(shù)據(jù)結(jié)構(gòu)如下:
[0114]
typcdci'struct
{
int cur raidpage; //前訪問的單元(raidpage ) int cur_pos—in—raidpage; //單元內(nèi)的偏移位置 int cur—file—index;//當前訪問的文件序號 int clycle_wrt_flag; //文件調(diào)頭標志,在循環(huán)寫入中用到 FR—DATA—TYPE ecc—value; //ccc 校驗ff[ unsigned CycMaxRegion;// 最大可寫的邊界 int undelete—index; //未刪除的文件起始 index int undelete—cnt; //未刪除的文件個數(shù) int avail—flag; //分區(qū)的日志數(shù)據(jù)有效標志 I ParlitionlnNvSlrucl;
[0115]其中FR—DATA—TYPE是并行訪問nand flash的位寬,在實際系統(tǒng)中,位寬可為uchar8, uintl6, ulong32 或 ulonglong64。
[0116]當寫入文件時,nvram會記錄當前訪問的位置信息,即斷點信息,當系統(tǒng)掉電后, 通過讀取該斷點信息,可知道最近一次訪問的位置,繼而對斷電的文件繼續(xù)進行操作。 PartitionInNvStruct是nvram中記錄的某一個分區(qū)正在使用的情況,包括:當前訪問的單 元(raidpage)、單元內(nèi)的偏移位置、當前訪問的文件序號、是否進入循環(huán)的標志等信息。
[0117]由于nvram記錄的數(shù)據(jù)是非常重要的數(shù)據(jù),它的正確性要求非常高。本文件系統(tǒng) 為nvram設(shè)計了 ecc校驗機制與多備份機制。Ecc校驗可糾Ibit錯;多備份可彌補ecc無 法糾正的情況,從設(shè)計角度可將nvram出現(xiàn)錯誤的概率降至最低。
[0118]壞塊替換子模塊,用于根據(jù)好塊/壞塊替換表替換無效數(shù)據(jù)塊;
[0119]壞塊記錄表的結(jié)構(gòu)如圖12所示,壞塊記錄表BadTable記錄了壞塊的位置,壞塊替 換表SubstiTable記錄了被映射到壞塊位置的好塊的位置。壞塊替換表SubstiTable是文 件系統(tǒng)保留的處于nand flash末尾的一些好塊,被用于替換出廠壞塊以及后續(xù)運行時產(chǎn)生 的壞塊。替換表SubstiTable保留了總有效塊的3%的區(qū)域作為替換塊。當寫入過程中出 現(xiàn)記錄錯誤、擦除、讀出校驗等錯誤,需要進行塊替換時,操作步驟如下:
[0120]首先將數(shù)據(jù)從壞塊拷貝出,并進行校驗修正,存入sdram存儲器;
[0121]從替換表SubstiTable中取出的第一個塊a,將數(shù)據(jù)拷入其中;
[0122]標記新產(chǎn)生的壞塊b,并放入BadTable表中;
[0123]建立塊a與塊b的映射關(guān)系,當訪問地址處于塊a時,會通過查找表,發(fā)現(xiàn)塊a是 壞塊,需要通過訪問塊b獲取正確的數(shù)據(jù);
[0124]保存新的分區(qū)表。
[0125]文件存取模塊,用于控制文件的讀取與寫入操作;
[0126]文件寫入子模塊,用于將數(shù)據(jù)從sdram存儲器中的緩沖區(qū)搬移至分區(qū)中文件指針 指向的存儲區(qū)域;寫入的文件在分區(qū)中順序存放;每個分區(qū)同一時間只有一個文件在進行 寫操作;
[0127]文件寫入的編址方式設(shè)計:
[0128]nand flash的編址采用塊(block)、頁(page)、單元(col)三種組合的編址方式;
[0129]由于page編程速度最快,本文件系統(tǒng)采用以page為基本單元進行訪問。假設(shè)每 個block有M個page組成,以下是對nand flash中的某個單元進行讀、寫、擦除操作的步驟。
[0130]當需要讀取第i個block的第j個page的第k個col單元內(nèi)的數(shù)據(jù),其訪問地址 為第(i*M+j)個page,并將該page讀取到緩沖區(qū)中,然后從緩沖區(qū)中讀取第k個數(shù)據(jù)。
[0131]當需要將數(shù)據(jù)寫入第i個block的第j個page的第k個col單元內(nèi)時,如果是調(diào) 用單col寫入函數(shù),即只寫I個數(shù)據(jù),則數(shù)據(jù)會直接寫入;如果希望寫入一批數(shù)據(jù),則會首先 將數(shù)據(jù)寫入緩沖區(qū),當緩沖區(qū)達到I個page的長度后,調(diào)用page寫入函數(shù),將數(shù)據(jù)寫入第 (i*M+j)個 page。
[0132]數(shù)據(jù)的存儲采用連續(xù)存儲方式,即以頁(page)為基本訪問單元,在一個分區(qū)內(nèi)部, 按照頁的地址順序進行訪問。
[0133]文件循環(huán)寫入子模塊,用于分區(qū)空間滿時,自動刪除最舊文件并寫入新文件;
[0134]本文件系統(tǒng)設(shè)計了循環(huán)寫入功能,文件循環(huán)寫入子模塊在分區(qū)空間滿時,會自動刪除掉最舊的文件。但在要求實時性非常高的應(yīng)用中,刪除文件時如果擦除文件所占的空 間會造成較長時間無法記錄數(shù)據(jù)。解決該問題的方法是刪除文件時,只是將它從分區(qū)表中 刪除,在數(shù)據(jù)記錄到刪除的文件所占的空間時再進行擦除,即“邊寫邊擦”。循環(huán)寫入從原理 上看很簡單,但由于nand存儲器的特性,擦除是非常耗費時間的,即使是刪除文件這種簡 單操作,也需要花費若干毫秒(ms)的時間,這對實時系統(tǒng)是不能允許的。本文件系統(tǒng)使用 了一種方法,在非易失存儲器(nvram)中記錄著需要更新的分區(qū)表的簡要信息(類似索引信 息)以及需要被刪除的文件索引號,當系統(tǒng)不繁忙時或重新初始化時,根據(jù)nvram中記錄的 簡要信息,完成分區(qū)表的更新、文件的刪除,從而不影響系統(tǒng)的實時性,保持數(shù)據(jù)吞吐的穩(wěn) 定性。
[0135]文件循環(huán)寫入子模塊的工作流程圖如圖3,工作步驟為:
[0136]創(chuàng)建文件,步驟流程為“文件創(chuàng)建子模塊”工作流程;
[0137]判斷寫入模式(文件創(chuàng)建時由輸入?yún)?shù)確定寫入模式),如果是實時寫入模式,則 修改緩沖區(qū)指針,指向nvram區(qū),寫入的數(shù)據(jù)可保證不丟失;如果是普通模式,則將緩沖區(qū) 指針指向sdram。由于sdram訪問速度快,容量大,適合批量數(shù)據(jù)的存儲,nvram容量小,速 度稍慢,可保證數(shù)據(jù)不丟失;
[0138]判斷nand陣列中是否有空間可寫入。如果沒有空間可寫入,在進入步驟4 ;
[0139]判斷是否是循環(huán)寫入模式,如果不是循環(huán)寫入模式,則直接返回,丟棄數(shù)據(jù);如果 是循環(huán)模式,則對最舊的文件進行刪除,騰出空間,繼續(xù)寫入,進入步驟5 ;
[0140]判斷緩沖區(qū)是否已滿,如果已滿則將緩沖區(qū)數(shù)據(jù)寫入nand陣列,并釋放緩沖區(qū); 如果未滿直接將數(shù)據(jù)寫入緩沖區(qū);
[0141]更新文件指針、更新將斷點日志記錄,存入nvram存儲器。
[0142]文件實時寫入子模塊,用于將數(shù)據(jù)寫入分區(qū)前先緩沖至nvram非易失存儲器中, 實時將數(shù)據(jù)寫入分區(qū)中;
[0143]文件的實時寫入子模塊與普通緩沖式寫入的區(qū)別在于記錄數(shù)據(jù)的緩沖不同,并且 掉電后的處理方法不同。由于nand flash不同于普通的隨機存儲器(SRAM),對nand flash 的基本存儲單元page的訪問是有次數(shù)限制的,一般廠家規(guī)定擦除page后,對page內(nèi)最多 進行4次寫入操作。對于比較重要的數(shù)據(jù),一般不希望數(shù)據(jù)有任何的丟失發(fā)生,希望數(shù)據(jù)隨 時被記錄到存儲器中,然而又有“對page內(nèi)最多進行4次寫入操作”的限制,不可能隨時寫 入,這兩者就存在了矛盾。解決矛盾的方法就是采用緩存,而普通的隨機存儲器SRAM做緩 存掉電后數(shù)據(jù)就會丟失,本文件系統(tǒng)采用了 nvram緩存數(shù)據(jù)的方式,并隨時做好斷點保護, 以便斷電后能將數(shù)據(jù)的損失降至最低。文件的緩沖存于非易失的nvram存儲器中,當?shù)綦?重新上電時,初始化函數(shù)根據(jù)未關(guān)閉的文件“日志”記錄,可以查詢到最后寫入的數(shù)據(jù)的內(nèi) 容,將未寫入至nand存儲器的數(shù)據(jù)重新寫入到nand的某分區(qū)中。
[0144]文件實時寫入子模塊的工作步驟為:
[0145]1、將數(shù)據(jù)寫入分區(qū)前先緩沖至nvram非易失存儲器中,并隨時做好斷點保護;
[0146]2、將數(shù)據(jù)寫入分區(qū)中;
[0147]3、若掉電,當重新上電時,根據(jù)未關(guān)閉的文件“日志”記錄,可以查詢到最后寫入的 數(shù)據(jù)的內(nèi)容,將未寫入至nand存儲器的數(shù)據(jù)從nvram非易失存儲器中重新寫入到nand的 某分區(qū)中。[0148]文件讀取子模塊,用于將數(shù)據(jù)從分區(qū)讀取到sdram存儲器中,然后從sdram存儲器 中取走。
[0149]進一步的,文件管理模塊還可以加入重名文件處理子模塊,用于在同一分區(qū)中創(chuàng) 建同名文件的處理。
[0150]本文件系統(tǒng)還設(shè)計了文件名自動追加功能。在常見的文件系統(tǒng)中,在一個目錄下 創(chuàng)建同名的文件是不被允許的,而本系統(tǒng)中可以允許創(chuàng)建同名文件,其處理方法是在文件 名后自動加上如“_1”、“_2”、“_3”等后綴。在嵌入式系統(tǒng)中,通常程序軟件是固化在FLASH 中,程序軟件一般不會經(jīng)常改動,而在嵌入式系統(tǒng)中能使用的資源十分有限,無法獲得動態(tài) 變化的文件名。針對嵌入式系統(tǒng)的特點,本文件系統(tǒng)設(shè)計了文件名自動追加功能。
[0151]當需要在一個分區(qū)內(nèi)創(chuàng)建已經(jīng)存在的文件時,首先掃描分區(qū)表中該分區(qū)的所有文 件,找到該已經(jīng)存在的文件,在該文件的FR_FILE結(jié)構(gòu)的SameFileCnt字段加1,并用該序 號為新創(chuàng)建的文件名改名,加上的后綴,即可自動避免出現(xiàn)重名文件。同理,在 讀取文件時,如果希望讀取加后綴的同名文件序列,則只需要以連續(xù)讀取模式打開文件,即 可讀取后續(xù)的同名文件。假設(shè)在本文件系統(tǒng)中存在abc.dat、abc.dat_l、abc.dat_2、abc.dat_3、abc.dat_4 等文件,用戶以 “fopen ( “abc.dat”,”r.”)” 函數(shù)調(diào)用(其中” r.”代表 連續(xù)讀取模式),讀取abc.dat文件時使用連續(xù)讀取文件模式,則在文件abc.dat讀取后, 會自動鏈接到abc.dat_l,依此類推可連續(xù)讀取若干文件。這種讀取方式下,固化好的用戶 代碼不需要改動,即可每次重新上電創(chuàng)建一個新文件記錄數(shù)據(jù),讀取數(shù)據(jù)時可選擇讀取某 個文件或是連續(xù)讀取所有的文件。
[0152]進一步的,本發(fā)明的文件系統(tǒng)還包括文件遠程操控模塊和人機界面;所述文件遠 程操控模塊用于與遠程PC機進行通訊,實現(xiàn)遠程PC機對文件系統(tǒng)的控制。如圖2所示。
[0153]進一步的,本發(fā)明采用的nand flash為多個nand flash組成的多片并行nand flash。
[0154]典型的多片并行的硬件設(shè)計原理框圖如圖5所示。通常nand flash是8bit位寬 的存儲器,而CPU處理器通常是16bit、32bit、64bit處理器,可以通過將多個nand flash 拼在一起的方式,提高系統(tǒng)的性能。
[0155]本實施例的“分區(qū)表”設(shè)計:
[0156]文件系統(tǒng)以一個數(shù)據(jù)結(jié)構(gòu)的形式存放在nand flash內(nèi)部,記錄著管理文件系統(tǒng)所 需的所有數(shù)據(jù),簡稱分區(qū)表。分區(qū)表分為三個部分:如圖10所示;
[0157]1.包含指定分區(qū)的文件信息的數(shù)據(jù)結(jié)構(gòu)PartitionDescription ;
[0158]2.包含壞塊信息以及替換查找表的BadTable ;
[0159]3.記錄其它分區(qū)整理信息的DiskDetail ;
[0160]分區(qū)文件信息分2個部分,分區(qū)概況信息與每個文件信息。分區(qū)概況信息記錄著 分區(qū)的起始地址、分區(qū)大小、使用大小、結(jié)束標志、擦除標志、當前訪問文件序號等信息。通 過分區(qū)的概況信息,可獲得以下信息:可在哪里創(chuàng)建新文件、上次寫入的文件是否正常關(guān)閉 等信息,以便進行創(chuàng)建新文件、掉電保護等操作。分區(qū)表與文件關(guān)系如圖9所示。
[0161]文件信息的數(shù)據(jù)結(jié)構(gòu)PartitionDescription包含了某個分區(qū)的全部文件的信 息,包括該分區(qū)的始末地址,分區(qū)大小、文件個數(shù)、使用空間、未用空間、文件指針等信息,如 圖11。[0162]壞塊記錄表的結(jié)構(gòu)如圖12所示,壞塊記錄表BadTable記錄了壞塊的位置,壞塊替 換表SubstiTable記錄了被映射到壞塊位置的好塊的位置。壞塊替換表SubstiTable是文 件系統(tǒng)保留的處于nand flash末尾的一些好塊,被用于替換出廠壞塊以及后續(xù)運行時產(chǎn)生 的壞塊。
[0163]文件系統(tǒng)整體描述信息表如圖13所示,該信息表記錄了存儲區(qū)的大小、已使用大 小、分區(qū)個數(shù)、總壞塊個數(shù)、是否掉電、分區(qū)完整標志等信息。
[0164]如圖14所示,文件分區(qū)表多備份方法如下:
[0165]分區(qū)表存儲在從固態(tài)盤開始的128block中查找好的3塊,作為3備份分區(qū)的存 放。分區(qū)表的存放規(guī)則是3備份分開存放:0備份放置在0?39,I備份放置在40?79,2 備份放置在80?127。0備份只能放在0?39,當出現(xiàn)某分區(qū)表異常時,根據(jù)出錯情況判 斷是出現(xiàn)記錄bit錯誤或是記錄時斷電,當出現(xiàn)記錄bit錯誤時,標記為壞塊并自動向后替 換。在初始化找分區(qū)表時,根據(jù)備份區(qū)的壞塊標記,找到分區(qū)表。根據(jù)找到的三個分區(qū)表的 “新舊狀況”找到最新、校驗正確的分區(qū)表。
[0166]對于記錄分區(qū)表的存儲單元,每個分區(qū)表都有一段ECC校驗值(每512字節(jié)生產(chǎn)I 個ecc校驗碼),并與分區(qū)表存放在一起。分區(qū)表更新方法如圖15所示,當出現(xiàn)ECC校驗錯 誤時,判斷是否能糾正,若能糾正則使用該分區(qū)表,并將該block標記為壞塊,以防出現(xiàn)不 可糾正的錯誤。對于出現(xiàn)ECC校驗錯誤時就標記為壞塊的做法的原因,是考慮到本文件系 統(tǒng)是使用在高可靠系統(tǒng)中,任何數(shù)據(jù)都可能是非常重要的。分區(qū)表更新方法如圖15所示。
[0167]應(yīng)當理解的是,對本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)上述說明加以改進或變換, 而所有這些改進和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護范圍。
【權(quán)利要求】
1.一種基于nand flash的高可靠線性文件系統(tǒng),其特征在于,所述文件系統(tǒng)包括硬件抽象層和軟件層,所述硬件抽象層用于實現(xiàn)對硬件IO的訪問,所述軟件層通過訪問硬件抽象層的接口實現(xiàn)對文件的操作,所述軟件層包括:分區(qū)表初始化模塊,用于對分區(qū)表進行初始化;文件信息初始化模塊,用于初始化文件的始末地址、打開方式、文件名和文件大小信息;文件管理模塊,用于對文件進行管理;所述文件管理模塊包括:文件創(chuàng)建子模塊,用于完成創(chuàng)建新文件;文件存取模塊,用于控制文件的讀取與寫入操作;所述文件存取模塊包括:文件寫入子模塊,用于按采用順序地址方式將數(shù)據(jù)從sdram存儲器中的緩沖區(qū)搬移至分區(qū)中文件指針指向的存儲區(qū)域;文件循環(huán)寫入子模塊,用于分區(qū)空間滿時,自動刪除最舊文件并寫入新文件;文件實時寫入子模塊,用于將數(shù)據(jù)寫入分區(qū)前先緩沖至nvram非易失存儲器中;文件讀取子模塊,用于將數(shù)據(jù)從分區(qū)讀取到sdram存儲器中,然后從sdram存儲器中取走。
2.根據(jù)權(quán)利要求1所述的文件`系統(tǒng),其特征在于,所述文件創(chuàng)建子模塊包括:文件名非法糾正模塊,用于進行文件名非法自處糾正;同名文件判斷模塊,用于判斷是否存在同名文件;“自動追加”模式判斷模塊,用于判斷是否“自動追加”模式,如果是則對文件名自動追加后綴序號;文件個數(shù)判斷模塊,用于判斷是否文件個數(shù)已滿;循環(huán)模式判斷模塊,用于需要判斷是否是循環(huán)模式,如果是循環(huán)模式,則刪除最老的文件;文件信息創(chuàng)建模塊,用于在分區(qū)表中找到一個位置,創(chuàng)建文件信息,并返回指向該位置的文件指針,并根據(jù)文件的大小更新分區(qū)表。
3.根據(jù)權(quán)利要求1所述的文件系統(tǒng),其特征在于,所述分區(qū)表初始化模塊包括:芯片硬件初始化子模塊,用于通過初始化獲得芯片的屬性信息,并防止對芯片進行異常訪問;壞塊信息掃描子模塊,用于識別nand芯片的所有壞塊;好塊/壞塊替換表,用于建立壞塊到好塊的物理位置的映射關(guān)系;文件分區(qū)劃分子模塊,用于按照分區(qū)時的參數(shù)進行分區(qū)大小劃分。
4.根據(jù)權(quán)利要求1所述的文件系統(tǒng),其特征在于,所述文件管理模塊還包括:掉電文件處理子模塊,用于恢復(fù)由于異常掉電丟失的文件:在寫入文件時,同時將文件的日志記錄到nand flash的一片nvram存儲器中在寫入文件時若掉電,當重新上電時,讀取nvram存儲器中的日志數(shù)據(jù),通過讀取該部分數(shù)據(jù)追朔至掉電前數(shù)據(jù)記錄物理地址,查詢到最后寫入的數(shù)據(jù)的內(nèi)容,將未寫入至nand存儲器的數(shù)據(jù)從nvram非易失存儲器中重新寫入到nand的某分區(qū)中。
5.根據(jù)權(quán)利要求1所述的文件系統(tǒng),其特征在于,所述文件管理模塊還包括:文件刪除子模塊,用于將文件從分區(qū)表中刪除,釋放存儲空間;壞塊替換子模塊,用于在文件寫入時根據(jù)好塊/壞塊替換表替換無效數(shù)據(jù)塊。
6.根據(jù)權(quán)利要求1所述的文件系統(tǒng),其特征在于,所述文件系統(tǒng)還包括文件遠程操控模塊和人機界面;所述文件遠程操控模塊用于與遠程PC機進行通訊,實現(xiàn)遠程PC機對文件系統(tǒng)的控制。
7.根據(jù)權(quán)利要求3所述的文件系統(tǒng),其特征在于,所述分區(qū)表初始化模塊還包括分區(qū)備份子模塊,用于文件系統(tǒng)分區(qū)表同時存儲在從nand flash存儲陣列開始的128block中查找的3個好塊中作為3個備份。
【文檔編號】G06F17/30GK103577574SQ201310541079
【公開日】2014年2月12日 申請日期:2013年11月5日 優(yōu)先權(quán)日:2013年11月5日
【發(fā)明者】袁松, 何沖, 毛先俊 申請人:中船重工(武漢)凌久電子有限責(zé)任公司