一种基于编译选项的Linux内核模块关系提取方法

文档序号:6526690阅读:171来源:国知局
一种基于编译选项的Linux内核模块关系提取方法
【专利摘要】本发明公开了一种基于编译选项的Linux内核模块关系提取方法。本方法为:1)将内核源代码根据其功能及逻辑关系进行划分,形成虚目录;2)对Linux内核实目录下每一个Kconfig文件进行语法分析,识别出所有的编译选项;然后从同目录下的编译文件解析出每个编译选项所需的源码文件;3)根据虚目录,以源码文件作为中介,将编译选项划分到相应的虚目录中;4)对每一源码文件进行正则分析,得到源码文件中定义的函数以及变量;5)对每一函数和变量的具体实现源码进行解析,提取出函数之间、变量之间的调用关系;6)根据上述关系构建出内核组织架构。本发明并不依赖于某一内核版本,可以清晰明了的获取内核模块间关系。
【专利说明】—种基于编译选项的Linux内核模块关系提取方法
【技术领域】
[0001]本发明属于Linux内核的源码分析领域,涉及一种基于编译选项的Linux内核模块关系提取方法,主要应用在分析Linux各版本内核源码过程中,使使用者可以尽快了解Linux内核的架构与关系。
【背景技术】
[0002]Linux内核交互式图解软件是基于Linux内核源码,以编译选项为核心,来分析和梳理内核各级(目录级、编译选项级、文件级和函数、变量级)层次之间关系的,并通过矢量图,来清晰明确地展示内核架构和关系。
[0003]Linux操作系统以其开源源码、高性能和高可靠性等诸多优势在商业服务器和个人桌面系统中得到日益广泛的应用。近年来,随着Linux内核的不断发展和完善,内核变得日趋庞大,想深入了解其模块的划分以及各个模块的功能机制,也变得相对困难。同时,Linux内核的可定制性也是非常高的,它有着数以万计的编译配置选项,针对于不同的需求可以进行相应的配置。但是,这么大数目的编译配置选项也正是问题的所在,不管是初学者,还是内核的精通者,都无法保证能了解到每个编译配置选项处于内核的哪个大模块中,以及编译选项配置所涉及的文件等等。
[0004]因此,我们需要一种工具,能够帮助我们有效地了解和学习庞大的Linux内核源码。并可以随着Linux版本的变迁,能够快速的进行更新。目前相关的软件和工具Doxygen。
[0005]Doxygen是一种开源跨平台的,以类似Java Doc风格描述的文档系统,完全支持C语言语法的分析。通过Doxygen,我们可以对Linux源码进行分析,并生成相关的函数调用图。然而,Doxygen存在着明显的缺点。第一,它的安装配置相对较为复杂,要生成Linux源码的所有函数关系图,需要很长的时间。第二,它无法从宏观上给出Linux源码的架构图,很难让使用者从宏观上对Linux有直观的了解。
[0006]但是,通过我们的发明,可以有效的解决上述问题。从而使得使用者可以从多方面认识和学习内核源码。

【发明内容】

