一种嵌入式系统中存储设备容量自适应的方法及装置的制作方法

文档序号:6424690阅读:176来源:国知局
专利名称:一种嵌入式系统中存储设备容量自适应的方法及装置的制作方法
技术领域
本发明涉及嵌入式设备技术领域,尤其涉及一种嵌入式系统中存储设备容量自适应的方法及装置。
背景技术
嵌入式Linux系统中将Flash(闪存)作为存储设备,是一种 较为通用的方法。Flash中既可以存放程序代码,又可以存放用户数据,而且具有掉电不丢失数据的特性,因此,应用非常广泛。目前,Flash在实际应用中,主要存在如下问题针对一款Linux系统产品使用不同容量Flash的情况,通常需要在嵌入式Linux系统中针对Flash容量做多套驱动程序,这样就给版本维护及使用带来了不便。

发明内容
本发明解决的技术问题是提供一种嵌入式系统中存储设备容量自适应的方法及装置,能够在Linux内核中实现不同Flash容量的驱动。为解决上述技术问题,本发明提供了一种嵌入式系统中存储设备容量自适应的方法,应用于Linux系统,所述方法包括
映射虚拟内存,对存储设备进行第一次探测以得到所述存储设备的实际容量;
根据所述存储设备的实际容量重新映射虚拟内存,并对所述存储设备进行第二次探
测;
添加对应的分区表并注册。进一步地,所述映射虚拟内存的步骤,具体包括
将所述虚拟内存分配空间大小的设置为常量S,且所述常量S的值设置成所述存储设备的前S存储空间应能够完成探测命令。进一步地,所述第一次探测,具体包括
通过所述Linux内核的内存技术设备(MTD)驱动的通用Flash接口(CFI接口),得到所述存储设备的信息;其中所述存储设备的信息中包括所述存储设备的实际容量。进一步地,所述添加对应的分区表并注册的步骤,具体包括
根据所述存储设备的实际容量的值,查看Linux内核中是否存在与该值对应的分区表,若存在则将该分区表则注册到Linux内核中,若不存在则提示加载异常。进一步地,所述方法还包括
在装载所述存储设备的分区表时,根据探测得到的所述存储设备的实际容量的值,力口载Linux内核中相同大小的分区表。进一步地,所述根据所述存储设备的实际容量重新映射虚拟内存,是指将已分配的虚拟内存释放,重新分配所述存储设备的实际容量的值相同大小的虚拟内存。本发明还提供了一种嵌入式系统中存储设备容量自适应的装置,所述装置包括虚拟内存分配模块,用于映射虚拟内存,并根据第一次探测得到的存储设备的实际容量重新映射虚拟内存;
MTD探测模块,用于根据所述虚拟内存分配模块映射的虚拟内存对存储设备进行第一次探测,将第一次探测得到的所述存储设备的实际容量发送给所述虚拟内存分配模块;并在所述虚拟内存分配模块重新映射虚拟内存后,对所述存储设备进行第二次探测;
分区表添加注册模块,用于在所述第一次探测和第二次探测完成后,添加对应的分区表并注册。进一步地,所述虚拟内存分配模块用于,将所述虚拟内存分配空间大小的设置为常量S,且所述常量S的值设置成所述存储设备的前S存储空间应能够完成探测命令;以及,
根据第一次探测得到的存储设备的实际容量,将已分配的虚拟内存释放,重新分配所述存储设备的实际容量的值相同大小的虚拟内存。 进一步地,所述MTD探测模块用于,通过所述Linux内核的MTD驱动的CFI接口,得到所述存储设备的信息,其中所述存储设备的信息中包括所述存储设备的实际容量。进一步地,所述分区表添加注册模块用于,根据所述存储设备的实际容量的值,查看Linux内核中是否存在与该值对应的分区表,若存在则将该分区表则注册到Linux内核中,若不存在则提示加载异常。进一步地,所述装置还包括自适应加载模块,
所述自适应加载模块用于,在装载所述存储设备的分区表时,根据探测得到的所述存储设备的实际容量的值,加载Linux内核中相同大小的分区表。综上所述,本发明提供了一种在Linux内核中Flash容量自适应的方案,该方案的实现建立在由所述Linux内核的MTD (Memory Technology Devices,内存技术设备)驱动层。通过本发明提出的Flash驱动二次探测方法,无论Flash容量多大都可以自动实现Flash驱动加载及对应的分区表加载,从而大大降低了产品的维护成本,提高了产品的灵活性及可靠性。


