嵌入式系统中连续物理内存分配方法和装置的制作方法

文档序号:6581652阅读:226来源:国知局
专利名称:嵌入式系统中连续物理内存分配方法和装置的制作方法
技术领域
本发明涉及计算机技术领域,特别是嵌入式系统中连续物理内存分配方法和装置。
背景技术
在计算机技术中,内存分配,包括连续物理内存分配技术对于计算机性能的影响非常关键。其中,在嵌入式系统驱动上存在很多必须分配连续物理内存的场合,如DMA内存分配或分配连续内存以提高系统性能等。而如果分配不到连续物理内存,可能造成系统异常或者系统性能大大降低。但是,对于嵌入式计算机系统,在其运行一小段时间后,则很难在遍布内存碎片的内存中找到一块指定大小的连续物理内存。 为确保DMA连续内存分配成功,一种现有技术是采用修改嵌入式系统内核的内存管理模块来解决这个问题。比如,2009年7月1日公开的中国发明专利申请第200710306110. 0号。名称为"Li皿x系统平台上指定地址范围分配物理内存的方法"的该专利申请公开了分配指定地址范围和指定大小的物理内存的方法,但由于必须修改嵌入式系统内核的内存管理模块,存在开发时间较长、较复杂的问题,且可能降低系统性能;又比如2005年7月6日公开的中国发明专利第200310110344.X号提出了一种新的内存管理方案,
可减小内存碎片的产生,提高大内存申请的成功率,但同样也存在开发时间较长、较复杂和不能确保分配大的物理内存成功的缺陷;又比如2009年3月11日公开的中国发明专利申请第200710121449. 3号提出一种嵌入式系统内存管理的方法,以回收内存碎片,提高大内存申请的成功率,但也同样存在开发时间长、较复杂和不能确保分配大的物理内存成功的缺陷。 而在非DMA内存分配的场合,在分配连续物理内存失败后,现有技术提出采用非物理连续的内存区分配方法,但这样会造成计算机性能的略微下降。因为采用非物理连续的内存区分配会大大降低页表缓冲(TLB)命中的几率,增加线性地址向物理地址转换的时间。

