Linux系统下物理内存的测试方法

文档序号:81344阅读:379来源:国知局
专利名称:Linux系统下物理内存的测试方法
技术领域
本发明涉及一种物理内存的测试方法,尤其涉及一种应用于Linux操作系统下的物理内存的测试方法。
背景技术
在Linux系统(一种可免费使用的多用户的计算机操作系统)核心(Kernel)中,内存的最小单位是页,这有利于系统对内存的管理,用户所使用的内存地址是线性地址,它同物理地址之间的转换是通过两级或是三级页表的映像来实现的,这种多级页表的映像可以大大降低页表本身所占用的内存的大小。在Linux系统中,用户通常的使用内存的方法是调用系统提供的标准接口函数来分配和释放内存,但是通过这种方式返回的内存地址都是线性地址(或称为虚拟地址),并不是实际的物理地址,这种设计是同处理器本身的特性密不可分的。虽然每一个线性地址都对应着一个实际的物理地址,我们也可以通过线性地址转化为物理地址,而且对于此线性地址的读写就是对相应的物理内存的读写,但是这无法满足用户指定对某个物理地址进行读写操作的需求,因为Linux系统提供的内存分配函数只能满足用户在内存空间上的需求,而无法满足在内存位置上的需求。这就需要我们提供一种对指定物理内存进行读写操作的方法。
目前,我们所使用的计算机的物理内存通常只有几百兆字节(MB)的物理空间,例如256MB或512MB的物理内存空间,而在实际开发Linux系统应用程序时,每个开发进程都可以拥有自己的4GB的内存空间,这是为什么呢?这首先要从Linux系统核心(Kernel)所工作的内存模式说起,因为Linux系统核心(Kernel)工作于虚拟内存模式,即每一个虚拟页对应一个相应的系统内存的物理页,虚拟页和物理页之间的地址转换由硬件的页表来完成,对于一个特定的虚拟页,根据一条页表记录可以找到对应的物理页,或者是此页无法找到的提示(说明存在一个页错误)。
正是基于上述的″虚拟到物理″的页映像原理,Linux系统核心通过内存管理单元,将其虚拟内存映像到物理内存,并当系统所需的物理内存不足时,通过将暂时不用的物理内存中的数据资料交换到计算机硬盘上,当系统再次用到这些数据资料时再从计算机硬盘中交换回来,从而实现了扩展物理内存空间的目的。
但是上述这种″虚拟到物理″的页映像不总是一一对应的多个虚拟页(被不同的进程共享的页)有可能同时指向同一个物理页。在这种情况下,每个共享进程的页表记录将具有指向对应物理页的映像。如果有类似这样的情况,当系统核心想要释放特定的物理页时,事情会变得非常复杂,因为它必须遍历(遍历,英文名称Traversal,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算的基础)所有的进程页表记录来查找指向这个物理页的引用,系统核心只能在引用数达到0(count=0)时才能释放这个物理页,因为它没有别的办法可以知道是不是还存在实际指向这个页的引用。这样当系统负载较高时会让虚拟内存变得非常慢。
当前,我们在生产线上使用内存测试工具测试内存的现有方法是在虚拟内存中分配尽可能多的虚空间,对其进行各种内存算法的测试,然而虚拟内存具体映像到的是真正的物理内存还是硬盘的交换分区,检测人员都不能清楚地知悉。
因此,现有的用于Linux系统平台下的物理内存的测试方法,虽然其测试程序实现起来非常简便,但是其测试方法的缺点在于由于使用系统提供的函数来分配内存,这些函数受到自身保护机制的限制,无法将系统中的空闲内存全部分配出来,因此其测试涵盖率低,根本无法对操作系统和测试程序本身所占用的系统物理内存进行检测;此外,也无法保障分配出来的内存在物理上是连续的;而且,经生产线使用发现,目前现有的内存测试方法很难测出物理内存的实际问题,即使发现问题,由于分配返回的内存地址是线性地址,检测人员也不知道内存真正出错或发生问题的实际物理位置。