此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中
图I为本发明实施例的Flash容量探测流程示意 图2为本发明实施例的Flash分区表结构示意 图3为本发明实施例的Flash分区表的自适应装载流程示意图。
具体实施例方式本发明的主要思想在于,在Linux内核中实现自动识别Flash容量,并根据Flash容量自动加载对应分区表,这样,Linux内核中只需要维护一套程序即可以实现不同Flash容量的驱动,不仅可以节省维护成本,而且可靠性高。根据已有技术,MTD加载分区通常可分为如下三步
第一步根据内核配置初始化虚拟内存;该步骤中,配置初始化虚拟内存的目的是供探测Flash使用。第二步探测Flash容量;
该步骤是在得知Flash起始地址和Flash容量的前提下完成的。
第三步添加分区表并注册。本发明中,为了实现Flash容量自适应,主要需要解决两个问题一是编译内核时Flash容量的指定,这个值通常是通过内核配置文件静态配置的,本发明为了实现Flash自适应必须要自动获取而不能通过配置文件在编译时指定;二是分区表的自适应装载,通常内核所用分区表只有一个并且空间固定,为实现Flash自适应需要根据具体实际情况获取的Flash容量并加载不同的分区。为了实现内核中Flash容量自适应,需要确定内核配置文件中的C0NFIG_MTD_PHYSMAP_LEN,也就是Flash起始地址和Flash容量的确定,这个值要自动获取而不能通过配置文件在编译时静态指定。本发明为实现自动获取CONFIG_MTD_PHYSMAP_LEN,采用内核中MTD驱动的CFI(Common Flash Interface,通用Flash接口)接口提前探测Flash信息的方法以确定Flash的实际容量。与现有技术中CFI加载驱动前对Flash进行一次扫描探测的情况不同的是,本发明采用一种特定的探测方法,即对Flash进行两次探测,第一次探测的目的是获得Flash芯片的实际容量,第二次探测则是正常的MTD驱动中的探测。由于探测Flash需要虚拟一段内存空间存放命令数据用,本发明第一探测将这段虚拟内存空间大小置为一个常量S,目的是只要能保证Flash接口命令能够正常访问即可,这样既能满足小容量Flash芯片的探测需要又能满足大容量Flash的探测需要。通过第一次探测,在探测得到Flash的实际容量后,需要根据Flash容量的值添加对应的分区表并注册。由于Linux内核中分区表的大小必须和Flash的实际大小保持一致,为保证内核中加载的Flash分区是正确的,本发明中,最后加载哪个分区由前面探测到的Flash大小决定。为使本发明的目的、技术方案和优点更加清楚明白,下文中将结合附图对本发明的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。图I所示为本发明实施例的Flash容量探测流程的示意图。下文中,也将第一次探测称作试探性探测,第二次探测称作正常探测。参见图I,本实施例的Flash容量探测流程主要包括以下步骤
步骤101,初始化虚拟内存;
对虚拟内存的操作是在内核中分配一段虚拟的地址空间,这个地址是探测Flash的前提,该虚拟内存分配空间大小强制设为一常量S,以便探测不同容量大小的Flash时均可使用。其中,该常量S需设置成满足以下条件=Flash前S空间应足够完成探测命令。本实施例中,S大小设为IM (或以上),就能够探测到所有大于IM的Flash芯片信息。步骤102,调用MTD探测模块进行试探性探测,得到Flash实际容量R ;
该步骤首先假定Flash容量为S进行探测,通过Linux内核中CFI接口调用Flash芯片自身的命令对Flash进行控制,Flash芯片会根据命令返回相应的信息。
其中,根据已有技术,CFI接口调用命令后,Flash芯片会将自身所有信息都发送给CFI,其中就包含容量大小。通过这种方法即可获取实际的Flash容量R,由于此时属于第一次探测,第一次探测的目的只是获得实际容量大小。在后续的第二次探测中将会用到所有其他信息。步骤103 :根据R重映射虚拟内存;
该步骤具体为用实际探测到的Flash大小R修正虚拟内存的分配大小,这个修正过程分两步进行,第一步把步骤I分配的虚拟内存S释放,第二步用R重新分配虚拟内存。步骤104 :正常探测; 根据步骤102探测到的Flash信息进行一次正常探测,正常探测不仅仅得到Flash大小,还需要得到其他Flash信息以便填充内核需要的数据成员注册驱动。步骤105 :两次探测完成后,本次探测流程结束。为实现Flash分区表的正确装载,本发明提前将多个对应的Flash分区表都放入内核代码中,由于Linux内核中分区表的大小必须和Flash的实际大小保持一致,为保证内核中加载的Flash分区是正确的,本发明中,最后加载哪个分区由前面探测到的Flash大小决定。具体地,分区表的格式可采用如图2中所示例的格式。参见图2,该示例中,共在Flash上划分了 9个分区,各个分区之间地址是连续的。此处只给出了 Flash容量为64M的分区表划分,其他Flash大小的分区与此类似,唯一的区别就是每个分区的容量及起始地址不一样。每个分区的结构由三个成员构成,第一个成员表示分区的名称(name),第二个成员是该分区基于Flash基址的偏移量(offset),第三个成员是单个分区的大小(size)。
如图3所示,本发明实施例的Flash分区表的自适应装载流程主要包括如下步骤 步骤301,获得Flash容量R。步骤302,查看现有分区是否存在与R值匹配的分区表,如果存在,则执行步骤303,否则,执行步骤304。步骤303,加载对应分区表,本流程结束。步骤304,提示无法加载,本流程结束。此外,本发明实施例中还提供了一种嵌入式系统中存储设备容量自适应的装置,该装置主要包括如下模块
虚拟内存分配模块,用于映射虚拟内存,并根据第一次探测得到的存储设备的实际容量重新映射虚拟内存;
MTD探测模块,用于根据所述虚拟内存分配模块映射的虚拟内存对存储设备进行第一次探测,将第一次探测得到的所述存储设备的实际容量发送给所述虚拟内存分配模块;并在所述虚拟内存分配模块重新映射虚拟内存后,对所述存储设备进行第二次探测;
分区表添加注册模块,用于在所述第一次探测和第二次探测完成后,添加对应的分区表并注册。进一步地,所述虚拟内存分配模块用于,将所述虚拟内存分配空间大小的设置为常量S,且所述常量S的值设置成所述存储设备的前S存储空间应能够完成探测命令;以及,根据第一次探测得到的存储设备的实际容量,将已分配的虚拟内存释放,重新分配所述存储设备的实际容量的值相同大小的虚拟内存。进一步地,所述MTD探测模块用于,通过所述Linux内核的MTD驱动的CFI接口,得到所述存储设备的信息,其中所述存储设备的信息中包括所述存储设备的实际容量。进一步地,所述分区表添加注册模块用于,根据所述存储设备的实际容量的值,查看Linux内核中是否存在与该值对应的分区表,若存在则将该分区表则注册到Linux内核中,若不存在则提示加载异常。进一步地,所述装置还包括自适应加载模块,
所述自适应加载模块用于,在装载所述存储设备的分区表时,根据探测得到的所述存储设备的实际容量的值,加载Linux内核中相同大小的分区表。 以上仅为本发明的优选实施案例而已,并不用于限制本发明,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员可根据本发明做出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
权利要求
1.ー种嵌入式系统中存储设备容量自适应的方法,其特征在干,应用于Linux系统,所述方法包括 映射虚拟内存,对存储设备进行第一次探测以得到所述存储设备的实际容量; 根据所述存储设备的实际容量重新映射虚拟内存,并对所述存储设备进行第二次探測; 添加对应的分区表并注册。
2.如权利要求I所述的方法,其特征在干, 所述映射虚拟内存的步骤,具体包括 将所述虚拟内存分配空间大小的设置为常量S,且所述常量S的值设置成所述存储设备的前S存储空间应能够完成探测命令。
3.如权利要求I所述的方法,其特征在干, 所述第一次探測,具体包括 通过所述Linux内核的内存技术设备(MTD)驱动的通用Flash接ロ(CFI接ロ),得到所述存储设备的信息;其中所述存储设备的信息中包括所述存储设备的实际容量。
4.如权利要求1、2或3所述的方法,其特征在干, 所述添加对应的分区表并注册的步骤,具体包括 根据所述存储设备的实际容量的值,查看Linux内核中是否存在与该值对应的分区表,若存在则将该分区表则注册到Linux内核中,若不存在则提示加载异常。
5.如权利要求4所述的方法,其特征在于,所述方法还包括 在装载所述存储设备的分区表时,根据探测得到的所述存储设备的实际容量的值,カロ载Linux内核中相同大小的分区表。
6.如权利要求I所述的方法,其特征在干, 所述根据所述存储设备的实际容量重新映射虚拟内存,是指将已分配的虚拟内存释放,重新分配所述存储设备的实际容量的值相同大小的虚拟内存。
7.ー种嵌入式系统中存储设备容量自适应的装置,其特征在于,所述装置包括 虚拟内存分配模块,用于映射虚拟内存,井根据第一次探測得到的存储设备的实际容量重新映射虚拟内存; MTD探测模块,用于根据所述虚拟内存分配模块映射的虚拟内存对存储设备进行第一次探測,将第一次探測得到的所述存储设备的实际容量发送给所述虚拟内存分配模块;并在所述虚拟内存分配模块重新映射虚拟内存后,对所述存储设备进行第二次探測; 分区表添加注册模块,用于在所述第一次探測和第二次探測完成后,添加对应的分区表并注册。
8.如权利要求7所述的装置,其特征在干, 所述虚拟内存分配模块用于,将所述虚拟内存分配空间大小的设置为常量S,且所述常量S的值设置成所述存储设备的前S存储空间应能够完成探測命令;以及, 根据第一次探測得到的存储设备的实际容量,将已分配的虚拟内存释放,重新分配所述存储设备的实际容量的值相同大小的虚拟内存。
9.如权利要求7所述的装置,其特征在干, 所述MTD探测模块用于,通过所述Linux内核的MTD驱动的CFI接ロ,得到所述存储设备的信息,其中所述存储设备的信息中包括所述存储设备的实际容量。
10.如权利要求7所述的装置,其特征在干, 所述分区表添加注册模块用于,根据所述存储设备的实际容量的值,查看Linux内核中是否存在与该值对应的分区表,若存在则将该分区表则注册到Linux内核中,若不存在则提示加载异常。
11.如权利要求7、8、9或10所述的装置,其特征在干,所述装置还包括自适应加载模块, 所述自适应加载模块用于,在装载所述存储设备的分区表时,根据探测得到的所述存储设备的实际容量的值,加载Linux内核中相同大小的分区表。
全文摘要
本发明公开了一种嵌入式系统中存储设备容量自适应的方法及装置,应用于Linux系统,该方法包括映射虚拟内存,对存储设备进行第一次探测以得到存储设备的实际容量;根据存储设备的实际容量重新映射虚拟内存,并对存储设备进行第二次探测;添加对应的分区表并注册。采用本发明,能够在Linux内核中实现不同Flash容量的驱动;且无论Flash容量多大都可以自动实现Flash驱动加载及对应的分区表加载,从而降低了产品的维护成本,提高了产品的灵活性及可靠性。
文档编号G06F12/08GK102799536SQ201110134910
公开日2012年11月28日 申请日期2011年5月24日 优先权日2011年5月24日
发明者汪旭光, 徐运, 刘金栋, 吴奇 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1