发明内容
本发明主要解决的技术问题是提供一种嵌入式系统中连续物理内存分配方法和装置,能够确保嵌入式系统驱动中连续物理内存分配成功,并且避免由于申请连续物理内存失败而出现系统异常的情况。
为解决上述技术问题,本发明采用的一个技术方案是提供一种嵌入式系统中连
续物理内存分配方法,包括在所述嵌入式系统的引导加载程序中,将全部物理内存数量与
需分配的连续物理内存数量之差作为参数值设置内核管理内存数量的内核启动参数;在所
述嵌入式系统的驱动中按所述需分配的连续物理内存数量分配所述连续物理内存。 其中,所述嵌入式系统是Li皿X嵌入式系统;所述设置内核管理内存数量的内核
启动参数的步骤包括在Li皿X嵌入式系统的引导加载程序中设置的内核启动参数中加入如下信息mem = C,其中所述C为全部物理内存数量与需分配的连续物理内存数量之差。
其中,在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量分配所述连续物理内存的步骤包括在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量指定所述连续物理内存的物理地址;在所述嵌入式系统的驱动中重映射所述连续物理内存的物理地址为虚拟地址。 其中,在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量指定所述连续物理内存的物理地址的步骤包括在所述嵌入式系统的驱动中通过如下语句来指定所述连续物理内存的物理地址#define REAL_MEM_SIZE 0x2000000 ;u8 *pp_virt_buf = NULL ; dma_addr_t pp_phys_buf ;unsigned int t_size = 0x100000 ;pp_phys_buf = PHYS_OFFSET+(REAL_MEM_SIZE-t_size); 在所述嵌入式系统的驱动中重映射所述连续物理内存的物理地址为虚拟地址的步骤包括在所述嵌入式系统的驱动中通过如下语句来重映射所述连续物理内存的物理地址为虚拟地址 pp_virt_buf = ioremap_nocache(pp_phys_buf,t_size); 其中,在分配所述连续物理内存的步骤之后,包括通过所述引导加载程序的命令修改所述设置内核管理内存数量的内核启动参数的参数值,以改变所述需分配的连续物理内存数量。 其中,在分配所述连续物理内存的步骤之后,包括通过所述引导加载程序的命令去掉所述设置内核管理内存数量的内核启动参数,以释放所述分配的连续物理内存时。
其中,在分配所述连续物理内存的步骤之后,包括将TO_virt_buf作为DMA内存地址发送给所述驱动。 为解决上述技术问题,本发明采用的另一个技术方案是提供一种嵌入式系统中连续物理内存分配装置,包括参数设置单元,用于在所述嵌入式系统的引导加载程序中,将全部物理内存数量与需分配的连续物理内存数量之差作为参数值设置内核管理内存数量的内核启动参数;内存分配单元,用于在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量分配所述连续物理内存。
其中,进一步包括内存改变单元,用于通过所述引导加载程序的命令修改所述设
置内核管理内存数量的内核启动参数的参数值,以改变所述需分配的连续物理内存数量。 其中,进一步包括内存释放单元,用于通过所述引导加载程序的命令去掉所述设
置内核管理内存数量的内核启动参数,以释放所述分配的连续物理内存时。 本发明的有益效果是区别于现有技术采用修改嵌入式系统内核的内存管理模
块、或非物理连续的内存区分配方法来获得连续物理内存而导致开发时间较长、较复杂的
问题、且可能降低系统性能的情况,本发明实施例主要利用大多数嵌入式系统的内核能接
收其引导加载程序传入的内核启动参数、并根据该参数配置内核的特点,在所述嵌入式系
统的引导加载程序中设置内核管理内存数量的内核启动参数,以方便按所述需分配的连续
物理内存数量分配所述连续物理内存,由于内核启动参数中设置的内核管理内存数量之外的剩余内存不会被嵌入式系统的内核使用到,因此能保证连续物理内存分配的成功,巧妙地、根本地解决现有技术长期无法确保进行连续物理内存分配成功的技术问题,使申请者可以随时申请到指定大小的连续物理内存,并且避免由于申请连续物理内存失败而出现系统异常的情况以及系统性能的下降。 此外,对于各种嵌入式系统,其大部分引导加载程序都有提供设置内核启动参数的命令,也就是说,通过本发明一个实施例,只要使用引导加载程序提供的设置内核启动参数的命令,不需要修改任何引导加载程序或嵌入式系统内核的源码,就可以实现随时分配指定大小的连续物理内存、改变内存大小或释放已分配内存的目的。


