專利名稱:一種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式設(shè)備技術(shù)領(lǐng)域,尤其涉及一種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的方法及裝置。
背景技術(shù):
嵌入式Linux系統(tǒng)中將Flash(閃存)作為存儲設(shè)備,是一種 較為通用的方法。Flash中既可以存放程序代碼,又可以存放用戶數(shù)據(jù),而且具有掉電不丟失數(shù)據(jù)的特性,因此,應(yīng)用非常廣泛。目前,F(xiàn)lash在實際應(yīng)用中,主要存在如下問題針對一款Linux系統(tǒng)產(chǎn)品使用不同容量Flash的情況,通常需要在嵌入式Linux系統(tǒng)中針對Flash容量做多套驅(qū)動程序,這樣就給版本維護及使用帶來了不便。
發(fā)明內(nèi)容
本發(fā)明解決的技術(shù)問題是提供一種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的方法及裝置,能夠在Linux內(nèi)核中實現(xiàn)不同F(xiàn)lash容量的驅(qū)動。為解決上述技術(shù)問題,本發(fā)明提供了一種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的方法,應(yīng)用于Linux系統(tǒng),所述方法包括
映射虛擬內(nèi)存,對存儲設(shè)備進行第一次探測以得到所述存儲設(shè)備的實際容量;
根據(jù)所述存儲設(shè)備的實際容量重新映射虛擬內(nèi)存,并對所述存儲設(shè)備進行第二次探
測;
添加對應(yīng)的分區(qū)表并注冊。進一步地,所述映射虛擬內(nèi)存的步驟,具體包括
將所述虛擬內(nèi)存分配空間大小的設(shè)置為常量S,且所述常量S的值設(shè)置成所述存儲設(shè)備的前S存儲空間應(yīng)能夠完成探測命令。進一步地,所述第一次探測,具體包括
通過所述Linux內(nèi)核的內(nèi)存技術(shù)設(shè)備(MTD)驅(qū)動的通用Flash接口(CFI接口),得到所述存儲設(shè)備的信息;其中所述存儲設(shè)備的信息中包括所述存儲設(shè)備的實際容量。進一步地,所述添加對應(yīng)的分區(qū)表并注冊的步驟,具體包括
根據(jù)所述存儲設(shè)備的實際容量的值,查看Linux內(nèi)核中是否存在與該值對應(yīng)的分區(qū)表,若存在則將該分區(qū)表則注冊到Linux內(nèi)核中,若不存在則提示加載異常。進一步地,所述方法還包括
在裝載所述存儲設(shè)備的分區(qū)表時,根據(jù)探測得到的所述存儲設(shè)備的實際容量的值,力口載Linux內(nèi)核中相同大小的分區(qū)表。進一步地,所述根據(jù)所述存儲設(shè)備的實際容量重新映射虛擬內(nèi)存,是指將已分配的虛擬內(nèi)存釋放,重新分配所述存儲設(shè)備的實際容量的值相同大小的虛擬內(nèi)存。本發(fā)明還提供了一種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的裝置,所述裝置包括虛擬內(nèi)存分配模塊,用于映射虛擬內(nèi)存,并根據(jù)第一次探測得到的存儲設(shè)備的實際容量重新映射虛擬內(nèi)存;
MTD探測模塊,用于根據(jù)所述虛擬內(nèi)存分配模塊映射的虛擬內(nèi)存對存儲設(shè)備進行第一次探測,將第一次探測得到的所述存儲設(shè)備的實際容量發(fā)送給所述虛擬內(nèi)存分配模塊;并在所述虛擬內(nèi)存分配模塊重新映射虛擬內(nèi)存后,對所述存儲設(shè)備進行第二次探測;
分區(qū)表添加注冊模塊,用于在所述第一次探測和第二次探測完成后,添加對應(yīng)的分區(qū)表并注冊。進一步地,所述虛擬內(nèi)存分配模塊用于,將所述虛擬內(nèi)存分配空間大小的設(shè)置為常量S,且所述常量S的值設(shè)置成所述存儲設(shè)備的前S存儲空間應(yīng)能夠完成探測命令;以及,
根據(jù)第一次探測得到的存儲設(shè)備的實際容量,將已分配的虛擬內(nèi)存釋放,重新分配所述存儲設(shè)備的實際容量的值相同大小的虛擬內(nèi)存。 進一步地,所述MTD探測模塊用于,通過所述Linux內(nèi)核的MTD驅(qū)動的CFI接口,得到所述存儲設(shè)備的信息,其中所述存儲設(shè)備的信息中包括所述存儲設(shè)備的實際容量。進一步地,所述分區(qū)表添加注冊模塊用于,根據(jù)所述存儲設(shè)備的實際容量的值,查看Linux內(nèi)核中是否存在與該值對應(yīng)的分區(qū)表,若存在則將該分區(qū)表則注冊到Linux內(nèi)核中,若不存在則提示加載異常。進一步地,所述裝置還包括自適應(yīng)加載模塊,
所述自適應(yīng)加載模塊用于,在裝載所述存儲設(shè)備的分區(qū)表時,根據(jù)探測得到的所述存儲設(shè)備的實際容量的值,加載Linux內(nèi)核中相同大小的分區(qū)表。綜上所述,本發(fā)明提供了一種在Linux內(nèi)核中Flash容量自適應(yīng)的方案,該方案的實現(xiàn)建立在由所述Linux內(nèi)核的MTD (Memory Technology Devices,內(nèi)存技術(shù)設(shè)備)驅(qū)動層。通過本發(fā)明提出的Flash驅(qū)動二次探測方法,無論Flash容量多大都可以自動實現(xiàn)Flash驅(qū)動加載及對應(yīng)的分區(qū)表加載,從而大大降低了產(chǎn)品的維護成本,提高了產(chǎn)品的靈活性及可靠性。
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中
圖I為本發(fā)明實施例的Flash容量探測流程示意 圖2為本發(fā)明實施例的Flash分區(qū)表結(jié)構(gòu)示意 圖3為本發(fā)明實施例的Flash分區(qū)表的自適應(yīng)裝載流程示意圖。
具體實施例方式本發(fā)明的主要思想在于,在Linux內(nèi)核中實現(xiàn)自動識別Flash容量,并根據(jù)Flash容量自動加載對應(yīng)分區(qū)表,這樣,Linux內(nèi)核中只需要維護一套程序即可以實現(xiàn)不同F(xiàn)lash容量的驅(qū)動,不僅可以節(jié)省維護成本,而且可靠性高。根據(jù)已有技術(shù),MTD加載分區(qū)通??煞譃槿缦氯?br>
第一步根據(jù)內(nèi)核配置初始化虛擬內(nèi)存;該步驟中,配置初始化虛擬內(nèi)存的目的是供探測Flash使用。第二步探測Flash容量;
該步驟是在得知Flash起始地址和Flash容量的前提下完成的。
第三步添加分區(qū)表并注冊。本發(fā)明中,為了實現(xiàn)Flash容量自適應(yīng),主要需要解決兩個問題一是編譯內(nèi)核時Flash容量的指定,這個值通常是通過內(nèi)核配置文件靜態(tài)配置的,本發(fā)明為了實現(xiàn)Flash自適應(yīng)必須要自動獲取而不能通過配置文件在編譯時指定;二是分區(qū)表的自適應(yīng)裝載,通常內(nèi)核所用分區(qū)表只有一個并且空間固定,為實現(xiàn)Flash自適應(yīng)需要根據(jù)具體實際情況獲取的Flash容量并加載不同的分區(qū)。為了實現(xiàn)內(nèi)核中Flash容量自適應(yīng),需要確定內(nèi)核配置文件中的C0NFIG_MTD_PHYSMAP_LEN,也就是Flash起始地址和Flash容量的確定,這個值要自動獲取而不能通過配置文件在編譯時靜態(tài)指定。本發(fā)明為實現(xiàn)自動獲取CONFIG_MTD_PHYSMAP_LEN,采用內(nèi)核中MTD驅(qū)動的CFI(Common Flash Interface,通用Flash接口)接口提前探測Flash信息的方法以確定Flash的實際容量。與現(xiàn)有技術(shù)中CFI加載驅(qū)動前對Flash進行一次掃描探測的情況不同的是,本發(fā)明采用一種特定的探測方法,即對Flash進行兩次探測,第一次探測的目的是獲得Flash芯片的實際容量,第二次探測則是正常的MTD驅(qū)動中的探測。由于探測Flash需要虛擬一段內(nèi)存空間存放命令數(shù)據(jù)用,本發(fā)明第一探測將這段虛擬內(nèi)存空間大小置為一個常量S,目的是只要能保證Flash接口命令能夠正常訪問即可,這樣既能滿足小容量Flash芯片的探測需要又能滿足大容量Flash的探測需要。通過第一次探測,在探測得到Flash的實際容量后,需要根據(jù)Flash容量的值添加對應(yīng)的分區(qū)表并注冊。由于Linux內(nèi)核中分區(qū)表的大小必須和Flash的實際大小保持一致,為保證內(nèi)核中加載的Flash分區(qū)是正確的,本發(fā)明中,最后加載哪個分區(qū)由前面探測到的Flash大小決定。為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚明白,下文中將結(jié)合附圖對本發(fā)明的實施例進行詳細說明。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互任意組合。圖I所示為本發(fā)明實施例的Flash容量探測流程的示意圖。下文中,也將第一次探測稱作試探性探測,第二次探測稱作正常探測。參見圖I,本實施例的Flash容量探測流程主要包括以下步驟
步驟101,初始化虛擬內(nèi)存;
對虛擬內(nèi)存的操作是在內(nèi)核中分配一段虛擬的地址空間,這個地址是探測Flash的前提,該虛擬內(nèi)存分配空間大小強制設(shè)為一常量S,以便探測不同容量大小的Flash時均可使用。其中,該常量S需設(shè)置成滿足以下條件=Flash前S空間應(yīng)足夠完成探測命令。本實施例中,S大小設(shè)為IM (或以上),就能夠探測到所有大于IM的Flash芯片信息。步驟102,調(diào)用MTD探測模塊進行試探性探測,得到Flash實際容量R ;
該步驟首先假定Flash容量為S進行探測,通過Linux內(nèi)核中CFI接口調(diào)用Flash芯片自身的命令對Flash進行控制,F(xiàn)lash芯片會根據(jù)命令返回相應(yīng)的信息。
其中,根據(jù)已有技術(shù),CFI接口調(diào)用命令后,F(xiàn)lash芯片會將自身所有信息都發(fā)送給CFI,其中就包含容量大小。通過這種方法即可獲取實際的Flash容量R,由于此時屬于第一次探測,第一次探測的目的只是獲得實際容量大小。在后續(xù)的第二次探測中將會用到所有其他信息。步驟103 :根據(jù)R重映射虛擬內(nèi)存;
該步驟具體為用實際探測到的Flash大小R修正虛擬內(nèi)存的分配大小,這個修正過程分兩步進行,第一步把步驟I分配的虛擬內(nèi)存S釋放,第二步用R重新分配虛擬內(nèi)存。步驟104 :正常探測; 根據(jù)步驟102探測到的Flash信息進行一次正常探測,正常探測不僅僅得到Flash大小,還需要得到其他Flash信息以便填充內(nèi)核需要的數(shù)據(jù)成員注冊驅(qū)動。步驟105 :兩次探測完成后,本次探測流程結(jié)束。為實現(xiàn)Flash分區(qū)表的正確裝載,本發(fā)明提前將多個對應(yīng)的Flash分區(qū)表都放入內(nèi)核代碼中,由于Linux內(nèi)核中分區(qū)表的大小必須和Flash的實際大小保持一致,為保證內(nèi)核中加載的Flash分區(qū)是正確的,本發(fā)明中,最后加載哪個分區(qū)由前面探測到的Flash大小決定。具體地,分區(qū)表的格式可采用如圖2中所示例的格式。參見圖2,該示例中,共在Flash上劃分了 9個分區(qū),各個分區(qū)之間地址是連續(xù)的。此處只給出了 Flash容量為64M的分區(qū)表劃分,其他Flash大小的分區(qū)與此類似,唯一的區(qū)別就是每個分區(qū)的容量及起始地址不一樣。每個分區(qū)的結(jié)構(gòu)由三個成員構(gòu)成,第一個成員表示分區(qū)的名稱(name),第二個成員是該分區(qū)基于Flash基址的偏移量(offset),第三個成員是單個分區(qū)的大小(size)。
如圖3所示,本發(fā)明實施例的Flash分區(qū)表的自適應(yīng)裝載流程主要包括如下步驟 步驟301,獲得Flash容量R。步驟302,查看現(xiàn)有分區(qū)是否存在與R值匹配的分區(qū)表,如果存在,則執(zhí)行步驟303,否則,執(zhí)行步驟304。步驟303,加載對應(yīng)分區(qū)表,本流程結(jié)束。步驟304,提示無法加載,本流程結(jié)束。此外,本發(fā)明實施例中還提供了一種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的裝置,該裝置主要包括如下模塊
虛擬內(nèi)存分配模塊,用于映射虛擬內(nèi)存,并根據(jù)第一次探測得到的存儲設(shè)備的實際容量重新映射虛擬內(nèi)存;
MTD探測模塊,用于根據(jù)所述虛擬內(nèi)存分配模塊映射的虛擬內(nèi)存對存儲設(shè)備進行第一次探測,將第一次探測得到的所述存儲設(shè)備的實際容量發(fā)送給所述虛擬內(nèi)存分配模塊;并在所述虛擬內(nèi)存分配模塊重新映射虛擬內(nèi)存后,對所述存儲設(shè)備進行第二次探測;
分區(qū)表添加注冊模塊,用于在所述第一次探測和第二次探測完成后,添加對應(yīng)的分區(qū)表并注冊。進一步地,所述虛擬內(nèi)存分配模塊用于,將所述虛擬內(nèi)存分配空間大小的設(shè)置為常量S,且所述常量S的值設(shè)置成所述存儲設(shè)備的前S存儲空間應(yīng)能夠完成探測命令;以及,根據(jù)第一次探測得到的存儲設(shè)備的實際容量,將已分配的虛擬內(nèi)存釋放,重新分配所述存儲設(shè)備的實際容量的值相同大小的虛擬內(nèi)存。進一步地,所述MTD探測模塊用于,通過所述Linux內(nèi)核的MTD驅(qū)動的CFI接口,得到所述存儲設(shè)備的信息,其中所述存儲設(shè)備的信息中包括所述存儲設(shè)備的實際容量。進一步地,所述分區(qū)表添加注冊模塊用于,根據(jù)所述存儲設(shè)備的實際容量的值,查看Linux內(nèi)核中是否存在與該值對應(yīng)的分區(qū)表,若存在則將該分區(qū)表則注冊到Linux內(nèi)核中,若不存在則提示加載異常。進一步地,所述裝置還包括自適應(yīng)加載模塊,
所述自適應(yīng)加載模塊用于,在裝載所述存儲設(shè)備的分區(qū)表時,根據(jù)探測得到的所述存儲設(shè)備的實際容量的值,加載Linux內(nèi)核中相同大小的分區(qū)表。 以上僅為本發(fā)明的優(yōu)選實施案例而已,并不用于限制本發(fā)明,本發(fā)明還可有其他多種實施例,在不背離本發(fā)明精神及其實質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員可根據(jù)本發(fā)明做出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護范圍。顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計算裝置來實現(xiàn),它們可以集中在單個的計算裝置上,或者分布在多個計算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計算裝置可執(zhí)行的程序代碼來實現(xiàn),從而,可以將它們存儲在存儲裝置中由計算裝置來執(zhí)行,并且在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。
權(quán)利要求
1.ー種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的方法,其特征在干,應(yīng)用于Linux系統(tǒng),所述方法包括 映射虛擬內(nèi)存,對存儲設(shè)備進行第一次探測以得到所述存儲設(shè)備的實際容量; 根據(jù)所述存儲設(shè)備的實際容量重新映射虛擬內(nèi)存,并對所述存儲設(shè)備進行第二次探測; 添加對應(yīng)的分區(qū)表并注冊。
2.如權(quán)利要求I所述的方法,其特征在干, 所述映射虛擬內(nèi)存的步驟,具體包括 將所述虛擬內(nèi)存分配空間大小的設(shè)置為常量S,且所述常量S的值設(shè)置成所述存儲設(shè)備的前S存儲空間應(yīng)能夠完成探測命令。
3.如權(quán)利要求I所述的方法,其特征在干, 所述第一次探測,具體包括 通過所述Linux內(nèi)核的內(nèi)存技術(shù)設(shè)備(MTD)驅(qū)動的通用Flash接ロ(CFI接ロ),得到所述存儲設(shè)備的信息;其中所述存儲設(shè)備的信息中包括所述存儲設(shè)備的實際容量。
4.如權(quán)利要求1、2或3所述的方法,其特征在干, 所述添加對應(yīng)的分區(qū)表并注冊的步驟,具體包括 根據(jù)所述存儲設(shè)備的實際容量的值,查看Linux內(nèi)核中是否存在與該值對應(yīng)的分區(qū)表,若存在則將該分區(qū)表則注冊到Linux內(nèi)核中,若不存在則提示加載異常。
5.如權(quán)利要求4所述的方法,其特征在于,所述方法還包括 在裝載所述存儲設(shè)備的分區(qū)表時,根據(jù)探測得到的所述存儲設(shè)備的實際容量的值,カロ載Linux內(nèi)核中相同大小的分區(qū)表。
6.如權(quán)利要求I所述的方法,其特征在干, 所述根據(jù)所述存儲設(shè)備的實際容量重新映射虛擬內(nèi)存,是指將已分配的虛擬內(nèi)存釋放,重新分配所述存儲設(shè)備的實際容量的值相同大小的虛擬內(nèi)存。
7.ー種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的裝置,其特征在于,所述裝置包括 虛擬內(nèi)存分配模塊,用于映射虛擬內(nèi)存,井根據(jù)第一次探測得到的存儲設(shè)備的實際容量重新映射虛擬內(nèi)存; MTD探測模塊,用于根據(jù)所述虛擬內(nèi)存分配模塊映射的虛擬內(nèi)存對存儲設(shè)備進行第一次探測,將第一次探測得到的所述存儲設(shè)備的實際容量發(fā)送給所述虛擬內(nèi)存分配模塊;并在所述虛擬內(nèi)存分配模塊重新映射虛擬內(nèi)存后,對所述存儲設(shè)備進行第二次探測; 分區(qū)表添加注冊模塊,用于在所述第一次探測和第二次探測完成后,添加對應(yīng)的分區(qū)表并注冊。
8.如權(quán)利要求7所述的裝置,其特征在干, 所述虛擬內(nèi)存分配模塊用于,將所述虛擬內(nèi)存分配空間大小的設(shè)置為常量S,且所述常量S的值設(shè)置成所述存儲設(shè)備的前S存儲空間應(yīng)能夠完成探測命令;以及, 根據(jù)第一次探測得到的存儲設(shè)備的實際容量,將已分配的虛擬內(nèi)存釋放,重新分配所述存儲設(shè)備的實際容量的值相同大小的虛擬內(nèi)存。
9.如權(quán)利要求7所述的裝置,其特征在干, 所述MTD探測模塊用于,通過所述Linux內(nèi)核的MTD驅(qū)動的CFI接ロ,得到所述存儲設(shè)備的信息,其中所述存儲設(shè)備的信息中包括所述存儲設(shè)備的實際容量。
10.如權(quán)利要求7所述的裝置,其特征在干, 所述分區(qū)表添加注冊模塊用于,根據(jù)所述存儲設(shè)備的實際容量的值,查看Linux內(nèi)核中是否存在與該值對應(yīng)的分區(qū)表,若存在則將該分區(qū)表則注冊到Linux內(nèi)核中,若不存在則提示加載異常。
11.如權(quán)利要求7、8、9或10所述的裝置,其特征在干,所述裝置還包括自適應(yīng)加載模塊, 所述自適應(yīng)加載模塊用于,在裝載所述存儲設(shè)備的分區(qū)表時,根據(jù)探測得到的所述存儲設(shè)備的實際容量的值,加載Linux內(nèi)核中相同大小的分區(qū)表。
全文摘要
本發(fā)明公開了一種嵌入式系統(tǒng)中存儲設(shè)備容量自適應(yīng)的方法及裝置,應(yīng)用于Linux系統(tǒng),該方法包括映射虛擬內(nèi)存,對存儲設(shè)備進行第一次探測以得到存儲設(shè)備的實際容量;根據(jù)存儲設(shè)備的實際容量重新映射虛擬內(nèi)存,并對存儲設(shè)備進行第二次探測;添加對應(yīng)的分區(qū)表并注冊。采用本發(fā)明,能夠在Linux內(nèi)核中實現(xiàn)不同F(xiàn)lash容量的驅(qū)動;且無論Flash容量多大都可以自動實現(xiàn)Flash驅(qū)動加載及對應(yīng)的分區(qū)表加載,從而降低了產(chǎn)品的維護成本,提高了產(chǎn)品的靈活性及可靠性。
文檔編號G06F12/08GK102799536SQ201110134910
公開日2012年11月28日 申請日期2011年5月24日 優(yōu)先權(quán)日2011年5月24日
發(fā)明者汪旭光, 徐運, 劉金棟, 吳奇 申請人:中興通訊股份有限公司