Linux系统平台上指定地址范围分配物理内存的方法

文档序号:6615887阅读:360来源:国知局
专利名称:Linux系统平台上指定地址范围分配物理内存的方法
技术领域
本发明涉及一种内存分配方法,尤其涉及一种Linux系统平台上指定地址 范围分配物理内存的方法。
背景技术
目前,内存测试是硬件诊断方案中一项非常重要的功能,其流程主要由两
部分组成内存分配和测试算法。其中,测试算法规定了读写内存的规则,不
同的测试算法会针对不同的内存错误类型进行检测,现有技术的测试算法的相 关内容在一些内存测试算法的文献中都有专门的介绍,在此不再赘述。内存分
配,是进行内存读写测试的重要前提,它将直接关系到测试效果能否达成,例 如能否测试到真正的物理内存或者是否会重复测试同一块内存等。然而,不 同的操作系统平台管理物理内存的方式有所不同,并没有统一的规则,因此内 存分配是相对比较复杂的,需要针对不同的操作系统平台分别加以考虑。
在Linux操作系统(一种可免费使用的多用户的计算机作业系统)平台上, 由于用户态没有提供分配物理内存的方法,所以现有技术的做法只能通过驱动 程序,在内核(Kernel)中实现分配物理内存的功能,然后对外提供接口。然 而要使分配出的物理内存可以在用户态随意读写,还需要把分配到的物理内存 映像到用户态的虚拟地址空间里,在这一点上现有技术中所使用的原理和方法 都是相似的,在此不再赘述。而其中,主要的不同就在于分配物理内存的方法。
目前现有技术的分配物理内存的方法有
方法一 一种分配指定物理内存页的方法。这种方法可以指定地址范围分 配物理内存,此方法对于内存分配的最小单位为页,页的大小视Linux系统内 核(Kernel)的配置所定。但是此方法每次只能分配一个内存页,效率太低, 而且可能会占用相邻的其它内存页,造成不必要的资源浪费。因此,这种方法 局限性较大,不适用于对大量物理内存的测试。
方法二 直接调用Linux系统内核(Kernel)提供的分配成块的连续物理
4内存的接口。这种方法可以分配大量的物理内存,适用于对大量物理内存的测 试,但此方法的主要缺点是无法指定地址范围进行物理内存的分配(这是由于
Linux系统内核中组织物理内存的数据结构的限制,使其不便于指定地址范围
进行物理内存的分配),因而也就无法用于针对特定的内存单元或者指定插槽 上的内存进行测试。

发明内容
本发明所要解决的技术问题在于提供一种Limix系统平台上指定地址范 围分配物理内存的方法,应用于Liruix操作系统下的物理内存的测试进程中, 此方法可根据所要分配内存的指定地址范围及大小,对系统中大量的物理内存 进行指定地址范围的分配,进而为Linux操作系统下的物理内存的测试提供了 有效的支持。
位实现上述目的,本发明所提供的一种Linux系统平台上指定地址范围分 配物理内存的方法,包含以下步骤
获得所要分配内存的指定地址范围及大小;针对系统中每一个节点 (Node),查看其包含的内存的地址范围是否与指定地址范围有交集;如果有 交集,则对各节点中的每一个页区(Zone),査看其包含的内存的地址范围是 否与指定地址范围有交集;如果仍有交集,则在各页区的每中央处理器页框高 速缓存(Per-CPU Page Frame Cache)和伙伴系统(Buddy System)中的内存 块链表中,查找符合上述大小及指定地址范围要求的内存块;将査找到的内存 块从内存块链表中经拆分后取出;以及在各页区中重复査找符合上述大小及指 定地址范围要求的内存块并将其拆分后取出,直至分配满足了所要求的大小、 或者各页区中已没有符合指定地址范围的内存块、或者各页区的空闲内存已减 少至系统内核安全的下限后,传送所有分配出来的内存块的信息,以用于对内 存进行映像、检测和释放。
综上所述,本发明的优点在于
本发明所提供的一种Linux系统平台上指定地址范围分配物理内存的方 法,可实现指定地址范围的、大量的物理内存的分配,其通过改进整体分配流 程,提供了一次可分配多个内存页/块的功能接口,并利用内核中的数据结构, 改进査找方法,加快査找速度,同时,通过拆分内存块的方法,避免了对多余内存页的占用。因此,不仅结合了现有技术中两种分配物理内存的方法的优点,
同时也克服了它们所具有的缺陷,进而为Linux操作系统下的物理内存的测试 提供了有效的支持。其主要的优点包含分配到的是实际的物理内存;可以指 定地址范围进行分配;可以一次分配大量的内存;不会占用相邻的其它内存页, 因而避免了现有技术中可能造成不必要的资源浪费的问题;可以用于针对特定 的内存单元或者指定插槽上的内存进行测试。
以下结合附图和具体实施例对本发明进行详细描述,但不作为对本发明的 限定。