图1是本发明嵌入式系统中连续物理内存分配方法实施例一的流程 图2是本发明嵌入式系统中连续物理内存分配方法实施例二的流程 图3是本发明嵌入式系统中连续物理内存分配装置实施例一的原理框 图4是本发明嵌入式系统中连续物理内存分配装置实施例二的原理框图。
具体实施例方式
在一些嵌入式系统应用中,由于驱动分配不到连续物理内存,其结果可能就是系统异常或者系统性能大大降低。传统上,系统开发者可能会采用其他降低性能的方法来规避这个问题或采用修改内核中内存管理模块代码来彻底解决这个问题。本发明提供的方法具有如下优点能彻底解决该问题、不会降低系统性能,更重要的是在嵌入式系统上实施时简单易行,且更具有灵活性。 下面以嵌入式Linux系统为例进行详细说明,但本发明实施例所称的嵌入式系统并不限于Li皿x系统,在其他如Windows类型的嵌入式系统中,也同理可以实现,其差异在于各嵌入式系统的系统设置、软件设计等方面,但这些差异不影响本领域技术人员根据本发明精神将本发明实施例进行广泛应用于这些嵌入式系统中。 嵌入式Linux系统一般由引导加载程序(Bootloader) 、 Linux内核(kernel)、驱
动(加载后也属于内核的一部分)、根文件系统以及应用程序几部分构成。 在本发明一个实施例中,主要利用Li皿x内核能接收Bootloader传入的内核启动
参数,并根据该参数配置内核的特征,包括使用的物理内存大小进行系统设置。但据了解,
现有技术一般都采用该特征来传入根文件系统所在分区、初始化程序所在路径等信息,面
对长期无法确保进行连续物理内存的分配的技术问题,现有技术未能巧妙利用上述特征,
以解决分配连续物理内存出错的问题。 对于各种嵌入式系统,其大部分Bootloader都有提供设置内核启动参数的命令,也就是说,通过本发明一个实施例,不需要修改任何Bootloader或Linux内核的源码,就可以实现随时分配指定大小的连续物理内存的目的。当需要的内存大小发生改变时,只需要通过Bootloader提供的命令,修改内核启动参数并修改驱动就可以达到目的。
以下详细描述本发明各个实施例 参阅图l,本发明嵌入式系统中连续物理内存分配方法实施例包括 步骤101 :在所述嵌入式系统的引导加载程序中,将全部物理内存数量与需分配的连续物理内存数量之差作为参数值设置内核管理内存数量的内核启动参数; 所述全部物理内存数量可以是系统总内存数量,而全部物理内存数量与需分配的
连续物理内存数量之差即为嵌入式系统内核能够管理的内存数量;也就是说,在分配内存
时,内核管理内存数量的内核启动参数并不设置为全部内存数量,而是设一个较小的值,而
全部物理内存数量与内核管理内存数量之差即为需分配的连续物理内存数量; 步骤102 :在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量分配所
述连续物理内存。 这里利用嵌入式系统的内核能接收其引导加载程序传入的内核启动参数的特点, 根据该内核启动参数配置连续物理内存。 区别于现有技术采用修改嵌入式系统内核的内存管理模块、或非物理连续的内存 区分配方法来获得连续物理内存而导致开发时间较长、较复杂的问题、且可能降低系统性 能的情况,本发明实施例主要利用大多数嵌入式系统的内核能接收其引导加载程序传入的 内核启动参数、并根据该参数配置内核的特点,在所述嵌入式系统的引导加载程序中设置 内核管理内存数量的内核启动参数,以方便按所述需分配的连续物理内存数量分配所述连 续物理内存,由于内核启动参数中设置的内核管理内存数量之外的剩余内存不会被嵌入式 系统的内核使用到,因此能保证连续物理内存分配的成功,巧妙地、根本地解决现有技术长 期无法确保进行连续物理内存分配成功的技术问题,使申请者可以随时申请到指定大小的 连续物理内存,并且避免由于申请连续物理内存失败而出现系统异常的情况以及系统性能 的下降。 在本发明一实施例中,所述嵌入式系统是Li皿x嵌入式系统;所述设置内核管理 内存数量的内核启动参数的步骤包括在Li皿X嵌入式系统的引导加载程序中设置的内核 启动参数中加入如下信息mem = C,其中所述C为全部物理内存数量与需分配的连续物理 内存数量之差。 如设置内核启动参数为"noinitrd root = /dev/mtdblock3 init = / li皿xrcmem = 31M console = ttySAC0"。其中31M即为内核管理内存数量。
在本发明另一实施例中,在所述嵌入式系统的驱动中按所述需分配的连续物理内 存数量分配所述连续物理内存的步骤可以包括 1)在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量指定所述连续 物理内存的物理地址; 2)在所述嵌入式系统的驱动中重映射所述连续物理内存的物理地址为虚拟地址。
详细如下 1)在所述嵌入式系统的驱动中通过如下语句来指定所述连续物理内存的物理地 址 #define REAL_MEM_SIZE 0x2000000 ; u8 *pp_virt_buf = NULL ; dma_addr_t pp_phys_buf ;unsigned int t_size = 0x100000 ;pp_phys_buf = PHYS_OFFSET+(REAL_MEM_SIZE-t_size); 2)在所述嵌入式系统的驱动中通过如下语句来重映射所述连续物理内存的物理地址为虚拟地址 pp_virt_buf = ioremap_nocache(pp_phys_buf,t_size); 在本发明一实施例中,在分配所述连续物理内存的步骤之后,可以进一步包括步 骤 通过所述引导加载程序的命令修改所述设置内核管理内存数量的内核启动参数 的参数值,以改变所述需分配的连续物理内存数量。 同样是在不修改内核和驱动源码的情况下,简单方便地改变连续物理内存的大 小。 在本发明一实施例中,在分配所述连续物理内存的步骤之后,可以进一步包括步 骤 通过所述引导加载程序的命令去掉所述设置内核管理内存数量的内核启动参数, 以释放所述分配的连续物理内存时。 同样是在不修改内核和驱动源码的情况下,简单方便地对已分配连续物理内存进 行释放。 分配了连续物理内存之后,就可以为驱动等程序利用了,比如在分配所述连续物 理内存的步骤之后,包括步骤 将TO_virt_buf作为DMA内存地址发送给所述驱动。 参阅图2,下面以在一块32MByte的内存上实现一种随时都能成功分配一块 1MByte的连续物理内存的方法为例来描述本发明的其中一个具体实施方式

