专利名称:Linux平台物理内存信息监测系统的制作方法
技术领域:
本发明涉及一种物理内存信息监测系统,尤其涉及一种通过内核补丁 加内核模块的方式实现的Linux平台物理内存信息监测系统。
技术背景在Linux系统中,资源管理往往是评价操作系统优劣的一个重要评价 标准,而内存管理又是资源管理中及其重要的一部分,因此对内存管理的 监测具有非常重要的意义。Linux内核是一种宏内核的系统,进程管理、 内存管理和文件系统全部运行在内核空间,而应用程序通常运行于用户空 间。由于当前Linux系统的内核程序本身并没有考虑到各种各样的测试需 求和考虑到内核的安全性和效率,当前的内核并没有开放很多信息,比如 内存相关的信息等。因此,目前的系统很难在用户空间获取内存的相关信,E、 o中国发明专利说明书CN14780878A (公告日2004年03月10日)公 开了一种使用/proc/meminfo文件来获取内存信息的方法,但是这种方法 只能够提供内存总体的使用和空闲信息,但是对于各种装载Linux操作平 台的硬件系统,尤其是各种存储资源首先但需要提供复杂内存操作的嵌入 式Linux平台,如第三代移动通信系统WCDMA手机平台来说,通过 /proc/meminfo文件获取的这些内存信息是不够的。由于内核模块属于运行时向内核添加的代码,主要提供了用户干预内核行为的一种手段,因此本领域中的一般技术人员通常还会通过内核模块 的方式来获取当前内核中己经存在的一些信息。但是,对于目前内核不存 在的一些信息,通过所述内核模块的方式是没法获取的,因此仅仅通过内 核模块的方式来获取内存信息的方法也存在着一定的局限性,无法获取详 细的物理内存信息。 发明内容本发明所要解决的技术问题是提供一种Linux平台物理内存信息监 测系统,可静态或动态地监测Linux平台下物理内存的使用状况,以优化 Linux平台物理内存资源的使用。为解决上述技术问题,本发明提供一种Linux平台物理内存信息监测 系统,包括内核补丁 (12)、内核监测处理模块(13)和输入/输出端 口 (18);所述内核补丁 (12)用于对Linux内核(11)进行改造,截获和登记 相应的物理内存(10)信息;所述内核监测处理模块(13)用于分析内存监测处理程序(19)通过 所述输入/输出端口 (18)发送的指令,执行所述指令,及将通过所述内 核补丁获取的相应内存信息回送到所述内存监测处理程序(19);所述输入/输出端口 (18)用于实现Linux内核空间和用户空间的内 存信息交互。本发明由于采用了上述技术方案,具有这样的有益效果,通过对 Linux内核添加补丁的方式改造Linux内核,以截获和登记相应的物理内 存信息,及使用内核监测处理模块作为桥梁来分析用户的指令、执行用户的操作和向用户回送内核信息的方法,来对Linux平台下物理内存的使用 状况进行静态监测或动态监测,从而实现了对Linux平台下各种物理内存 信息的监测,如获取可分配的指定阶内存块数目,获取内存详细情况以计 算内存外部碎片率等,具有较好的兼容性和适应性;因此本发明所述系统 尤其适合于各种存储资源受限但需要提供复杂内存操作的嵌入式Linux 平台,如第三代移动通信系统WCDMA手机平台等,而且适用于各种类型的 硬件系统,如各种类型的处理器(ARM、 X86等)及各种类型的内存设备 (SDRAM、 DDR闪存等)。
下面结合附图和具体实施方式
对本发明作进一步详细的说明 图1为本发明所述Linux平台物理内存信息监测系统的结构框图; 图2为本发明所述静态获取方法时输入控制模块的结构示意图; 图3为本发明所述动态获取方法时输入控制模块的结构示意图;图4为本发明所述输入/输出端口模块的结构示意图。
具体实施方式
如图1所示,本发明所述内存信息监测系统主要包括内核补丁 12、 内核监测处理模块13和输入/输出端口 18。其中,所述内核补丁 12用于对Limix内核11进行改造,截获和登记 相应的物理内存10信息。本发明所述内核补丁 12主要包括内存信息记录 模块,用于对Linux内核11进行扩展,以实现在Linux系统启动时开始 对物理内存10的使用情况进行记录,在本发明中这是通过一个全局变量 来进行控制的。本发明所述内存信息记录模块主要采用以下两种方式来对所述全局变量加以控制内核命令行方式和内核配置方式。现有技术中一 般都是通过直接修改内核代码的方式来控制内存信息的记录的,这种方式 下内核的每次修改都必须通过源代码修改和重新编译的方式来实现,因此 比较麻烦。而通过所述内核命令行方式来实现内存信息的记录无需对内核 进行修改,因此也不需要对内核进行重新编译,因而控制起来更为方便和 灵活。当然,也可通过内核所提供的配置选项的方式对全局变量进行控制。 所述内核监测处理模块13是Linux系统下通过内核空间装载并具有 物理内存监测功能的内核模块,用于分析内存监测处理程序19通过所述 输入/输出端口 18发送的指令,并执行所述内存监测处理程序19的命令, 及将通过所述内核补丁 12获取的相应内存信息回送到所述内存监测处理 程序19。该内核监测处理模块13进一步包括内存信息获取模块14、内存信 息处理模块15、输入控制模块16和输出控制模块17。所述内存信息获取 模块14用于根据输入控制模块16接收到的指令,去査询相应的内存信息。 所述内存信息处理模块15用于对査询到的内存信息进行相应的处理,如 当外部需要获取内存的碎片率时,所述内存信息处理模块15可在所获取 的内存详细状况的基础上,对碎片率进行计算;又如,当需要获取当前系 统内的可分配的连续32页(5阶)内存块数量时,所述内存信息处理模 块15可用于对高于5阶内存的数量进行计算,得到当前系统内的可分配 的连续32页(5阶)内存块数量。所述输入控制模块16用于接收内存监 测处理程序19通过输入/输出端口 18发出的指令并对该指令进行解析;所述输出控制模块17用于将所取得的内存信息通过所述输入/输出端口18发送给用户态的内存监测处理程序19。如图2所示,所述输入控制模块16主要包括输入端口控制模块21 和输入参数解析模块22。其中,输入端口控制模块21负责接收内存监测 处理程序19通过输入/输出端口 18发出的指令;输入参数解析模块22 负责将接收到的指令进行解析。这时就可实现对Linux物理内存信息的静 态监测,所述静态监测的具体实现步骤如下用户态的内存监测处理程序 通过输入/输出端口 18向内核空间发出获取内存信息的指令,内核空间的 输入控制模块16在对接收到用户的指令进行解析后,将会调用内存信息 获取模块14进行查询内存信息;当查询结束后,就会调用内存信息处理 模块15进行相应的处理,然后调用输出控制模块17把信息通过输入/输 出端口 18再返回给用户态的内存监测处理程序19,然后再由该内存监测 处理程序19将其获取的物理内存信息经过加工处理后通过不同的方式呈 现给用户,比如通过在控制台输出信息,或者把内存信息存储到指定文件 中等方式来呈现给用户。如图3所示,所述输入端口控制模块16除包括输入端口控制模块21 和输入参数解析模块22外,还包括定时触发模块31,用于定时的把内存 信息输出到磁盘或者其它非易失性存储介质上的文件中以实现对内存信 息进行定时存储的动态监测方法。所述定时存储的动态监测方法指通过 预先定义所述定时触发模块31中的定时器来定时地将内存信息输出到磁 盘或者其它非易失性存储介质上(比如Nand Flash或者NOR Flash)的 文件中,这样用户通过査看保存在文件中的内存信息就可以来判断内存的详细情况,因此也就有可能采取某种具体的措施来改进内存管理器。比如, 通过该方法可发现大容量的连续内存的分配经常不成功,那么就意味着需 要改善内存管理器的分配机制,使得系统能更多的分配大容量的连续内存。所述输入/输出端口 18用于实现内核空间和用户空间的内存信息交互,具体体现为所述内存监测处理程序19指令或预先的配置来确定在 用户空间通过所述输入/输出端口 18对内存信息的获取方式,并且用于将通过所述内核监测处理模块13获取和处理的内存信息从内核空间传输至用户空间。如图4所示,在本发明所述物理内存信息监测系统中,所述输入/输出端口 18实现内核空间和用户空间的内存信息交互的方式包括可读写 的proc接口方式41、设备文件方式42、普通文件方式43、系统调用方 式44及内存映射方式45等,本发明中这些获取方式可在内存监测处理程 序19的控制下进行切换。由于proc文件系统是有Linux操作系统内核提供的标准接口 ,所有 的Linux操作系统都以/proc的形式向用户空间开放proc文件系统,所 以通过该文件系统获取内存信息可以不依赖于所使用的Linux平台的发 行版本。因此,基于proc文件系统的上述特性,本发明使用其作为内存 监测处理程序19和内存监测处理模块13之间信息交互的输入/输出端口 之一。因此,在本发明中,通过所述proc接口方式41用户可以向内核中 的输入控制模块16发送指令,而Linux内核也可以把输出信息反映在/proc目录下的某个文件中,然后用户空间就可以对proc下的文件进行 分析或者转存操作了。设备文件的目的是允许进程和内核中的设备驱动程序通过设备文件 和实际的物理设备进行通信,但实际上我们也可以创建虚拟的设备和内核 模块进行通信。因为Linux的设备驱动程序本来就是一个软件抽象,它可 以结合硬件提供服务,也完全可以作为纯软件提供服务。在驱动程序中, 可以用open来启动服务,用read()返回处理好的记录,用ioctl()进行 控制设备的行为(比如发起监测请求),用close()停止服务等。当内核 模块被插入到内核后,就可以在/dev/目录下建立一个设备文件和内核模 块进行关联。然后,可以在用户空间通过对设备文件的操作来对内核模块 进行控制和信息交互。在本发明中,利用设备文件方式42,用户可以通 过创建字符设备或者块设备的方式(指定主设备号)和内核模块进行通信, 只要内核模块在初始化程序中对相同的主设备号进行注册就可以和现存 的设备进行关联;然后,用户就可以通过新创建的设备和内核模块进行数 据的输入和输出操作。所述普通文件方式43即内核可以通过读取文件的方式来决定操作行 为,再把内存信息保存在指定的文件中和用户进行通信。系统调用是另一种用户程序和内核进行通信的方法。目前Linux大致 提供了二百多个标准的系统调用以获取内核相关的信息或者干预内核的 行为。而且,Linux系统允许用户通过修改内核添加自己的系统调用的方 式来实现和内核的信息交换。因此,为了监测物理内存的相关信息,可以 通过在Linux内核中实现一些新的系统调用。用户通过这些新增的系统调用来获取内存的信息并提取到用户空间。当内核服务程序和新系统调用都 实现后,就可以在用户空间里编写用户程序进行内存监测任务。因此在本发明中通过利用系统调用方式44,在Linux内核中实现一些新的系统调 用来监测物理内存的相关信息,用户可通过这些新增的系统调用44来获 取内存的信息。Linux也可以通过内存映射机制来提供用户程序对内核空间的内存 直接访问的能力。内存映射是把内核中特定部分的内存空间映射到用户空 间。即用户空间和内核空间共享一块相同的内存。因此,内核在共享内上 的数据,用户可以立即发现和使用,根本无须数据拷贝,反之亦然。对于 许多数据传输量大、时间要求高的应用,内存映射机制可以节省数据拷贝 所耗费的时间和资源。因此,在本发明中也可通过内存映射方式45来保 证用户空间与内核空间信息的交互操作。通过本发明所述物理内存信息监测系统,可获取不同阶空闲内存的信 息、获取当前系统的内存外部碎片率等,因此本发明所述物理内存信息监 测系统和监测方法具有很好的适用性和兼容性。如下所述为关于获取当前系统内的可分配的连续32页(5阶)内存 块数量的一个实施例,其具体步骤为(1) 以内核补丁方式对Linux内核11进行扩展的内存信息记录模块 对物理内存10的使用情况进行记录。当内存分配和释放操作发生时,需 要更新内核中相应的各阶内存计数器。(2) 内存监测处理程序19通过输入/输出端口 17发出获取当前系统 内的可分配的连续32页(5阶)内存块数量的指令。(3) 内核空间输入控制模块16对接收到用户的指令进行解析。(4) 调用内存信息获取模块14查询当前系统内5阶以上的内存块数 量-,由于当前系统内仅仅维护了各阶内存的数量,因此需要通过内存信息 处理模块15把高于5阶内存的数量进行计算后才能得到当前系统内的可 分配的连续32页(5阶)内存块数量,比如一个空闲的6阶内存实际上 对应于2个可分配的5阶空闲内存。(5) 当内存信息处理模块15进行相应处理后,调用输出控制模块 17把信息通过输入/输出端口18再返回给用户态的内存监测处理程序19。(6) 由所述内存监测处理程序19通过各种的方式呈现给用户。 利用本发明所述Linux平台物理内存信息监测系统还可获取系统的内存外部碎片率,在一个实施例中,其具体步骤如下(1) 以内核补丁方式对Limix内核11进行扩展的内存信息记录模块 对物理内存10的使用情况进行记录。先分配一块内存用以保存所有的内 存页的信息。当内存分配和释放操作发生时,需要更新内核中相应的各阶 内存计数器。(2) 内存检测处理程序19向输入/输出端口 17发出获取系统的内存 外部碎片率的指令。(3) 内核空间的输入控制模块16在对接收到用户的指令进行解析。(4) 输入控制模块16调用内存信息获取模块14去査询当前系统内 的详细内存情况,以确定当前系统内存的最大空闲内存块的页数。(5) 通过所述内存信息获取模块14査询系统内的空闲内存的总体数(6) 査询结束后,内存信息处理模块15根据如下公式计算出内存外 部碎片率,即内存外部碎片率=1一最大的空闲内存块页数/系统的空闲内 存页数。(7) 内存信息处理模块15进行相应的处理后,然后调用输出控制模 块17把系统的外部碎片率信息通过输入/输出端口 18再返回给用户态的 内存监测处理程序19。(8) 由该内存监测处理程序19通过不同的方式呈现给用户。 本发明适合于各种装载Lirmx操作平台的硬件系统,尤其适用于各种存储资源受限但需要提供复杂内存操作的嵌入式Linux平台,例如第三代 移动通信系统WCDMA手机平台。由于嵌入式Linux平台的存储资源非常有 限(特别是物理内存容量),因此非常有必要通过本发明提供的方法监测 Linux平台的物理内存使用状况,以优化Linux平台物理内存资源的使用。
权利要求
1. 一种Linux平台物理内存信息监测系统,其特征在于,包括内核补丁(12)、内核监测处理模块(13)和输入/输出端口(18);所述内核补丁(12)用于对Linux内核(11)进行改造,截获和登记相应的物理内存(10)信息;所述内核监测处理模块(13)用于分析内存监测处理程序(19)通过所述输入/输出端口(18)发送的指令,执行所述指令,及将通过所述内核补丁获取的相应内存信息回送到所述内存监测处理程序(19);所述输入/输出端口(18)用于实现Linux内核空间和用户空间的内存信息交互。
2、 根据权利要求l所述的Linux平台物理内存信息监测系统,其特 征在于,所述内核补丁 (12)主要包括内存信息记录模块,用于对Linux 内核(11)进行扩展,以在Linux系统启动时开始对物理内存(10)的使 用情况进行记录。
3、 根据权利要求2所述的Linux平台物理内存信息监测系统,其特 征在于,所述信息记录模块是通过一个全局变量来进行控制的。
4、 根据权利要求3所述的Linux平台物理内存信息监测系统,其特 征在于,所述内存信息记录模块主要采用以下两种方式对所述全局变量进 行控制内核命令行方式和内核配置方式。
5、 根据权利要求1所述的Linux平台物理内存信息监测系统,其特 征在于,所述内核监测处理模块(13)进一步包括内存信息获取模块(14)、内存信息处理模块(15)、输入控制模块(16)和输出控制模块(17);其中,所述内存信息获取模块(14)用于根据所述输入控制模块(16) 接收到的指令,去査询相应的内存信息;所述内存信息处理模块(15)用于对査询到的内存信息进行相应的处理;所述输入控制模块(16)用于接收所述内存监测处理程序(19)通过 所述输入/输出端口 (18)发出的指令并对该指令进行解析;所述输出控制模块(17)用于将所取得的内存信息通过所述输入/输 出端口 (18)发送给用户态的内存监测处理程序(19)。
6、 根据权利要求5所述的Linux平台物理内存信息监测系统,其特 征在于,所述输入控制模块(16)主要包括输入端口控制模块(21)和输 入参数解析模块(22);其中,所述输入端口控制模块(21)负责控制接 收用户态的内存监测处理程序(19)通过所述输入/输出端口 (18)发出 的指令;所述输入参数解析模块(22)负责将接收到的指令进行解析。
7、 根据权利要求6所述的Linux平台物理内存信息监测系统,其特 征在于,所述输入控制模块(16)还包括定时触发模块(31),该定时触 发模块(31)主要包括一定时器,用于定时的把内存信息输出到磁盘或者 其它非易失性存储介质上的文件中,对物理内存进行定时存储的动态监
8、 根据权利要求l所述的Linux平台物理内存信息监测系统,其特 征在于,所述输入/输出端口 (18)实现Linux内核空间和用户空间的内存信息交互具体体现为内存监测处理程序(19)指令或预先的配置来确 定在用户空间通过所述输入/输出端口 (18)对内存信息的获取方式,及 将通过所述内核监测处理模块(13)获取和处理的内存信息从内核空间传 输至用户空间。
9、根据权利要求1或8所述的Linux平台物理内存信息监测系统, 其特征在于,所述输入/输出端口 (18)实现Linux内核空间和用户空间 的内存信息交互的方式包括可读写的proc接口方式(41)、设备文件 方式(42)、普通文件方式(43)、系统调用方式(44)及内存映射方式 (45),这些方式可在所述内存监测处理程序(19)的控制下进行切换。
全文摘要
本发明公开了一种Linux平台物理内存信息监测系统,可在Linux平台下监测物理内存的使用状况,优化Linux平台物理内存资源的使用。本发明通过内核补丁加内存监测处理模块的方式,可对Linux平台中物理内存的总体情况和详细使用状况进行静态监测和动态监测,实现对Linux平台中如下物理内存信息的监测,如获取可分配的指定阶内存块数目,获取内存详细情况以计算内存外部碎片率等,因此具有较好的兼容性和适应性。该系统尤其适合于各种存储资源受限但需要提供复杂内存操作的嵌入式Linux平台。
文档编号G06F11/34GK101221527SQ200710036249
公开日2008年7月16日 申请日期2007年1月8日 优先权日2007年1月8日
发明者刘通平, 涛 韩 申请人:上海宇梦通信科技有限公司