基于nand flash的啟動(dòng)加載方法和裝置制造方法
【專利摘要】本發(fā)明公開了一種基于NAND?FLASH的啟動(dòng)加載方法和裝置。在本發(fā)明中,引導(dǎo)程序的可執(zhí)行代碼被分段存儲(chǔ)在由Block0之后的多個(gè)連續(xù)Block構(gòu)成的存儲(chǔ)空間中,因而消除了單個(gè)Block的物理空間對(duì)可執(zhí)行代碼的限制;而且,存儲(chǔ)空間的起始Block及Block數(shù)量均以配置信息的形式存放在可靠性最高的Block0中,因而能夠確保分段存儲(chǔ)的可執(zhí)行代碼的高可靠性尋址。而且,存儲(chǔ)空間中的連續(xù)多個(gè)Block的物理空間之和可以大于可執(zhí)行代碼首次寫入NAND?FLASH時(shí)的代碼數(shù)據(jù)量大小,因而,存儲(chǔ)空間也能夠滿足可執(zhí)行代碼由于升級(jí)更新而增加的代碼數(shù)據(jù)量,從而不會(huì)因?yàn)榭蓤?zhí)行代碼的代碼數(shù)據(jù)量增加而重新進(jìn)行存儲(chǔ)空間的Block劃分,相應(yīng)地,也就無(wú)需更新Block0中記錄的配置信息,進(jìn)而實(shí)現(xiàn)了Block0在出廠后免更新。
【專利說(shuō)明】基于NAND FLASH的啟動(dòng)加載方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及啟動(dòng)加載技術(shù),特別涉及一種基于NAND FLASH(與非閃存)的啟動(dòng)加載方法和裝置。
【背景技術(shù)】
[0002]Bootloader (啟動(dòng)加載)引導(dǎo)程序是CPU復(fù)位后首先需要被執(zhí)行的一段代碼,用以初始化CPU和周邊外設(shè),從而正確地啟動(dòng)操作系統(tǒng)。其中,Bootloader引導(dǎo)程序一般分為Stagel (第一階段)和Stage2 (第二階段)兩部分;Stagel負(fù)責(zé)小系統(tǒng)初始化,主要包括CPU、Boot啟動(dòng)介質(zhì)和內(nèi)存初始化,以便于為Stage2的執(zhí)行準(zhǔn)備正確的環(huán)境;Stage2則負(fù)責(zé)基礎(chǔ)硬件的初始化、為內(nèi)核執(zhí)行準(zhǔn)備基本的軟硬件壞境、提供符合規(guī)范的擴(kuò)展菜單、實(shí)現(xiàn)增強(qiáng)的用戶交互能力、并從文件系統(tǒng)的存儲(chǔ)介質(zhì)中加載并啟動(dòng)操作系統(tǒng)。
[0003]Bootloader引導(dǎo)程序的可執(zhí)行代碼都是保存在非易失存儲(chǔ)介質(zhì)中,如NORFLASH(或非閃存)、NAND FLASH、SPI (Serial Peripheral Interface,串行外設(shè)接口)FLASH等,這些可用于保存Bootloader引導(dǎo)程序的FLASH可稱為Boot FLASH(啟動(dòng)閃存)。相應(yīng)地,當(dāng)CPU啟動(dòng)后,由集成在CPU內(nèi)部、或獨(dú)立于CPU之外的啟動(dòng)加載裝置從Boot FLASH中讀取Stage 1、以供CPU執(zhí)行并引導(dǎo)CPU啟動(dòng)。
[0004]目前,NAND FLASH越來(lái)越頻繁地被用為Boot FLASH。其中,NAND FLASH的物理空間是由多個(gè)Block(塊)組成,其中的BlockO具有高可靠性、且不會(huì)出現(xiàn)壞塊,因而Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼會(huì)保存在BlockO中,而從Blockl開始的至少一個(gè)Block中會(huì)保存Stagel的可執(zhí)行代碼的備份。
[0005]然而,在上述方案中,Stagel的可執(zhí)行代碼被限制在一個(gè)Block的物理空間內(nèi)、通常為128KB,但隨著硬件系統(tǒng)的不斷升級(jí),初始化的配置過(guò)程越來(lái)越復(fù)雜,Stagel的可執(zhí)行代碼的大小也會(huì)隨之增加,這就導(dǎo)致一個(gè)Block的物理空間不足以保存Stagel的可執(zhí)行代碼。
【發(fā)明內(nèi)容】
[0006]有鑒于此,本發(fā)明提供了一種基于NAND FLASH的啟動(dòng)加載方法和裝置。
[0007]本發(fā)明提供的一種基于NAND FLASH的啟動(dòng)加載方法,
[0008]NAND FLASH中為引導(dǎo)程序的可執(zhí)行代碼分配有對(duì)應(yīng)的存儲(chǔ)空間,引導(dǎo)程序可執(zhí)行代碼在NAND FLASH中對(duì)應(yīng)的存儲(chǔ)空間的起始Block及包含的Block數(shù)量以配置信息的形式存放在NAND FLASH的BlockO中,該存儲(chǔ)空間包括BlockO之后的多個(gè)連續(xù)Block ;以及,該啟動(dòng)加載方法包括:
[0009]在CPU 開始從 NAND FLASH 啟動(dòng)時(shí),讀取 NAND FLASH 的 BlockO ;
[0010]在從BlockO中讀取到配置信息后,從配置信息中解析得到引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z,其中Z大于等于I ;
[0011]在完成對(duì)配置信息的解析后,從解析得到的起始Block開始連續(xù)讀取Z個(gè)Block、且讀取到的引導(dǎo)程序可執(zhí)行代碼用于引導(dǎo)CPU啟動(dòng)。
[0012]優(yōu)選地,引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的所有Block的物理空間之和,大于該引導(dǎo)程序可執(zhí)行代碼的數(shù)據(jù)大小。
[0013]優(yōu)選地,該啟動(dòng)加載方法進(jìn)一步包括:對(duì)讀取的引導(dǎo)程序可執(zhí)行代碼進(jìn)行ECC糾錯(cuò)。
[0014]優(yōu)選地,讀取到的引導(dǎo)程序可執(zhí)行代碼以頁(yè)為單位被緩存、然后被匯總至與CPU連接的RAM中,其中,引導(dǎo)程序可執(zhí)行代碼在緩存中以頁(yè)為單位被執(zhí)行ECC糾錯(cuò)。
[0015]優(yōu)選地,引導(dǎo)程序可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NAND FLASH中,以及,從配置信息中解析得到的存儲(chǔ)空間的起始Block及Block數(shù)量Z包括每份引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z。
[0016]優(yōu)選地,多份引導(dǎo)程序可執(zhí)行代碼分別對(duì)應(yīng)的存儲(chǔ)空間連續(xù)排列。
[0017]優(yōu)選地,在完成對(duì)配置信息的解析后,先從解析得到位置最靠前的起始Block開始連續(xù)讀取Z個(gè)Block。
[0018]優(yōu)選地,該啟動(dòng)加載方法進(jìn)一步包括:每當(dāng)從當(dāng)前的起始Block開始連續(xù)讀取Z個(gè)Block后,對(duì)引導(dǎo)程序可執(zhí)行代碼進(jìn)行壞塊檢測(cè)和數(shù)據(jù)校驗(yàn);當(dāng)檢測(cè)到壞塊或或數(shù)據(jù)校驗(yàn)失敗時(shí),跳轉(zhuǎn)至解析得到的下一個(gè)起始Block開始連續(xù)讀取Z個(gè)Block。
[0019]優(yōu)選地,讀取到的引導(dǎo)程序可執(zhí)行代碼以頁(yè)為單位被緩存、然后被匯總至與CPU連接的RAM中,其中,引導(dǎo)程序可執(zhí)行代碼在匯總至RAM之后被執(zhí)行壞塊校驗(yàn)和數(shù)據(jù)校驗(yàn)。
[0020]本發(fā)明提供的一種基于NAND FLASH的啟動(dòng)加載裝置,
[0021]引導(dǎo)程序可執(zhí)行代碼在NAND FLASH中對(duì)應(yīng)的存儲(chǔ)空間的起始Block及包含的Block數(shù)量以配置信息的形式存放在NAND FLASH的BlockO中,該存儲(chǔ)空間包括BlockO之后的多個(gè)連續(xù)Block ;以及,該啟動(dòng)加載裝置包括NAND FLASH控制模塊和配置信息解析模塊,其中:
[0022]當(dāng)CPU開始從NAND FLASH啟動(dòng)時(shí),NAND FLASH控制模塊讀取NAND FLASH的BlockO ;
[0023]當(dāng)從BlockO中讀取到配置信息后,NAND FLASH控制模塊通知配置信息解析模塊,使配置信息解析模塊從配置信息中解析得到引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z,其中Z大于等于I ;
[0024]在完成對(duì)配置信息的解析后,NAND FLASH控制模塊從解析得到的起始Block開始連續(xù)讀取Z個(gè)Block、且讀取到的引導(dǎo)程序可執(zhí)行代碼用于引導(dǎo)CPU啟動(dòng)。
[0025]優(yōu)選地,引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的所有Block的物理空間之和,大于該引導(dǎo)程序可執(zhí)行代碼的數(shù)據(jù)大小。
[0026]優(yōu)選地,該啟動(dòng)加載裝置進(jìn)一步包括:ECC糾錯(cuò)模塊,對(duì)讀取的引導(dǎo)程序可執(zhí)行代碼進(jìn)行ECC糾錯(cuò)。
[0027]優(yōu)選地,讀取到的引導(dǎo)程序可執(zhí)行代碼以頁(yè)為單位被緩存、然后被匯總至與CPU連接的RAM中,其中,引導(dǎo)程序可執(zhí)行代碼在緩存中以頁(yè)為單位被執(zhí)行ECC糾錯(cuò)。
[0028]優(yōu)選地,引導(dǎo)程序可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NAND FLASH中,以及,從配置信息中解析得到的存儲(chǔ)空間的起始Block及Block數(shù)量Z包括每份引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z。
[0029]優(yōu)選地,多份引導(dǎo)程序可執(zhí)行代碼分別對(duì)應(yīng)的存儲(chǔ)空間連續(xù)排列。
[0030]優(yōu)選地,在完成對(duì)配置信息的解析后,配置信息解析模塊先從解析得到位置最靠前的起始Block開始連續(xù)讀取Z個(gè)Block。
[0031]優(yōu)選地,該啟動(dòng)加載裝置進(jìn)一步包括:壞塊檢測(cè)模塊和數(shù)據(jù)校驗(yàn)?zāi)K;每當(dāng)從當(dāng)前的起始Block開始連續(xù)讀取Z個(gè)Block后,壞塊檢測(cè)模塊和數(shù)據(jù)校驗(yàn)?zāi)K分別對(duì)引導(dǎo)程序可執(zhí)行代碼進(jìn)行壞塊檢測(cè)和數(shù)據(jù)校驗(yàn);當(dāng)檢測(cè)到壞塊或或數(shù)據(jù)校驗(yàn)失敗時(shí),NAND FLASH控制模塊跳轉(zhuǎn)至解析得到的下一個(gè)起始Block開始連續(xù)讀取Z個(gè)Block。
[0032]優(yōu)選地,讀取到的引導(dǎo)程序可執(zhí)行代碼以頁(yè)為單位被緩存、然后被匯總至與CPU連接的RAM中,其中,引導(dǎo)程序可執(zhí)行代碼在匯總至RAM之后被執(zhí)行壞塊校驗(yàn)和數(shù)據(jù)校驗(yàn)。
[0033]由此可見,在本發(fā)明中,引導(dǎo)程序可執(zhí)行代碼被分段存儲(chǔ)在由BlockO之后的多個(gè)連續(xù)Block構(gòu)成的存儲(chǔ)空間中,因而消除了單個(gè)Block的物理空間對(duì)可執(zhí)行代碼的限制;而且,存儲(chǔ)空間的起始Block及Block數(shù)量均以配置信息的形式存放在可靠性最高的BlockO中,因而能夠確保分段存儲(chǔ)的可執(zhí)行代碼的高可靠性尋址。
[0034]而且,存儲(chǔ)空間中的連續(xù)多個(gè)Block的物理空間之和可以大于引導(dǎo)程序可執(zhí)行代碼首次寫入NAND FLASH時(shí)的代碼數(shù)據(jù)量大小,此時(shí),就相當(dāng)于為引導(dǎo)程序可執(zhí)行代碼的后續(xù)升級(jí)更新預(yù)留了空閑Block,因而,即便引導(dǎo)程序可執(zhí)行代碼的代碼數(shù)據(jù)量由于升級(jí)更新而增加,預(yù)留的空閑Block也能夠滿足可執(zhí)行代碼的代碼數(shù)據(jù)量增加,從而不會(huì)因?yàn)橐龑?dǎo)程序可執(zhí)行代碼的代碼數(shù)據(jù)量增加而重新進(jìn)行存儲(chǔ)空間的Block劃分,相應(yīng)地,也就無(wú)需更新BlockO中記錄的配置信息,進(jìn)而實(shí)現(xiàn)了 BlockO在出廠后免更新。
[0035]另外,在本發(fā)明中,還可以對(duì)讀取到的引導(dǎo)程序可執(zhí)行代碼進(jìn)行ECC糾錯(cuò),以提高啟動(dòng)加載的可靠性。
[0036]以及,在本發(fā)明中,NAND FLASH中所存放的引導(dǎo)程序可執(zhí)行代碼可以包括多份、且存儲(chǔ)空間的Block排序最靠前的一份被優(yōu)先讀取,相應(yīng)地,在讀取Block時(shí),還可以進(jìn)一步引入壞塊檢測(cè)以及數(shù)據(jù)校驗(yàn),當(dāng)壞塊檢測(cè)以及數(shù)據(jù)校驗(yàn)中的任一環(huán)節(jié)失敗時(shí),可以直接跳轉(zhuǎn)至下一個(gè)份引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的連續(xù)多個(gè)Block,以實(shí)現(xiàn)對(duì)引導(dǎo)程序可執(zhí)行代碼的加載備份。
【專利附圖】
【附圖說(shuō)明】
[0037]圖1為本發(fā)明實(shí)施例中實(shí)現(xiàn)的啟動(dòng)加載的基本原理的不意圖;
[0038]圖2為本發(fā)明實(shí)施例中實(shí)現(xiàn)的啟動(dòng)加載的擴(kuò)展原理的示意圖;
[0039]圖3為本發(fā)明實(shí)施例中基于NAND FLASH的啟動(dòng)加載方法的示例性流程示意圖;
[0040]圖4為本發(fā)明實(shí)施例中基于NAND FLASH的啟動(dòng)加載方法的擴(kuò)展流程示意圖;
[0041]圖5為本發(fā)明實(shí)施例中基于NAND FLASH的啟動(dòng)加載裝置的示例性結(jié)構(gòu)示意圖;
[0042]圖6為本發(fā)明實(shí)施例中基于NAND FLASH的啟動(dòng)加載裝置的優(yōu)選結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0043]為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對(duì)本發(fā)明進(jìn)一步詳細(xì)說(shuō)明。
[0044]在本實(shí)施例中,Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼可以被分段存儲(chǔ)在由BlockO之后的多個(gè)連續(xù)Block構(gòu)成的存儲(chǔ)空間中,即,利用在多個(gè)Block中的分段存儲(chǔ)來(lái)消除單個(gè)Block的物理空間對(duì)Stagel可執(zhí)行代碼的限制;而且,存儲(chǔ)空間的起始Block及Block數(shù)量均可以以配置信息的形式存放在可靠性最高的BlockO中,以確保對(duì)分段存儲(chǔ)的Stagel可執(zhí)行代碼的高可靠性尋址。
[0045]請(qǐng)參見圖1,在NAND FLASH中,Block m至Block η構(gòu)成Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間,m為大于等于I的正整數(shù)、η為大于m的正整數(shù),其中:
[0046]對(duì)于Block m至Block η構(gòu)成的存儲(chǔ)空間,其起始的Block m以及Block數(shù)量n_m+l均以配置信息的形式存放在BlockO ;
[0047]當(dāng)CPU啟動(dòng)時(shí),啟動(dòng)加載裝置可以從BlockO中讀取到配置信息,并解析得到上述存儲(chǔ)空間的起始Block和Block數(shù)量,然后再?gòu)腂lock m開始讀取Block m至Block η,此后,被讀取到的Stagel可執(zhí)行代碼可以供CPU加載運(yùn)行。
[0048]另外,為了提高CPU啟動(dòng)加載的可靠性,Stagel可執(zhí)行代碼可以被復(fù)制為多份存儲(chǔ)在 NAND FLASH 中。
[0049]請(qǐng)參見圖2,以Stagel可執(zhí)行代碼被復(fù)制為兩份保存在NAND FLASH為例,在NANDFLASH中,Block m至Block η構(gòu)成一份Stage I可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間,Block p至Blockq構(gòu)成另一份Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間,m為大于等于I的正整數(shù)、η為大于m的正整數(shù)、P為大于η的正整數(shù)、q為大于P的正整數(shù),其中:
[0050]對(duì)于Block m至Block η構(gòu)成的存儲(chǔ)空間,其起始的Block m以及Block數(shù)量n_m+l均以配置信息的形式存放在BlockO,同理,對(duì)于Block p至Block q構(gòu)成的存儲(chǔ)空間,其起始的Block p、以及Block數(shù)量q-ρ+Ι同樣以配置信息的形式存放在BlockO ;其中,上述的Block數(shù)量n-m+1和q-ρ+Ι均可以統(tǒng)一地被表示為大于I的正整數(shù)Z。
[0051]當(dāng)CPU啟動(dòng)時(shí),啟動(dòng)加載裝置可以從BlockO中讀取到配置信息,并解析得到上述兩個(gè)存儲(chǔ)空間的起始Block和Block數(shù)量;
[0052]由于Block m至Block η位于Block p至Block q之前,因而,當(dāng)CPU啟動(dòng)時(shí),啟動(dòng)加載裝置會(huì)優(yōu)先讀取Block m至Block η,即,在Block m至Block η構(gòu)成的存儲(chǔ)空間中保存的該份Stagel可執(zhí)行代碼會(huì)被作為主用的可執(zhí)行代碼而被啟動(dòng)加載裝置優(yōu)先讀取、供CPU加載運(yùn)行;
[0053]而對(duì)于在Block P至Block q構(gòu)成的存儲(chǔ)空間中保存的另一份Stagel可執(zhí)行代碼則可以作為備用的可執(zhí)行代碼,待讀取主用的可執(zhí)行代碼出錯(cuò)時(shí),例如壞塊檢測(cè)、數(shù)據(jù)校驗(yàn)失敗,在Block P至Blockq構(gòu)成的存儲(chǔ)空間中保存的備用可執(zhí)行代碼再被啟動(dòng)加載裝置讀取。本實(shí)施例中,Block m至Block η構(gòu)成的存儲(chǔ)空間可以與Block P至Block q構(gòu)成的存儲(chǔ)空間連續(xù)排列,即,P可以等于n+1 ;并且,Stagel可執(zhí)行代碼可以僅在NAND FLASH中保存一份、或者在NAND FLASH中保存多于兩份,但其實(shí)現(xiàn)原理不變。
[0054]并且,為了提高啟動(dòng)加載的可靠性,本實(shí)施例可以對(duì)讀取到的代碼數(shù)據(jù)進(jìn)行ECC(Error Correcting Code,錯(cuò)誤檢查糾正)糾錯(cuò)。
[0055]另外,不論Block m至Block η構(gòu)成的存儲(chǔ)空間還是Block p至Block q構(gòu)成的存儲(chǔ)空間,其所有Block的物理空間之和可以大于Stagel可執(zhí)行代碼首次寫入NAND FLASH時(shí)的代碼數(shù)據(jù)量大小,此時(shí),就相當(dāng)于為Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼的后續(xù)升級(jí)更新預(yù)留了空閑Block,因而,即便Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)量由于后續(xù)的升級(jí)更新而增加,存儲(chǔ)空間中預(yù)留的空閑Block也能夠滿足Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)量增加,從而不會(huì)因?yàn)镾tagel可執(zhí)行代碼的代碼數(shù)據(jù)量增加而重新進(jìn)行存儲(chǔ)空間的Block劃分,相應(yīng)地,也就無(wú)需更新BlockO中記錄的配置信息,進(jìn)而實(shí)現(xiàn)了 BlockO在出廠后免更新。
[0056]基于上述原理,本實(shí)施例提供了一種基于NAND FLASH的啟動(dòng)加載方法。
[0057]請(qǐng)參見圖3,以Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NAND FLASH中為例,該啟動(dòng)加載方法包括由啟動(dòng)加載裝置執(zhí)行的如下步驟:
[0058]步驟301,在 CPU 開始從 NAND FLASH 啟動(dòng)時(shí),讀取 NAND FLASH 的 BlockO。
[0059]本實(shí)施例中,本步驟可以通過(guò)向NAND FLASH發(fā)送對(duì)應(yīng)的讀命令來(lái)實(shí)現(xiàn)。
[0060]步驟302,在從BlockO中讀取到配置信息后,從配置信息中解析得到Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量,即,解析得到每份Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量。
[0061]步驟303,在完成對(duì)配置信息的解析后,從解析得到的起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block。
[0062]本實(shí)施例中,本步驟與步驟301的實(shí)現(xiàn)方式相同,同樣是可以通過(guò)向NAND FLASH發(fā)送對(duì)應(yīng)的讀命令來(lái)實(shí)現(xiàn)。
[0063]步驟304,當(dāng)開始連續(xù)讀取相應(yīng)數(shù)量的Block后,對(duì)讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)進(jìn)行ECC糾錯(cuò)。
[0064]本實(shí)施例中,從每個(gè)Block以頁(yè)為單位讀取Stagel可執(zhí)行代碼的代碼數(shù)據(jù),讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)以頁(yè)為單位被緩存匯總至與CPU連接的RAM中。相應(yīng)地,Stagel可執(zhí)行代碼的代碼數(shù)據(jù)可以在緩存中以頁(yè)為單位執(zhí)行ECC糾錯(cuò)。
[0065]至此,本流程結(jié)束,相應(yīng)地,利用本流程成功讀取到的Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼引導(dǎo)CPU啟動(dòng)。
[0066]如前文所述,為了提高CPU啟動(dòng)加載的可靠性,Stagel可執(zhí)行代碼可以被復(fù)制為多份存儲(chǔ)在NAND FLASH中。針對(duì)Stagel可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)的情況,本實(shí)施例中的啟動(dòng)加載方法需要進(jìn)行相應(yīng)的擴(kuò)展。
[0067]請(qǐng)參見圖4,以Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NAND FLASH中為例,該啟動(dòng)加載方法包括由啟動(dòng)加載裝置執(zhí)行的如下步驟:
[0068]步驟401,在 CPU 開始從 NAND FLASH 啟動(dòng)時(shí),讀取 NAND FLASH 的 BlockO。
[0069]本實(shí)施例中,本步驟可以通過(guò)向NAND FLASH發(fā)送對(duì)應(yīng)的讀命令來(lái)實(shí)現(xiàn)。
[0070]步驟402,在從BlockO中讀取到配置信息后,從配置信息中解析得到Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量,即,解析得到每份Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量。
[0071]步驟403,在完成對(duì)配置信息的解析后,從解析得到的起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block。
[0072]其中,當(dāng)首次執(zhí)行本步驟時(shí),從解析得到位置最靠前的起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block,當(dāng)再次執(zhí)行本步驟時(shí),則跳轉(zhuǎn)至解析得到的下一個(gè)起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block。
[0073]本實(shí)施例中,本步驟與步驟401的實(shí)現(xiàn)方式相同,同樣是可以通過(guò)向NAND FLASH發(fā)送對(duì)應(yīng)的讀命令來(lái)實(shí)現(xiàn)。
[0074]步驟404,當(dāng)開始連續(xù)讀取相應(yīng)數(shù)量的Block后,對(duì)讀取到的Stage I可執(zhí)行代碼的代碼數(shù)據(jù)進(jìn)行ECC糾錯(cuò)。
[0075]本實(shí)施例中,從每個(gè)Block以頁(yè)為單位讀取Stagel可執(zhí)行代碼的代碼數(shù)據(jù),讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)以頁(yè)為單位被緩存匯總至與CPU連接的RAM中。相應(yīng)地,Stagel可執(zhí)行代碼的代碼數(shù)據(jù)可以在緩存中以頁(yè)為單位執(zhí)行ECC糾錯(cuò)。
[0076]步驟405,對(duì)讀取的代碼數(shù)據(jù)進(jìn)行壞塊檢測(cè),若未檢測(cè)到壞塊則執(zhí)行步驟406,否則返回步驟203。
[0077]步驟406,對(duì)讀取的代碼數(shù)據(jù)進(jìn)行數(shù)據(jù)校驗(yàn),若校驗(yàn)成功則結(jié)束本流程,否則返回步驟403。
[0078]本實(shí)施例中,上述的步驟405和406可以同時(shí)執(zhí)行、也可以調(diào)換執(zhí)行順序,只要滿足在未檢測(cè)到壞塊且數(shù)據(jù)校驗(yàn)成功時(shí)結(jié)束本流程、在檢測(cè)到壞塊或數(shù)據(jù)校驗(yàn)失敗時(shí)返回步驟403即可。并且,由于讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)能夠以頁(yè)為單位被讀取并緩存、然后被匯總至與CPU連接的RAM中,因此,Stagel可執(zhí)行代碼的代碼數(shù)據(jù)在匯總至RAM之后被上述的步驟405和406可以分別執(zhí)行壞塊校驗(yàn)和數(shù)據(jù)校驗(yàn)。
[0079]至此,本流程結(jié)束,相應(yīng)地,利用本流程成功讀取到的Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼引導(dǎo)CPU啟動(dòng)。以上是對(duì)本實(shí)施例中NAND FLASH的啟動(dòng)加載方法的詳細(xì)說(shuō)明。本實(shí)施例還提供了一種基于NAND FLASH的啟動(dòng)加載裝置,該啟動(dòng)加載裝置可以集成于CPU中、也可以獨(dú)立于CPU之外單獨(dú)存在,以下以該啟動(dòng)加載裝置與CPU —體集成為例進(jìn)行說(shuō)明。
[0080]請(qǐng)參見圖5,本實(shí)施例中基于NAND FLASH的啟動(dòng)加載裝置包括NAND FLASH控制模塊、配置信息解析模塊、以及ECC糾錯(cuò)模塊,其中,NAND FLASH控制模塊為啟動(dòng)加載裝置中的核心模塊,NAND FLASH控制模塊既負(fù)責(zé)發(fā)起對(duì)NAND FLASH的讀操作、又負(fù)責(zé)其他模塊的協(xié)調(diào)控制;ECC糾錯(cuò)模塊則為可選的模塊、而非必須包括在啟動(dòng)加載裝置中的模塊。
[0081]當(dāng)CPU 開始從NAND FLASH啟動(dòng)時(shí),NAND FLASH控制模塊讀取NAND FLASH 的 BlockO。
[0082]實(shí)際應(yīng)用中,NAND FLASH控制模塊可以通過(guò)啟動(dòng)加載裝置中的NAND FLASH接口向NAND FLASH發(fā)送對(duì)應(yīng)的讀命令、以實(shí)現(xiàn)對(duì)BlockO的讀取。
[0083]當(dāng)從BlockO中讀取到配置信息后,NAND FLASH控制模塊通知配置信息解析模塊,使配置信息解析模塊從配置信息中解析得到Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block 及 Block 數(shù)量。
[0084]當(dāng)完成對(duì)配置信息的解析后,NAND FLASH控制模塊從解析得到的起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block,讀取到的引導(dǎo)程序可執(zhí)行代碼供引導(dǎo)CPU啟動(dòng)時(shí)使用。
[0085]當(dāng)開始連續(xù)讀取相應(yīng)數(shù)量的Block后,ECC糾錯(cuò)模塊在NAND FLASH控制模塊的控制下對(duì)讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)進(jìn)行ECC糾錯(cuò)。
[0086]實(shí)際應(yīng)用中,從每個(gè)Block都是以頁(yè)為單位讀取Stagel可執(zhí)行代碼的代碼數(shù)據(jù),并且,讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)也會(huì)以頁(yè)為單位被緩存、然后被匯總至與CPU連接的RAM中。相應(yīng)地,Stagel可執(zhí)行代碼的代碼數(shù)據(jù)可以在緩存中以頁(yè)為單位被ECC糾錯(cuò)模塊執(zhí)行ECC糾錯(cuò)。
[0087]與方法部分同理,為了提高CPU啟動(dòng)加載的可靠性,Stagel可執(zhí)行代碼可以被復(fù)制為多份存儲(chǔ)在NAND FLASH中,相應(yīng)地,針對(duì)Stagel可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)的情況,本實(shí)施例中的啟動(dòng)加載裝置需要進(jìn)行相應(yīng)的擴(kuò)展。
[0088]請(qǐng)參見圖6,本實(shí)施例中基于NAND FLASH的啟動(dòng)加載裝置包括NAND FLASH控制模塊、配置信息解析模塊、ECC糾錯(cuò)模塊、壞塊檢測(cè)模塊、以及數(shù)據(jù)校驗(yàn)?zāi)K,其中,NAND FLASH控制模塊為啟動(dòng)加載裝置中的核心模塊,NAND FLASH控制模塊既負(fù)責(zé)發(fā)起對(duì)NAND FLASH的讀操作、又負(fù)責(zé)其他模塊的協(xié)調(diào)控制;ECC糾錯(cuò)模塊則為可選的模塊、而非必須包括在啟動(dòng)加載裝置中的模塊。
[0089]當(dāng)CPU開始從NAND FLASH啟動(dòng)時(shí),NAND FLASH控制模塊讀取NAND FLASH的BlockO。
[0090]實(shí)際應(yīng)用中,NAND FLASH控制模塊可以通過(guò)啟動(dòng)加載裝置中的NAND FLASH接口向NAND FLASH發(fā)送對(duì)應(yīng)的讀命令、以實(shí)現(xiàn)對(duì)BlockO的讀取。
[0091]當(dāng)從BlockO中讀取到配置信息后,NAND FLASH控制模塊通知配置信息解析模塊,使配置信息解析模塊從配置信息中解析得到Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block 及 Block 數(shù)量。
[0092]其中,對(duì)于Bootloader引導(dǎo)程序的Stage I可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NANDFLASH中的情況,配置信息解析模塊解析得到每份Stagel可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量。
[0093]當(dāng)完成對(duì)配置信息的解析后,NAND FLASH控制模塊從解析得到的起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block,讀取到的引導(dǎo)程序可執(zhí)行代碼供引導(dǎo)CPU啟動(dòng)時(shí)使用。
[0094]其中,對(duì)于Bootloader引導(dǎo)程序的Stage I可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NANDFLASH中的情況,當(dāng)NAND FLASH控制模塊首次發(fā)起對(duì)多個(gè)連續(xù)Block的讀取時(shí),從解析得到位置最靠前的起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block,當(dāng)再次發(fā)起對(duì)多個(gè)連續(xù)Block的讀取時(shí),則跳轉(zhuǎn)至解析得到的下一個(gè)起始Block開始連續(xù)讀取相應(yīng)數(shù)量的Block。NAND FLASH控制模塊可以通過(guò)啟動(dòng)加載裝置中的NAND FLASH接口向NANDFLASH發(fā)送對(duì)應(yīng)的讀命令,以實(shí)現(xiàn)對(duì)BlockO之后的連續(xù)多個(gè)Block的讀取。
[0095]當(dāng)開始連續(xù)讀取相應(yīng)數(shù)量的Block后,ECC糾錯(cuò)模塊在NAND FLASH控制模塊的控制下對(duì)讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)進(jìn)行ECC糾錯(cuò)。
[0096]實(shí)際應(yīng)用中,從每個(gè)Block都是以頁(yè)為單位讀取Stagel可執(zhí)行代碼的代碼數(shù)據(jù),并且,讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)也會(huì)以頁(yè)為單位被緩存、然后被匯總至與(PU連接的RAM中。相應(yīng)地,Stagel可執(zhí)行代碼的代碼數(shù)據(jù)可以在緩存中以頁(yè)為單位被ECC糾錯(cuò)模塊執(zhí)行ECC糾錯(cuò)。
[0097]以及,對(duì)于ECC糾錯(cuò)后的代碼數(shù)據(jù),還可以由壞塊檢測(cè)模塊和數(shù)據(jù)校驗(yàn)?zāi)K在NAND FLASH控制模塊的控制下分別進(jìn)行壞塊檢測(cè)和數(shù)據(jù)校驗(yàn);
[0098]若壞塊檢測(cè)模塊未檢測(cè)到壞塊、且數(shù)據(jù)校驗(yàn)?zāi)K進(jìn)行數(shù)據(jù)校驗(yàn)成功,則完成了對(duì)Stagel可執(zhí)行代碼的讀取,并可以利用成功讀取到的Bootloader引導(dǎo)程序的Stagel可執(zhí)行代碼引導(dǎo)CPU啟動(dòng);
[0099]但若壞塊檢測(cè)模塊檢測(cè)到壞塊、或數(shù)據(jù)校驗(yàn)?zāi)K進(jìn)行的數(shù)據(jù)校驗(yàn)失敗,則需要由NAND FLASH控制模塊跳轉(zhuǎn)至解析得到的下一個(gè)起始Block重新開始連續(xù)讀取相應(yīng)數(shù)量的Block。
[0100]由于讀取到的Stagel可執(zhí)行代碼的代碼數(shù)據(jù)能夠以頁(yè)為單位被讀取并緩存、然后被匯總至與CPU連接的RAM中,因此,Stagel可執(zhí)行代碼的代碼數(shù)據(jù)在匯總至RAM之后被上述的壞塊檢測(cè)模塊和數(shù)據(jù)校驗(yàn)?zāi)K分別執(zhí)行壞塊校驗(yàn)和數(shù)據(jù)校驗(yàn),若壞塊檢測(cè)模塊未檢測(cè)到壞塊、且數(shù)據(jù)校驗(yàn)?zāi)K進(jìn)行數(shù)據(jù)校驗(yàn)成功,則CPU通過(guò)訪問(wèn)RAM即可在Stagel可執(zhí)行代碼的引導(dǎo)下完成啟動(dòng)。
[0101]需要說(shuō)明是,上述各流程和各結(jié)構(gòu)圖中不是所有的步驟和模塊都是必須的,可以根據(jù)具體情況忽略某些步驟或模塊。各步驟的執(zhí)行順序不是固定的,可以根據(jù)需要進(jìn)行調(diào)整。各模塊的劃分僅僅是為了便于描述采用的功能上的劃分,一個(gè)模塊可以分由多個(gè)模塊實(shí)現(xiàn),多個(gè)模塊的功能也可以由同一個(gè)模塊實(shí)現(xiàn),這些模塊可以位于同一個(gè)設(shè)備中,也可以位于不同的設(shè)備中。
[0102]以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
【權(quán)利要求】
1.一種基于NAND FLASH的啟動(dòng)加載方法,其特征在于,引導(dǎo)程序可執(zhí)行代碼在NANDFLASH中對(duì)應(yīng)的存儲(chǔ)空間的起始Block及包含的Block數(shù)量以配置信息的形式存放在NANDFLASH的BlockO中,該存儲(chǔ)空間包括BlockO之后的多個(gè)連續(xù)Block ;以及,該啟動(dòng)加載方法包括: 在CPU開始從NAND FLASH啟動(dòng)時(shí),讀取NAND FLASH的BlockO ; 在從BlockO中讀取到配置信息后,從配置信息中解析得到引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z,其中Z大于等于I ; 在完成對(duì)配置信息的解析后,從解析得到的起始Block開始連續(xù)讀取Z個(gè)Block、且讀取到的引導(dǎo)程序可執(zhí)行代碼用于引導(dǎo)CPU啟動(dòng)。
2.根據(jù)權(quán)利要求1所述的啟動(dòng)加載方法,其特征在于,引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的所有Block的物理空間之和,大于該引導(dǎo)程序可執(zhí)行代碼的數(shù)據(jù)大小。
3.根據(jù)權(quán)利要求1所述的啟動(dòng)加載方法,其特征在于,該啟動(dòng)加載方法進(jìn)一步包括: 對(duì)讀取的引導(dǎo)程序可執(zhí)行代碼進(jìn)行ECC糾錯(cuò)。
4.根據(jù)權(quán)利要求1至3中任一項(xiàng)所述的啟動(dòng)加載方法,其特征在于,引導(dǎo)程序可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NAND FLASH中,以及,從配置信息中解析得到的存儲(chǔ)空間的起始Block及Block數(shù)量Z包括每份引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z。
5.根據(jù)權(quán)利要求4所述的啟動(dòng)加載方法,其特征在于,在完成對(duì)配置信息的解析后,先從解析得到位置最靠前的起始Block開始連續(xù)讀取Z個(gè)Block。
6.根據(jù)權(quán)利要求5所述的啟動(dòng)加載方法,其特征在于,該啟動(dòng)加載方法進(jìn)一步包括: 每當(dāng)從當(dāng)前的起始Block開始連續(xù)讀取Z個(gè)Block后,對(duì)引導(dǎo)程序可執(zhí)行代碼進(jìn)行壞塊檢測(cè)和數(shù)據(jù)校驗(yàn); 當(dāng)檢測(cè)到壞塊或或數(shù)據(jù)校驗(yàn)失敗時(shí),跳轉(zhuǎn)至解析得到的下一個(gè)起始Block開始連續(xù)讀取 Z 個(gè) Block。
7.一種基于NAND FLASH的啟動(dòng)加載裝置,其特征在于,引導(dǎo)程序可執(zhí)行代碼在NANDFLASH中對(duì)應(yīng)的存儲(chǔ)空間的起始Block及包含的Block數(shù)量以配置信息的形式存放在NANDFLASH的BlockO中,該存儲(chǔ)空間包括BlockO之后的多個(gè)連續(xù)Block ;以及,該啟動(dòng)加載裝置包括NAND FLASH控制模塊和配置信息解析模塊,其中: 當(dāng)CPU開始從NAND FLASH啟動(dòng)時(shí),NAND FLASH控制模塊讀取NAND FLASH的BlockO ;當(dāng)從BlockO中讀取到配置信息后,NAND FLASH控制模塊通知配置信息解析模塊,使配置信息解析模塊從配置信息中解析得到引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z,其中Z大于等于I ; 在完成對(duì)配置信息的解析后,NAND FLASH控制模塊從解析得到的起始Block開始連續(xù)讀取Z個(gè)Block、且讀取到的引導(dǎo)程序可執(zhí)行代碼用于引導(dǎo)CPU啟動(dòng)。
8.根據(jù)權(quán)利要求7所述的啟動(dòng)加載裝置,其特征在于,引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的所有Block的物理空間之和,大于該引導(dǎo)程序可執(zhí)行代碼的數(shù)據(jù)大小。
9.根據(jù)權(quán)利要求7所述的啟動(dòng)加載裝置,其特征在于,該啟動(dòng)加載裝置進(jìn)一步包括: ECC糾錯(cuò)模塊,對(duì)讀取的引導(dǎo)程序可執(zhí)行代碼進(jìn)行ECC糾錯(cuò)。
10.根據(jù)權(quán)利要求7至9中任一項(xiàng)所述的啟動(dòng)加載裝置,其特征在于,引導(dǎo)程序可執(zhí)行代碼被復(fù)制為多份存儲(chǔ)在NAND FLASH中,以及,從配置信息中解析得到的存儲(chǔ)空間的起始Block及Block數(shù)量Z包括每份引導(dǎo)程序可執(zhí)行代碼對(duì)應(yīng)的存儲(chǔ)空間的起始Block及Block數(shù)量Z。
11.根據(jù)權(quán)利要求10所述的啟動(dòng)加載裝置,其特征在于,在完成對(duì)配置信息的解析后,配置信息解析模塊先從解析得到位置最靠前的起始Block開始連續(xù)讀取Z個(gè)Block。
12.根據(jù)權(quán)利要求11所述的啟動(dòng)加載裝置,其特征在于,該啟動(dòng)加載裝置進(jìn)一步包括:壞塊檢測(cè)模塊和數(shù)據(jù)校驗(yàn)?zāi)K; 每當(dāng)從當(dāng)前的起始Block開始連續(xù)讀取Z個(gè)Block后,壞塊檢測(cè)模塊和數(shù)據(jù)校驗(yàn)?zāi)K分別對(duì)引導(dǎo)程序可執(zhí)行代碼進(jìn)行壞塊檢測(cè)和數(shù)據(jù)校驗(yàn); 當(dāng)檢測(cè)到壞塊或或數(shù)據(jù)校驗(yàn)失敗時(shí),NAND FLASH控制模塊跳轉(zhuǎn)至解析得到的下一個(gè)起始Block開始連續(xù)讀 取Z個(gè)Block。
【文檔編號(hào)】G06F9/445GK104077167SQ201410332155
【公開日】2014年10月1日 申請(qǐng)日期:2014年7月11日 優(yōu)先權(quán)日:2014年7月11日
【發(fā)明者】趙志宇, 康向艷 申請(qǐng)人:杭州華三通信技術(shù)有限公司