[0007]针对现有技术存在的技术问题,本发明的目的在于提供一种基于编译选项的Linux内核I吴块关系提取方法。
[0008]本发明的技术方案为:
[0009]一种基于编译选项的Linux内核模块关系提取方法,其步骤为:
[0010]I)将内核源代码根据其功能及逻辑关系进行划分,形成虚目录;
[0011]2)对Linux内核实目录下每一个Kconfig文件进行语法分析,识别出所有的编译选项;然后对同目录下的编译文件进行语法分析,解析出每个编译选项所需的源码文件;
[0012]3)根据划分好的虚目录,以源码文件作为中介,将编译选项划分到相应的虚目录中;[0013]4)对每一源码文件进行正则分析,得到源码文件中定义的函数以及变量;
[0014]5)对每一函数的具体实现源码进行解析,提取出函数之间的调用关系;对每一变量的具体实现源码进行解析,提取出变量之间的调用关系;
[0015]6)根据上述获取的虚目录与编译选项之间的包含关系、编译选项与源码文件之间的包含关系、源码文件与函数或变量之间的包含关系,以及函数之间的调用关系、变量之间的调用关系构建出Linux内核组织架构。
[0016]进一步的,根据函数之间的调用关系、变量之间的调用关系获取到编译选项之间的依赖关系。
[0017]进一步的,采用php语言读取虚目录与编译选项之间的包含关系、编译选项与源码文件之间的包含关系、源码文件与函数或变量之间的包含关系,以及函数之间的调用关系、变量之间的调用关系;然后调用raphael插件和jquery库来在网页上渲染出相应的Linux内核组织架构图。
[0018]进一步的,当在所述Linux内核组织架构图上选取某一编译选项时,根据该编译选项的名称查询该编译选项所包含的源码文件,并返回给前台界面。
[0019]进一步的,当在所述Linux内核组织架构图上选取某一源码文件时,根据该文件在源码目录下的路径名搜索该文件中定义的函数和变量,并返回给前台。
[0020]进一步的,当在所述Linux内核组织架构图上选取一函数时,根据该函数的函数名和文件路径查询该函数所依赖的函数,发送给前台并画出对应的矢量图。
[0021]进一步的,根据内核源代码的功能及逻辑关系划分虚目录,并建立源码文件在虚目录下的全路径与内核源码中全路径的一一对应关系。
[0022]进一步的,所述虚目录包括:进程管理,内存管理,系统运行,文件系统,网络模块,安全模块,设备管理和虚拟化。
[0023]本发明主要体现在两个方面:虚目录和基于编译选项的交互式图解软件。首先,在内核分析的基础上,将内核源代码根据其功能及逻辑关系进行了重新划分,形成虚目录;然后,在虚目录的基础上,从内核编译选项出发,对内核源码进行解析,从而清晰的展示出内核各个“虚目录”包涵的编译配置、编译配置需要的源码文件、文件中包含的函数和变量,以及各级(目录级、编译选项级、文件级和函数、变量级)层次之间的关系。接下来,对此两点发明进行详细说明。
[0024]以下重点阐述发明中的两个要点:
[0025]一、宏观上,基于内核特点的虚目录的划分规则:
[0026]本发明是对于Linux内核架构、编译选项以及各层次关系的详细展示。Linux内核源码的固有架构(目录划分)是相对工程化的,并不是很便于用户的理解,比如:kernel文件夹意义并不是很明确;实际运行的Linux系统中只有一个体系架构,内存管理等模块并没
有细化等等。
[0027]于是本发明提出了虚目录的思想,虚目录是与实目录(即内核源码的相对路径)相对应的说法。本发明将内核源代码根据其功能及逻辑关系进行了重新划分。与实目录相t匕,虚目录体现了内核的逻辑结构,虚目录按照内核的功能对源码进行了重新的组织,更人性化,更体现了源码的相关性和功能性。虚目录相对于实目录,最大的改变在于以下几点:
[0028]1、/kernel文件夹(内核通用机制相关):实目录中,此文件夹的意义并不是很明确,它包含的文件功能涉及到很多模块,需要将其划分到多个模块中。
[0029]2、/arch文件夹(体系架构相关):实际运行的Linux系统中只有一种体系架构,任一体系结构中包含的文件也是涉及到内核中的各个大模块的,为了保证其他各个模块功能的完整性,需要将/arch文件夹下的体系架构所包含的文件细分到其他各大模块中,剩余的common的文件应该隶属于系统管理。
[0030]3、/mm (内存管理相关)、/virt/kvm (虚拟化相关)等目录:内核中有一些这样的模块,从它的机制来理解,它应该是架构分层的,但是在实际的源码中却并非如此,它是包含的所有文件平级的放在了一个大文件夹下,对于这样的模块,我们按照架构和功能对其重新做了划分。
[0031]对于虚目录的划分,主要是从以下四个方面来综合考虑来进行划分的:
[0032]众所周知,功能相关联或者类似的内核代码大多都在相同目录下(比如ext4和btrfs都在fs目录下),因此Linux内核源码的组织方式可以作为模块划分的一个重要参考;将Linux内核分成以下八大模块,进程管理,内存管理,系统运行,文件系统,网络模块,安全模块,设备管理和虚拟化,同时,由于各个大模块的功能和复杂程度各不相同,为了较好的对各模块进行分析,我们并没有拘泥于严格的模块分层,而是针对每个特定的模块进行了适当的分层,从而更好的完成对各个模块的分析。
[0033]二、微观上,内核模块关系确定的策略:
[0034]当知道内核的模块划分后,我们可以通过软件分析的理论和方法来获取内核模块之间的关系。
[0035]首先,我们把内核源码分为以下4个层次,如图1所示。顶层为上述的虚目录,虚目录包含多个编译配置选项组成,每个编译配置选项包含多个源码文件,每个源码文件中又包含多个函数,或者变量等。
[0036]其次,通过对实目录下每一个Kconfig文件(即实目录下命名为”kconfig”的文件)进行语法分析,可以识别出所有的编译选项。这里,在Kconfig文件中,以”config XXX”开头的行中,XXX即为编译选项。然后,我们可以对同目录下的Makefile文件(编译文件)进行语法分析,解析出每个编译所需要的源码文件,我们知道,Makefile文件中,会列出编译的中间文件,如ai0.0,那么所需的源码文件为同名的c文件(这里ai0.C)。接着,根据之前划分好的虚目录,以源码文件作为中介,将编译选项划分到相应的虚目录中。这样就可以很清楚的知道内核的哪些功能(虚目录)都需要哪些配置选项去配置,以及每个配置选项配置需要涉及到哪些源码文件。之后,我们需要分析每个.c文件。根据c99语法中的规范,我们知道函数,变量定义的定义格式,通过对.c文件进行正则分析,匹配语法规范中的定义格式,我们可以得到该文件中定义的所有的函数,以及变量。这样,我们就可以获取虚目录,编译选项,源码文件,函数或者变量的包含关系,如图4。
[0037]最后,为了深入到最底层来了解每个功能的实现,我们对文件进行解析,提取出具体函数以及变量的调用关系。这里,我们通过逐行分析函数的具体实现源码,可以从每一行中提取出函数名,这样就可以获取到该函数所需要调用的其他函数(变量采用类似做法)。
[0038]与现有技术相比,本发明的积极效果为:
[0039]1.使用简单,本系统并不依赖于某一内核版本,只需要提供划分好的虚目录源码或者内核实际源码,即可生成对应的模块和关系图。[0040]2.采用虚目录的划分方式,合理的划分内核模块,同时通过有效的关系判定规则,可以清晰明了的获取内核模块间关系。
【专利附图】