发明内容为了解决上述现有技术中的问题与缺陷,本发明的目的在于提供一种Linux系统下物理内存的测试方法,利用一个Linux操作系统下的字符设备驱动程序激活一个字符设备,用户只需通过Linux提供的对档案的作业函数,就可以实现在用户层对指定物理内存的读写操作。该种方法对于内存分配的最小单位为页,页的大小视Linux系统核心(Kernel)的配置所定。除去系统自身保留的内存以及其它应用程序(包含测试程序本身)所占用的内存,可以直接访问到所有剩余的物理内存并进行测试,因此可以大大提高测试的涵盖率及准确性。
本发明所提供的一种Linux系统下物理内存的测试方法,应用于Linux操作系统下的物理内存的检测过程中,此方法包含以下步骤激活一个字符设备驱动程序,以驱动一个字符设备对一个物理内存的物理页进行分配与释放;当字符设备成功激活后,以页为单位,按照物理内存的物理地址遍历整个物理内存;判断遍历是否完成,如果完成,则关闭字符设备,否则,通过Linux系统提供的档案作业函数设定所要访问的物理内存的物理地址;当成功设定所要访问的物理内存的物理地址后,通过Linux系统提供的档案作业函数将物理内存映像至用户空间;当物理内存被成功映像至用户空间后,通过内存检测算法对物理内存进行测试;通过Linux系统提供的档案作业函数解除物理内存与用户空间的映像关系;以及,通过Linux系统提供的档案作业函数释放字符设备中所储存的讯息,并继续以页为单位,按照物理内存的物理地址遍历整个物理内存,直至遍历完成。
综上所述,本发明的优点在于本发明提供了一种在Linux系统平台下,通过直接访问物理内存进行内存测试的方法。该方法借助于Linux系统核心(Kernel)的源代码对外开放的特性,并通过一个Linux操作系统下的字符设备驱动程序以及Linux系统提供的对档案的作业函数,便可深入到系统核心(Kernel)内部直接访问物理内存,并执行各种内存检测算法的测试。
因此,本发明的一种Linux系统下物理内存的测试方法与现有技术相比,其优点在于本发明的内存测试方法的测试涵盖率高,除了系统核心及应用程序所占用的少量系统物理内存无法检测以外,本方法可对系统中其余的物理内存直接进行访问和检测,并可使测试人员清楚地知道所检测内存的确切物理位置,且按照此内存的物理地址进行测试,从而可方便准确地找到内存真正出错或发生问题的实际物理位置。此外,本发明的方法是在32/64位(bit)保护模式下实现的,因此检测效率较高。
图1为本发明的一种Linux系统下物理内存的测试方法的方法流程图;图2为本发明的测试方法中的字符设备对物理内存的物理页进行分配的方法流程图;图3为本发明的测试方法中的字符设备对物理内存的物理页进行释放的方法流程图;图4为本发明的测试方法中所测试的物理内存的页结构示意图;以及图5为本发明的测试方法中每个页区中的未被占用页依照伙伴算法链接而成的结构示意图。
其中,附图标记步骤100 激活字符设备驱动程序步骤101 判断字符设备是否成功激活步骤102 以页为单位按照物理内存的物理地址遍历整个物理内存步骤103 判断遍历是否完成步骤104 通过ioctl函数设定所要访问的物理内存的物理地址步骤105 判断设定是否成功步骤106 通过mmap函数将物理内存映像至用户空间步骤107 判断映像是否成功步骤108 通过内存检测算法对物理内存进行测试步骤109 通过munmap函数解除此映像关系步骤110 通过ioctl函数释放字符设备中储存的讯息步骤111 关闭字符设备步骤200 获得所要分配的物理内存的物理地址步骤201 将此物理地址转换为其所存在的页结构步骤202 判断此页是否被占用步骤203 获取此页所在的页区结构步骤204 判断此页是否存在于其页区的伙伴算法结构中步骤205 对此页区的伙伴算法结构的访问加锁步骤206 从此页区的伙伴算法链表中移出此页所存在的成员步骤207 对此页区的伙伴算法结构的访问开锁步骤208 将此页映像到用户空间步骤209 返回出错讯息步骤300 获得所要释放的物理内存的物理地址步骤301 将此物理地址转换为其所存在的页结构步骤302 判断所要释放的页是否已经被分配步骤303 获取此页所在的页区结构步骤304 对此页区的伙伴算法结构的访问加锁步骤305 向此页区的伙伴算法链表中加入此页所存在的成员步骤306 对此页区的伙伴算法结构的访问开锁步骤307 返回释放已成功的讯息步骤308 返回出错讯息具体实施方式
以下,将结合附图对本发明的较佳实施方式作详细说明。
请参考图1,图1为本发明的一种Linux系统下物理内存的测试方法的方法流程图。如图所示,本发明的一种Linux系统下物理内存的测试方法整体包含以下步骤激活一个字符设备驱动程序,以驱动一个字符设备对一个物理内存的物理页进行分配与释放(步骤100),Linux系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种,字符设备是指存取时没有高速缓存的设备,典型的字符设备包含鼠标,键盘,串行口等;判断字符设备是否成功激活(步骤101),如果否,则终止本测试进程,如果字符设备成功激活,则以页为单位,按照物理内存的物理地址遍历整个物理内存(步骤102);判断遍历是否完成(步骤103),如果完成,则关闭字符设备(步骤111),否则,通过Linux系统提供的档案作业函数(即ioctl函数)设定所要访问的物理内存的物理地址(步骤104),其中ioctl函数非常庞杂,它可以控制各种档案的属性,它用于控制特殊档案的底层设备参数,这些特殊档案通常是指终端、套接字和接口,ioctl函数是设备驱动程序中对设备的I/O信道进行管理的函数,所谓对I/O信道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等,ioctl函数是档案结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O信道;判断设定所要访问的物理内存的物理地址是否成功(步骤105),如果否,则返回步骤102,继续以页为单位,按照物理内存的物理地址遍历整个物理内存,如果成功设定所要访问的物理内存的物理地址,则通过Linux系统提供的档案作业函数(即mmap函数)将物理内存映像至用户空间(步骤106),Linux系统提供了对进程内存管理进行支持的函数,主要包含了mmap函数和munmap函数等对进程的虚拟块堆(avl)数进行管理的函数,mmap函数,或者称为“内存映像函数”,首先,它可以映像任何位置的内存,而不单单只局限于进程,其次,它不仅可以将虚拟地址映像到物理的随机存取内存(RAM)或者交换分区(swap),还可以将它们映像到档案和档案位置,这样,读写内存将对档案中的资料进行读写,不过在这里,我们只需关心mmap函数向进程添加被映像的物理内存的能力,munmap函数所做的事情恰好与mmap函数相反,其用以解除内存的映像,即用以释放落在从某一地址开始,长度为一定空间内的物理内存所对应的虚空间;判断物理内存是否被成功映像至用户空间(步骤107),如果否,则返回步骤102,如果是,则通过内存检测算法对物理内存进行测试(步骤108),其中内存检测算法是指通过向内存中写入特定的数值,然后再读出此数值进行比对从而实现内存测试的各种内存检测算法,内存检测算法是通过Linux系统提供的insmod命令将执行此算法的驱动程序模块动态加载到系统核心上实现的,这些均为现有技术,在此不再赘述;通过Linux系统提供的档案作业函数(即munmap函数)解除此物理内存与用户空间的映像关系(步骤109);以及通过Linux系统提供的档案作业函数(即ioctl函数)释放字符设备中所储存的讯息(步骤110),然后返回步骤102,继续以页为单位,按照物理内存的物理地址遍历整个物理内存,直至遍历完成。
现在请参考图2,此图为本发明的测试方法中的字符设备对物理内存的物理页进行分配的方法流程图,如图所示,其分配进程还包含如下步骤获得所要分配的物理内存的物理地址(步骤200);将此物理地址转换为其所存在的页结构(步骤201);判断此页是否被系统核心或其它硬件及应用程序所占用(步骤202),如果被占用则返回出错讯息(步骤209)后终止分配进程,如果未被占用则获取此页所在的页区(zone)结构(步骤203);判断此页是否存在于其页区(zone)的伙伴(buddy)算法结构中(步骤204),如果此页不存在于其页区(zone)的伙伴(buddy)算法结构中,则返回出错讯息(步骤209)后终止分配进程,否则,对此页区的伙伴(buddy)算法结构的访问加锁(步骤205);从此页区的伙伴(buddy)算法链表中移出此页所存在的成员(步骤206);对此页区的伙伴(buddy)算法结构的访问开锁(步骤207);以及将此页映像到用户空间(步骤208),然后终止分配进程。
现在请参考图3,此图为本发明的测试方法中的字符设备对物理内存的物理页进行释放的方法流程图,如图所示,其释放进程还包含如下步骤获得所要释放的物理内存的物理地址(步骤300);将此物理地址转换为其所存在的页结构(步骤301);判断所要释放的页是否已经被分配(步骤302),如果未被分配则返回出错讯息(步骤308)后终止释放进程,如果已被分配则获取此页所在的页区(zone)结构(步骤303);对此页区的伙伴(buddy)算法结构的访问加锁(步骤304);向此页区的伙伴(buddy)算法链表中加入此页所存在的成员(步骤305);对此页区的伙伴(buddy)算法结构的访问开锁(步骤306);以及返回释放已成功的讯息(步骤307),然后终止释放进程。
在Linux系统中,核心(Kernel)包含了内存管理机制,内存是以页的形式在系统中存在的,每一个页代表了唯一的一块物理内存,系统通过一个数据结构来描述这个页的信息,并以链表的形式按照页在物理内存的位置将每个页结构链接在一起,并通过一个全局的页结构指针指向链表的头,因此说获得了链表头,就可以得到内存中的任何一个页结构。当然我们并不能任意的操作内存中的每一个页,既然Linux系统有它自己的内存管理机制,我们就要在不损害系统规则的基础上来实现本发明的目标。下面就进一步说明本发明是如何实现的。
在Linux系统启动以后,核心(Kernel)会把物理内存分成多个页,并将每个页标为已被占用(reserved)和未被占用(unreserved)两种状态,被标为已被占用(reserved)的页是被系统核心或是其它硬件及应用程序所占用的,用户是不允许使用的,因为对它的操作可能会导致整个系统的崩溃,因此我们的测试程序也不允许测试这一部分的内存,通常这一部分只占整个内存的一小部分,大约有几十兆,如果这一部分的内存有问题,通常系统都无法启动,更不用说要运行本发明的测试程序了,请详见图4,此图为本发明的测试方法中所测试的物理内存的页结构示意图,如图所示,本发明能够测试的就是那些被标为未被占用(unreserved)的页。如下表所示,在Linux系统中,物理内存被划分为三个页区(zone)
页区(zone)是用struct_zone_t描述的,它跟踪页框使用、空闲区域和锁等讯息,具体描述如下每个结点的内存被分为多个块,称为页区(zone),它表示内存中的一段区域。一个页区(zone)用struct_zone_t结构描述,页区(zone)的类型主要有直接内存存取(DMA)页区(ZONE_DMA)、普通页区(ZONE_NORMAL)和高端页区(ZONE_HIGHMEM)三种,页区(zone)可以使页面分配更有目的性,有利于减少内存碎片。直接内存存取(DMA)页区(ZONE_DMA)位于低端的内存空间,用于某些旧的工业标准结构(ISA)设备。普通页区(ZONE_NORMAL)的内存直接映像到Linux系统核心(Kernel)线性地址空间的高端部分,许多核心(Kernel)操作只能在普通页区(ZONE_NORMAL)中进行。
每个页区(zone)中的未被占用(unreserved)页,依照伙伴(buddy)算法[每个页区(zone)的页分配使用一种伙伴(buddy)算法,此伙伴(buddy)算法核心的页分配器引入了页区(zone)结构,一个页区(zone)就是一大块连续的物理页面,伙伴(buddy)算法将整个页区(zone)划分为以2为幂次的各级页块的集合,相邻的同次页块称为伙伴(buddy),一对伙伴(buddy)可以合并到更高次的页面集合中去],链接成图5所示的结构如图5所示,图中左侧部分中的每一个长方形代表这一个链表,此链表中的每一个成员代表了固定大小的在物理上连续的内存页,这个固定大小就是图中标出的以2为幂次的数字。右侧部分所示的灰色长方形是此链表的屏蔽,屏蔽的每一位对应着链表中的每一个成员,如果此成员被分配,则屏蔽置1,否则置0。
至此,本领域的技术人员便可依照图1、图2及图3所示的本发明的内存测试方法的流程,通过用户层测试接口及一个字符设备来完成和实现在Linux操作系统下以较高的测试涵盖率和准确性对未被占用的物理内存直接进行访问和测试。
虽然本发明以前述的较佳实施方式公开如上,然而其并非用以限定本发明。本领域的技术人员应当意识到在不脱离本发明所附的权利要求
所揭示的本发明的范围和精神的情况下,所作出的变化与修改,均属本发明的专利保护范围之内。关于本发明所界定的保护范围请参考所附的权利要求