首先,在u-boot、 vivi等嵌入式引导加载程序中设置的内核启动参数中加入如 下信息mem = 31M,如"noinitrd root = /dev/mtdblock3init = /li皿xrcmem = 31M console = ttySAC0"。内核接收到该启动参数后将会只会管理32M内存中的前31M内存, 最后的1M内存将会一直为需要的程序保留着;其次,在驱动中通过如下语句来分配上述的1Mbyte的内存,由于这1M内存Linux
内核不会使用到,故能保证分配的成功。 #define REAL_MEM_SIZE 0x2000000〃32M u8 *pp_virt_buf = NULL ; dma_addr_t pp_phys_buf ;unsigned int t_size = 0x100000 ;〃32M i)p_phys_buf = PHYS_0FFSET+(REAL_MEM_SIZE_t_size) ;〃PHYS_0FFSET为物理 内存的起始物理地址,TO_phys_buf为分配的物理地址 pp_virt_buf = ioremap _nocache (pp_phys_buf , t_size);〃重映射为虚拟地址
最后,可以将卯—virt—buf作为DMA内存地址用于驱动中需要IM的连续内存的地 方。 由整个实施过程可见,此方法相当简单灵活。当不需要分配连续物理内存时,可通 过Bootloader的命令修改内核启动参数(去掉mem = *),而不需要修改任何代码,且不影 响系统的性能。 参阅图3,本发明还提供一种嵌入式系统中连续物理内存分配装置实施例,包括
参数设置单元,用于在所述嵌入式系统的引导加载程序中,将全部物理内存数量
8与需分配的连续物理内存数量之差作为参数值设置内核管理内存数量的内核启动参数;
内存分配单元,用于在所述嵌入式系统的驱动中按所述需分配的连续物理内存数 量分配所述连续物理内存。 同理,利用大多数嵌入式系统的内核能接收其引导加载程序传入的内核启动参 数、并根据该参数配置内核的特点,本发明嵌入式系统中连续物理内存分配装置实施例能 够在不需要修改任何代码、且不影响系统的性能的前提下简单灵活地进行连续物理内存分 配,由于内核启动参数中设置的内核管理内存数量之外的剩余内存不会被嵌入式系统的内 核使用到,因此保证其分配成功。 参阅图4,在其他实施例中,还可以进一步包括 内存改变单元,用于通过所述引导加载程序的命令修改所述设置内核管理内存数 量的内核启动参数的参数值,以改变所述需分配的连续物理内存数量。
以及进一步包括 内存释放单元,用于通过所述引导加载程序的命令去掉所述设置内核管理内存数 量的内核启动参数,以释放所述分配的连续物理内存时。 所述嵌入式系统中连续物理内存分配装置可以是嵌入式计算机的主机或主机中 的处理器。 以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发 明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技 术领域,均同理包括在本发明的专利保护范围内。
9
权利要求
一种嵌入式系统中连续物理内存分配方法,其特征在于,包括在所述嵌入式系统的引导加载程序中,将全部物理内存数量与需分配的连续物理内存数量之差作为参数值设置内核管理内存数量的内核启动参数;在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量分配所述连续物理内存。
2. 根据权利要求1所述的方法,其特征在于 所述嵌入式系统是Li皿X嵌入式系统;所述设置内核管理内存数量的内核启动参数的步骤包括在Li皿X嵌入式系统的引导加载程序中设置的内核启动参数中加入如下信息mem = C,其中所述C为全部物理内存数 量与需分配的连续物理内存数量之差。
3. 根据权利要求2所述的方法,其特征在于在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量分配所述连续物理内存的步骤包括在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量指定所述连续物理内存的物理地址;在所述嵌入式系统的驱动中重映射所述连续物理内存的物理地址为虚拟地址。
4. 根据权利要求3所述的方法,其特征在于在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量指定所述连续物理内 存的物理地址的步骤包括在所述嵌入式系统的驱动中通过如下语句来指定所述连续物理 内存的物理地址#define REAL_MEM_SIZE 0x2000000 ;u8 *pp_virt_buf = NULL ;dma_addr_t pp_phys_buf ;unsigned int t_size = 0x100000 ;pp_phys_buf = PHYS_OFFSET+(REAL_MEM_SIZE-t_size);在所述嵌入式系统的驱动中重映射所述连续物理内存的物理地址为虚拟地址的步骤 包括在所述嵌入式系统的驱动中通过如下语句来重映射所述连续物理内存的物理地址为虚拟地址pp_virt_buf = ioremap_nocache(pp_phys_buf, t_size)。
5. 根据权利要求1至4任一项所述的方法,其特征在于,在分配所述连续物理内存的步骤之后,包括通过所述引导加载程序的命令修改所述设置内核管理内存数量的内核启动参数的参 数值,以改变所述需分配的连续物理内存数量。
6. 根据权利要求1至4任一项所述的方法,其特征在于,在分配所述连续物理内存的步骤之后,包括通过所述引导加载程序的命令去掉所述设置内核管理内存数量的内核启动参数,以释 放所述分配的连续物理内存时。
7. 根据权利要求4所述的方法,其特征在于,在分配所述连续物理内存的步骤之后,包括将TO_virt_buf作为DMA内存地址发送给所述驱动。
8. —种嵌入式系统中连续物理内存分配装置,其特征在于,包括 参数设置单元,用于在所述嵌入式系统的引导加载程序中,将全部物理内存数量与需分配的连续物理内存数量之差作为参数值设置内核管理内存数量的内核启动参数;内存分配单元,用于在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量分 配所述连续物理内存。
9. 根据权利要求8所述的装置,其特征在于,进一步包括内存改变单元,用于通过所述引导加载程序的命令修改所述设置内核管理内存数量的 内核启动参数的参数值,以改变所述需分配的连续物理内存数量。
10. 根据权利要求9所述的装置,其特征在于,进一步包括内存释放单元,用于通过所述引导加载程序的命令去掉所述设置内核管理内存数量的 内核启动参数,以释放所述分配的连续物理内存时。
全文摘要
本发明公开了一种嵌入式系统中连续物理内存分配方法和装置。所述方法包括在所述嵌入式系统的引导加载程序中,将全部物理内存数量与需分配的连续物理内存数量之差作为参数值设置内核管理内存数量的内核启动参数;在所述嵌入式系统的驱动中按所述需分配的连续物理内存数量分配所述连续物理内存。本发明能够确保嵌入式系统驱动中连续物理内存分配成功,并且避免由于申请连续物理内存失败而出现系统异常的情况。
文档编号G06F9/445GK101706754SQ200910192199
公开日2010年5月12日 申请日期2009年9月8日 优先权日2009年9月8日
发明者施金前, 蔡怀琳 申请人:厦门敏讯信息技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1