【附图说明】
[0041]图1、内核源码层次图;
[0042]图2、系统架构构建流程图;
[0043]图3、系统模块划分图;
[0044]图4、爬取模块流程图。
【具体实施方式】
[0045]本发明的系统架构构建流程图如图2所示,我们的系统采用B/S架构来实现。主要包含三个部分,如图3所示:
[0046]1.关系爬取部分:这里我们采用python语言,按照
【发明内容】
中第二部分介绍的策略,分析内核源码,并把源码结构和关系,存入到数据库中。
[0047]具体过程如图4,爬取模块流程图所示:首先,我们需要划分虚目录,并建立数据库中存储任一源码文件在虚目录下的全路径与内核源码中全路径的一一对应关系;然后通过分析每个实目录下的Kconfig文件,获取到每个编译选项,这样就可以把虚目录和编译选项对应起来。接着通过分析makefile文件,获取到每个编译选项对应的.c文件,然后通过分析每个.c文件,找到其中定义的函数和变量信息,并把以上所有信息都存入数据库中。
[0048]最后,由于函数、变量等是在编译选项所对应的文件中定义的,那么通过分析函数,变量之间的调用关系,我们可以获取到编译选项之间的依赖关系,并把这些信息存入数据库中。
[0049]2.中间层部分,这里我们采用php语言,读取步骤I数据库中的数据信息,然后发送给前端。
[0050]3.前端部分,我们解析收到的php部分发送过来的数据,通过调用raphael和jquery库来在网页上渲染出相应的结构和关系图,即Linux内核组织架构图,供使用者使用。具体流程如下所示:
[0051]首先,我们会从数据库中获取到虚目录以及每个虚目录所包含的编译选项信息,以及这些编译选项之间的关系,并通过raphael插件来在网页上渲染出来。
[0052]其次,当用户点击一个编译选项时,我们会将该编译选项的名称发送给后台,后台会在数据库中查询该编译选项所包含的源码文件,并返回给前台界面;当用户点击某一个源码文件的时候,我们会将该文件的信息(在源码目录下的路径名)传给后台,由后台搜索该文件中定义的函数和变量,并返回给前台;当用户点击一个具体的函数时,我们会将该函数的信息(函数名和函数所属的文件路径)传递给后台,在数据库中查询该函数所依赖的函数,并发送给前台,由前台画出对应的矢量图。
【权利要求】
1.一种基于编译选项的Linux内核模块关系提取方法,其步骤为: 1)将内核源代码根据其功能及逻辑关系进行划分,形成虚目录; 2)对Linux内核实目录下每一个Kconfig文件进行语法分析,识别出所有的编译选项;然后对同目录下的编译文件进行语法分析,解析出每个编译选项所需的源码文件; 3)根据划分好的虚目录,以源码文件作为中介,将编译选项划分到相应的虚目录中; 4)对每一源码文件进行正则分析,得到源码文件中定义的函数以及变量; 5)对每一函数的具体实现源码进行解析,提取出函数之间的调用关系;对每一变量的具体实现源码进行解析,提取出变量之间的调用关系; 6)根据上述获取的虚目录与编译选项之间的包含关系、编译选项与源码文件之间的包含关系、源码文件与函数或变量之间的包含关系,以及函数之间的调用关系、变量之间的调用关系构建出Linux内核组织架构。
2.如权利要求1所述的方法,其特征在于根据函数之间的调用关系、变量之间的调用关系获取到编译选项之间的依赖关系。
3.如权利要求1所述的方法,其特征在于采用php语言读取虚目录与编译选项之间的包含关系、编译选项与源码文件之间的包含关系、源码文件与函数或变量之间的包含关系,以及函数之间的调用关系、变量之间的调用关系;然后调用raphael插件和jquery库来在网页上渲染出相应的Linux内核组织架构图。
4.如权利要求3所述的方法,其特征在于当在所述Linux内核组织架构图上选取某一编译选项时,根据该编译选项的名称查询该编译选项所包含的源码文件,并返回给前台界面。
5.如权利要求3所述的方法,其特征在于当在所述Linux内核组织架构图上选取某一源码文件时,根据该文件在源码目录下的路径名搜索该文件中定义的函数和变量,并返回给前台。
6.如权利要求3所述的方法,其特征在于当在所述Linux内核组织架构图上选取一函数时,根据该函数的函数名和文件路径查询该函数所依赖的函数,发送给前台并画出对应的矢量图。
7.如权利要求1所述的方法,其特征在于根据内核源代码的功能及逻辑关系划分虚目录,并建立源码文件在虚目录下的全路径与内核源码中全路径的一一对应关系。
8.如权利要求1或7所述的方法,其特征在于所述虚目录包括:进程管理,内存管理,系统运行,文件系统,网络模块,安全模块,设备管理和虚拟化。
【文档编号】G06F9/44GK103699389SQ201310746159
【公开日】2014年4月2日 申请日期:2013年12月30日 优先权日:2013年12月30日
【发明者】荆琦 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1