权利要求
1.一种Linux系统下物理内存的测试方法,应用于Linux操作系统下的物理内存的检测过程中,该方法包含以下步骤(a)、激活一字符设备驱动程序,以驱动一字符设备对一物理内存的物理页进行分配与释放;(b)、当所述字符设备成功激活后,以页为单位,按照所述物理内存的物理地址遍历整个物理内存;(c)、判断遍历是否完成,如果完成,则关闭所述字符设备,否则,通过Linux系统提供的档案作业函数设定所要访问的所述物理内存的物理地址;(d)、当成功设定所要访问的物理内存的物理地址后,通过Linux系统提供的档案作业函数将所述物理内存映像至用户空间;(e)、当所述物理内存被成功映像至用户空间后,通过内存检测算法对所述物理内存进行测试;(f)、通过Linux系统提供的档案作业函数解除该物理内存与用户空间的映像关系;以及(g)、通过所述Linux系统提供的档案作业函数释放该字符设备中所储存的讯息,并继续以页为单位,按照该物理内存的物理地址遍历该整个物理内存,直至遍历完成。
2.如权利要求
1所述的Linux系统下物理内存的测试方法,其特征在于,所述字符设备对所述物理内存的物理页进行分配还包含如下步骤获得所要分配的物理内存的物理地址;将所述物理地址转换为其所存在的页结构;判断该页是否被系统核心或其它硬件及应用程序占用,如果被占用则返回出错讯息并终止分配进程,如果未被占用则获取该页所在的页区结构;判断该页是否存在于该页区的伙伴算法结构中,如果该页不存在于该页区的伙伴算法结构中,则返回出错讯息并终止分配进程,否则,对该页区的伙伴算法结构的访问加锁;从该页区的伙伴算法链表中移出该页所存在的成员;对该页区的伙伴(buddy)算法结构的访问开锁;以及将该页映像到用户空间,并终止分配进程。
3.如权利要求
1所述的Linux系统下物理内存的测试方法,其特征在于,所述字符设备对所述物理内存的物理页进行释放还包含如下步骤获得所要释放的物理内存的物理地址;将该物理地址转换为其所存在的页结构;判断所要释放的页是否已经被分配,如果未被分配则返回出错讯息并终止释放进程,如果已被分配则获取该页所在的页区结构;对该页区的伙伴算法结构的访问加锁;向该页区的伙伴算法链表中加入该页所存在的成员;对该页区的伙伴)算法结构的访问开锁;以及返回释放已成功的讯息,并终止释放进程。
4.如权利要求
1所述的Linux系统下物理内存的测试方法,其特征在于,步骤(c)与步骤(g)中所述的档案作业函数为ioctl函数。
5.如权利要求
1所述的Linux系统下物理内存的测试方法,其特征在于,步骤(d)中所述的档案作业函数为mmap函数。
6.如权利要求
1所述的Linux系统下物理内存的测试方法,其特征在于,步骤(f)中所述的档案作业函数为munmap函数。
7.如权利要求
1所述的Linux系统下物理内存测试方法,其特征在于,所述内存检测算法是通过向内存中写入特定的数值,然后再读出该数值进行比对从而实现内存测试的各种内存检测算法。
8.如权利要求
7所述的Linux系统下物理内存的测试方法,其特征在于,所述内存检测算法是通过Linux系统提供的insmod命令将执行该算法的驱动程序模块动态加载到系统核心上实现的。
专利摘要
本发明公开一种Linux系统下物理内存的测试方法,是利用一个Linux操作系统下的字符设备驱动程序激活一个字符设备,用户只需通过Linux提供的档案作业函数,就可以实现在用户层对指定的物理内存进行读写操作。该方法对于内存分配的最小单位为页,页的大小视Linux系统核心(Kernel)的配置而定。除去系统自身保留的内存以及其它应用程序(包含测试程序本身)所占用的内存空间,利用本发明的测试方法可以直接访问到所有剩余的物理内存并进行读写测试,因此大大提高了内存测试的涵盖率和准确性。
文档编号G06F12/08GK1991770SQ200510023063
公开日2007年7月4日 申请日期2005年12月28日
发明者陈怡 , 陈玄同, 刘文涵 申请人:英业达股份有限公司导出引文BiBTeX, EndNote, RefMan
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1