图1为本发明的伙伴系统中的内存块的结构图2为本发明的一种Linux系统平台上指定地址范围分配物理内存的方法 的方法流程图3为本发明中的内存块按照指定的地址范围的要求分为三种情况的示 意图4为本发明中部分内存页在指定地址范围内的内存块及其拆分进程的 示意图;以及
图5为本发明的方法的一实施例的示意图,图中表示了本发明的伙伴系统 中的内存块在分配前和分配后的情况。 其中,附图标记 10:内存块 20:内存页 101:小内存块
10', 10":拆分后余下的内存块
具体实施例方式
以下,将结合附图部份对本发明的较佳实施方式作详细说明。 在Linux系统中,内核(Kernel)包含了内存管理机制,内存是以页的形 式在系统中存在的,每一个页代表了唯一的一块物理内存,系统通过一个数据 结构来描述这个页的信息,并以阵列的形式按照页在物理内存的位置将页结构存放在一起,并通过一个全局的页结构指针指向阵列的首地址,因此说获得了 阵列首地址,就可以得到内存中的任何一个页结构。当然我们并不能任意的操
作内存中的每一个页,既然Linux系统有它自己的内存管理机制,我们就要在
不损害系统规则的基础上来实现本发明的目标。下面就进一歩说明本发明是如 何实现的。
在Linux系统启动以后,内核(Kernel)会把物理内存分配成多个页,并 将每个页标为已被占用和未被占用(空闲)两种状态,被标为已被占用的页是 被系统内核或是其它硬件及应用程序所占用的,用户是不允许使用的,因为对 它的操作可能会导致整个系统的崩溃,因此我们的分配方法也不允许分配这一 部分的内存,通常这一部分仅占整个内存的一小部分,大约有几十兆,如果这 一部分的内存有问题,通常系统都无法启动,更不用说要对其进行分配及测试 了。在Linux系统中,每个节点(Node)的物理内存被划分为多个块,称为页 区(Zone),它表示内存中的一段区域。页区是用zone结构体描述的,它跟 踪页框使用、空闲区域和锁等信息,页区的类型主要有直接内存存取页区(DMA Zone)、普通页区(NORMAL Zone)和高端页区(HIGHMEM Zone)三种,页区 可以使页面分配更有目的性,有利于减少内存碎片。直接内存存取页区(DMA Zone)位于低端的内存空间,用于某些旧的工业标准结构(ISA)设备。普通 页区(NORMAL Zone)的内存直接映像到Linux系统内核(Kernel)线性地址 空间的高端部分,许多内核(Kernel)操作只能在普通页区(NORMAL Zone) 中进行。
每个页区(Zone)中的未被占用(空闲)页,依照伙伴(Buddy)算法[每 个页区的页分配使用一种伙伴(Buddy)算法,此伙伴算法核心的页分配器引 入了页区结构, 一个页区就是一大块连续的物理页面,伙伴算法将整个页区划 分为以2的整数次幂为单位的各级页块的集合,相邻的同次页块称为伙伴 (Buddy), —对伙伴(Buddy)可以合并到更高次的页面集合中去]链接成一 组链表结构。
Linux系统内核(Kernel)采用上述的节点(Node)、页区(Zone)、页 (Page)等结构来分级管理物理内存,而空闲的内存页主要通过每中央处理器 页框高速缓存(Per-CPU Page Frame Cache)和伙伴系统(Buddy System)中 的链表结构来管理。其中,伙伴系统(Buddy System)中的内存页20,是以2的整数次幂为单位来组织的,即连续的2"个内存页20,组成一个内存块IO, 作为链表的一个元素,统一管理。根据大小,内存块10被串成不同的链表, 其结构图如图1所示。
本发明通过遍历(遍历,英文名称Traversal,是指沿着某条搜索路线, 依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具 体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算 的基础)这些链表(或者查找相关数据结构),找到符合条件的内存块,藉以 实现对指定物理内存的分配。
现在请参考图2,此图为本发明的一种Limix系统平台上指定地址范围分 配物理内存的方法的方法流程图。如图所示,本发明的一种Linux系统平台上 指定地址范围分配物理内存的方法,包含以下步骤
获得所要分配内存的指定地址范围及大小(步骤100);
针对系统中每一个节点(Node),查看其包含的内存的地址范围是否与指 定地址范围有交集(步骤200);
如果有交集,则对各节点中的每一个页区(Zone),查看其包含的内存的 地址范围是否与指定地址范围有交集(步骤300);
如果仍有交集,则在各页区的每中央处理器页框高速缓存(Per-CPU Page Frame Cache)和伙伴系统(Buddy System)中的内存块链表中,査找符合上 述大小及指定地址范围要求的内存块(步骤400);
将査找到的内存块从内存块链表中经拆分后取出(步骤500);以及
在各页区中重复查找符合上述大小及指定地址范围要求的内存块并将其 拆分后取出,直至分配满足了所要求的大小、或者各页区中己没有符合指定地 址范围的内存块、或者各页区的空闲内存已减少至系统内核安全的下限(即能 够保证系统内核安全的最小值)后,传送所有分配出来的内存块的信息,以用 于对内存进行映像、检测和释放(步骤600),其中,传送所有分配出来的内 存块的信息,可通过接口,以阵列方式进行传送。
此外,上述本发明的一种Linux系统平台上指定地址范围分配物理内存的 方法中,于内存块取出之后,还可进一步包含储存分配出来的内存块的信息, 并更新分配状态的步骤(附图中未示出)。
由于在伙伴系统(Buddy System)中,内存页以2的整数次幂(2n)为单位组成内存块,所以,本发明把要分配的大小也分解成2的整数次幂的和,并 在每个页区里,按照指数从大到小的顺序依次分配。例如要分配1048个内
存页,那么1048二21(1+24+23。所以,需要先分配一个2'o大小的内存块。如果分 配成功,则还需要分配的内存页为24=24+23,下一步就要分配1个24大小的内 存块;如果分配失败,则还需要分配的内存页为1048=29X2+24+2:i,下一步就 需要分配2个29大小的内存块。依次类推。如此处理,可以尽量不拆散现有 的内存块,进而保证空闲内存页的连续性,减少对系统性能的影响。
以下,将详细描述本发明的一种Linux系统平台上指定地址范围分配物理 内存的方法,于实现查找符合要求的内存块及拆分内存块时所采用的技术手 段。
(一)、查找符合要求的内存块
如图3所示,其中,R表示指定的地址范围,按照指定的地址范围的要求, 内存块10可分为三种情况(l)内存块中的全部内存页都在指定地址范围内; (2)部分内存页在指定地址范围内;(3)全部内存页都不在指定地址范围内。
上述(1) 、 (2)两种内存块,都是符合地址范围要求的。第(1)种, 全部内存页都在指定地址范围内,可以直接从链表中取出;第(2)种,部分 内存页在指定地址范围内,可以通过拆分,取出符合地址范围要求的小内存块。 因此,这两种内存块都是本发明的方法所要查找的目标。
内存块除了要符合指定的地址范围的要求,还有就是要符合所要分配内存 的大小的要求。本发明模仿现有技术的伙伴系统(Buddy System)中内核己有 的方法査找符合所要分配内存的大小要求的内存块,其顺序是先在与所要求 的大小相同的内存块链表中查找;当无法找到时,再在相比于所要求的大小更 为大的内存块链表中查找(因为大的内存块总是可以拆分成小的内存块)。
在现有技术中,上述査找的具体办法有两种1)遍历内存块链表,这也 是上述现有技术中方法一所采取的方法;2)利用系统内核的数据结构查找(可 能会因内核版本而异,例如在2.6.10版本及之前版本的内核中,每个链表 都有一个对应的位图,用以标明各个伙伴(Buddy)的状态;而在2.6. IO版本 之后的内核里,每个页结构都有字段标明其是否是在伙伴系统中)。上述两种 现有技术的方法各有缺点前者在链表中节点较多时,比较耗时;后者在链表 中元素较少时,效率有可能不如前者。
9本发明的方法系将上述两种方法结合起来使用,选择的原则如下对于 2.6.10版本及之前版本的内核,因为位图的查找速度大于链表,所以总是使
用位图进行査找;对于2.6. IO版本之后的内核,当链表中节点的个数大于指
定地址范围内存在的内存块总数,即链表中节点的个数大于〉(结束地址一
起始地址)/内存块的大小时,将通过页结构中的字段来查找,反之,则使用 链表査找。
(二)、拆分内存块
在上述现有技术的方法一中,对于指定的内存页的分配,会取下内存页所 在的整个内存块,进而平白地占用了与其相邻的其它内存页。本发明的方法则 提出拆分内存块的方法,藉以避免这种不必要的资源浪费。拆分内存块的具体
方法如下
对于全部内存页在指定地址范围内的内存块,如果所要分配的大小比内存 块要小,可以按照现有技术的系统内核中已有的拆分方法进行拆分,并取得第 一个所要分配大小的小内存块。
对于部分内存页在指定地址范围内的内存块,情况会比较复杂,现在请参
考图4,如图所示,R表示指定的地址范围。其具体情况可分为三种a)前半 部分在指定地址范围内;b)后半部分在指定地址范围内;c)中间部分在指定 地址范围内。
假定要在指定地址范围内分配一个设定大小为size的小内存块。在査找 到符合要求的内存块10后,拆分处理方式如下
(1) 如果内存块10中,size大小的第一个小内存块在指定地址范围内, 则可以通过拆分,取出size大小的第一个小内存块。如此,便可以处理全部 和前半部分在指定地址范围内的情况。当然,如果size大小的第一个小内存 块不在指定地址范围内,则无法进行拆分。
(2) 如果内存块10中,size大小的最后一个小内存块在指定地址范围 内,则可以通过拆分,取出size大小的最后一个小内存块101,其中,10', IO"分别为拆分后余下的内存块。如此,便处理了后半部分在指定地址范围内 的情况。
(3) 如果内存块10中,中间部分在指定地址范围内,即指定地址范围的 起、止地址都落在了内存块10中,那么只要针对此内存块IO进行拆分处理即可。处理的方式为将此内存块10不停地拆分,直至找到符合上述(1) 、 (2) 两种情况的内存块,然后再通过拆分,得到要分配的小内存块101,其中,10', IO"分别为拆分后余下的内存块。如此,便处理了中间部分在指定地址范围内 的情况。
拆分的具体方法与现有技术的内核中已有的方法类似,但已有方法只能取 出第一个小内存块。本发明可通过改进拆分进程,取出最后一个小内存块。然 后,将取出第一个小内存块和取出最后一个小内存块的方法相结合,并加入条 件判断,进而可以取出中间部分的任意小内存块。
下面,请参考图5,将通过一个实施例对本发明的技术方案的具体实施进 - 一步加以描述
假设我们要在32M 63M的地址范围内,分配10M的内存。
在本发明的方法中,我们先将指定的地址范围转换成内存页号范围 8192 16127 (假设以4K为一页)。
假设在此Linux系统平台上,Linux内核把所有内存看成一个节点(Node), 而节点中分成三个页区直接内存存取页区(DMA Zone)、普通页区(NORMAL Zone)及高端页区(HIGHMEMZone),这三个页区所对应的页号范围分别为 0 4095, 4096 229375, 229376 362143。如此,只有普通页区(NORMAL Zone) 与指定的地址范围有交集,我们只需要处理这一个页区即可。
10M内存包含的内存页的个数是2560=2"+29。但是,由于伙伴系统(Buddy System)中最大的内存块仅包含2"个页,所以需要将其分解为2560=2inX2+29。
我们先在大小为2"个页的内存块的链表中査找。假设找到一个内存块10, 其对应的页号范围是8192 9215。这一内存块10正好完全在指定的地址范围 内,而且大小也是所要分配的大小,所以可以直接取出。然后,设置相应的内 存页,保存相关信息,并更新分配状态。
由于还有1536二2"+^个页需要分配,所以再次在2"个页的内存块的链表 中查找。假设又找到一个内存块10,其页号范围是15360 16383。此内存块 的部分页在指定地址范围内,但是不能通过拆分得到所要分配的内存块,因此 无法进行分配。而此时,上述21()个页的内存块的链表里,也没有其它符合要 求的内存块了。
这样,我们需要分配的页的个数还是1536=21Q+29。由于2""大小的内存块已经分配完成,所以如此分解1536=29X3,即需要分配3个29大小的内存块。 我们在29个页的内存块的链表里查找。假设没有符合指定地址范围的内 存块,那么就需要到上一级的链表(即2'°个页的内存块的链表)中查找。这 样,就刚好找到了上述那个页号范围是15360 16383的内存块10。此次所要 求的大小是29个页,而这一内存块的第一个29小块,其页号范围是15360 15871,恰好符合要求。因此,可以通过拆分,把其前半部分分配出来,而其
后半部分则可放入下一级的链表中。
接着,在2"个页的内存块的链表里再次査找,便找不到符合要求的内存块了。
此时,还需要分配的页的个数是1024=28X4。依次重复上述进程,直至分 配满足了所要求的大小、或者此页区中己没有符合指定地址范围的内存块、或 者此页区的空闲内存已减少至系统内核安全的下限(即能够保证系统内核安全 的最小值)后,通过接口,以阵列方式传送所有分配出来的内存块的信息,进 而用于对内存进行映像、检测和释放。
当然,本发明还可有其它多种实施例,在不背离本发明精神及其实质的情 况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但 这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
权利要求
1、一种Linux系统平台上指定地址范围分配物理内存的方法,应用于Linux操作系统下的物理内存的测试进程中,其特征在于,该方法包含以下步骤获得所要分配内存的指定地址范围及大小;针对系统中每一个节点,查看其包含的内存的地址范围是否与该指定地址范围有交集;如果有交集,则对所述各节点中的每一个页区,查看其包含的内存的地址范围是否与该指定地址范围有交集;如果仍有交集,则在所述各页区的每中央处理器页框高速缓存和伙伴系统中的内存块链表中,查找符合所述大小及指定地址范围要求的内存块;将查找到的内存块从该内存块链表中经拆分后取出;以及在所述各页区中重复查找符合所述大小及指定地址范围要求的内存块并将其拆分后取出,直至分配满足了所要求的大小、或者所述各页区中已没有符合该指定地址范围的内存块、或者所述各页区的空闲内存已减少至系统内核安全的下限后,传送所有分配出来的内存块的信息,以用于对内存进行映像、检测和释放。
2、 根据权利要求1所述的Linux系统平台上指定地址范围分配物理内存 的方法,其特征在于,符合指定地址范围要求的内存块包含内存块中的全部内存页都在该指定地址范围内的内存块;以及 内存块中的部分内存页在该指定地址范围内的内存块。
3、 根据权利要求1所述的Linux系统平台上指定地址范围分配物理内存 的方法,其特征在于,査找符合所要分配内存的大小要求的内存块系包含如下 步骤先在与所要求的大小相同的内存块链表中查找;以及当无法找到时,再在相比于所要求的大小更为大的内存块链表中査找。
4、 根据权利要求3所述的Linux系统平台上指定地址范围分配物理内存 的方法,其特征在于,该査找方法包含遍历内存块链表以及利用系统内核的 数据结构进行查找。
5、 根据权利要求1所述的Linux系统平台上指定地址范围分配物理内存 的方法,其特征在于,拆分所述内存块包含如下步骤对于全部内存页在该指定地址范围内的内存i央,如果所要分配的大小比内 存块要小,则通过拆分,取得第一个所要分配大小的小内存块;以及对于部分内存页在该指定地址范围内的内存块,如果要在该指定地址范围 内分配一个设定大小的小内存块,则根据在该指定地址范围内的该部分内存页 位于该内存块的前半部分、后半部分或中间部分三种情况进行拆分。
6、 根据权利要求5所述的Linux系统平台上指定地址范围分配物理内存 的方法,其特征在于,根据在该指定地址范围内的该部分内存页位于该内存块 的前半部分、后半部分或中间部分三种情况进行拆分,分别对应于以下三种拆 分处理方式(1) 如果该内存块中,设定大小的第一个小内存块在该指定地址范围内, 则通过拆分,取出该设定大小的第一个小内存块;(2) 如果该内存块中,设定大小的最后一个小内存块在该指定地址范围 内,则通过拆分,取出该设定大小的最后一个小内存块;以及(3) 如果该内存块中,该指定地址范围的起、止地址都落在该内存块中, 则将该内存块不停地拆分,直至找到符合所述(1) 、 (2)两种情况的内存块, 然后再通过拆分,得到要分配的该设定大小的小内存块。
7、 根据权利要求1所述的Linux系统平台上指定地址范围分配物理内存 的方法,其特征在于,于该内存块取出之后,进一步包含储存该分配出来的内 存块的信息,并更新分配状态的步骤。
8、 根据权利要求1所述的Linux系统平台上指定地址范围分配物理内存 的方法,其特征在于,通过接口,以阵列方式传送所有分配出来的内存块的信 息。
全文摘要
本发明公开了一种Linux系统平台上指定地址范围分配物理内存之方法,系应用于Linux操作系统下的物理内存的测试进程中,本方法可根据所要分配内存的指定地址范围及大小,对系统中大量的物理内存进行指定地址范围的分配,而后将分配出来的内存块之信息传送出去,以用于对内存进行映像、检测和释放,进而为Linux操作系统下的物理内存的测试提供了有效的支持。
文档编号G06F12/06GK101470667SQ200710306110
公开日2009年7月1日 申请日期2007年12月28日 优先权日2007年12月28日
发明者刘文涵, 波 武, 陈玄同 申请人:英业达股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1