CN115437684A - 一种针对Linux内核源代码的文件级裁剪方法和系统 - Google Patents
一种针对Linux内核源代码的文件级裁剪方法和系统 Download PDFInfo
- Publication number
- CN115437684A CN115437684A CN202211154778.9A CN202211154778A CN115437684A CN 115437684 A CN115437684 A CN 115437684A CN 202211154778 A CN202211154778 A CN 202211154778A CN 115437684 A CN115437684 A CN 115437684A
- Authority
- CN
- China
- Prior art keywords
- file
- kernel
- source code
- compiling
- makefile
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Library & Information Science (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及一种针对Linux内核源代码的文件级裁剪方法和系统,属于操作系统技术领域,解决了标准Linux内核在功能上显得过于冗余,在源代码文件和二进制文件体积上显得过于庞大的问题。方法包括:根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件;基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表;根据参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪;以及在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。对标准的Linux内核进行定制裁剪,从而构造一个即满足场景需要,又高度精简的Linux内核。
Description
技术领域
本发明涉及操作系统技术领域,尤其涉及一种针对Linux内核源代码的文件级裁剪方法和系统。
背景技术
GNU/Linux是一个开源的操作系统项目,目前众多操作系统公司基于该项目推出了不同的Linux系统发行版本的,由于Linux系统的高度可移植、可裁剪能力,目前已经在嵌入式领域广泛应用。
由于嵌入式设备高度定制的特点,GNU/Linux社区的标准Linux内核在功能上显得过于冗余,在源代码文件和二进制文件体积上显得过于庞大。
发明内容
鉴于上述的分析,本发明实施例旨在提供一种针对Linux内核源代码的文件级裁剪方法和系统,用以解决标准Linux内核在功能上显得过于冗余,在源代码文件和二进制文件体积上显得过于庞大的问题。
一方面,本发明实施例提供了一种针对Linux内核源代码的文件级裁剪方法,包括:根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件;基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表;根据所述参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪;以及在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。
上述技术方案的有益效果如下:针对Linux内核源代码的文件级裁剪方法,可实现对不参与内核编译的内核源代码文件进行裁剪,只保留需要的内核源代码文件。达到Linux内核源代码文件最小化裁剪的目的。针对一个具体的嵌入式设备,需要根据设备的配置以及项目的需求对标准的Linux内核进行定制裁剪,从而构造一个即满足场景需要,又高度精简的Linux内核。
基于上述方法的进一步改进,所述Makefile文件包含:顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*和kbuildMakefiles,其中,所述顶层Makefile,是源代码根目录下的Makefile文件,用于编译生成vmlinux和各种模块;所述内核配置文件.config,.config用户保存用户对内核配置项的设置信息;所述arch/$(ARCH)/Makefile,根据指定的平台架构对内核进行相应配置,其中,ARCH为X86、ARM64、MIPS或其它CPU架构;所述scripts/Makefile.*,定义构建内核的通用规则;以及所述kbuild Makefiles,定义每个内核功能组件的编译规则,其中,如果所述参与编译的源代码文件列表下同时存在Makefile和Kbuild文件,则优先使用所述Kbuild文件。
基于上述方法的进一步改进,内核的配置文件.config包括:根据应用场景和硬件设备的特点,手动对内核进行配置,生成内核配置文件.config。
基于上述方法的进一步改进,根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中要参与编译的源代码文件包括:通过make命令进行Linux内核编译,通过顶层Makefile递归向下访问子目录的方式生成vmlinux和各种模块,顶层Makefile通过读取.config文件决定需要访问哪些子目录参与内核的编译;通过读取arch/$(ARCH)/Makefile的内容确定平台的架构信息;scripts/Makefile.*文件包含所有关于编译的定义、规则信息;每个子目录中都有一个Kbuild或Makefile文件,用于执行从其上层目录传递下来的编译命令;以及所有的Kbuild或Makefile文件从内核配置文件.config中读取内核的配置项信息,从而根据配置项的设置值,选择需要参与编译的源代码文件。
基于上述方法的进一步改进,所述Kbuild Makefile用于指定哪些内核源代码文件参与编译,并规定了编译的方式,其中,通过obj-XXX、target-objs和lib-XXX这三个字段进行指定:所述obj-XXX,语法为obj-XXX=target.o,其中,XXX为y、m或$(CONFIG_YYY);y表示将所述Kbuild Makefile默认编译进内核;m表示将所述Kbuild Makefile默认编译成可动态插入内核的模块;$(CONFIG_YYY)表示所述KbuildMakefile的编译方式取决于.config中对配置项CONFIG_YYY的设置;target为目标文件的名字,且所述目标文件对应一个target.c或target.S源代码文件,如果“CONFIG_YYY”既不是y也不是m,则所述目标文件将不会被编译也不会被连接;所述target-objs,语法为target-objs=target1.otarget2.o……targetn.o,其中,一个目标文件target.o是由多个子目标文件:target1.o,target2.o,……,targetn.o组成;以及所述lib-XXX,语法为lib-XXX=target.o,其中XXX是y、m,y:表示将所述Kbuild Makefile编译进一个单独的库文件;m:为了一致性,与“y”的定义一致,将目标文件编进一个库文件,lib-XXX通常出现在lib/和arc/*/lib子目录中。
基于上述方法的进一步改进,在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序包括:在配置.config文件后,实现Linux内核编译,其中,所述Linux内核编译是将内核源代码.c、.S文件编译进内核文件、内核模块或库文件;在编译源代码文件时,调用头文件,参与编译源代码文件包含.c、.S文件中所调用的.h头文件,将参与编译内核编译的源代码文件形成源代码文件列表list1,其中,所述源代码文件列表list1中的文件是全部Linux内核文件的真子集;以及对Linux内核编译时,基于每个子目录的Kbuild Makefile和.config文件,确定参与内核编译的源代码文件列表list1。
基于上述方法的进一步改进,在Linux内核源代码文件中,除了用于编译内核的源代码文件之外,还包括用于辅助Linux内核配置、构建的文件,其中,通过以下三类文件形成辅助Linux内核配置、构建的文件列表list2:Kconfig文件,定义一套完整的规则来表述配置项及配置项间的关系,是配置项的描述文件、顶层以及各个子目录都包含有Kconfig文件;Kbuild,包含顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*、kbuild Makefiles;以及/scripts目录下的文件,包含用来配置内核的脚本文件,当配置内核时,需要与所述scripts目录下的脚本进行交互。
基于上述方法的进一步改进,根据所述参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪包括:在得到文件列表list1、list2之后,通过删除不在所述源代码文件列表list1、list2中的文件,对Linux内核源代码文件进行裁剪,其中,裁剪步骤如下:/arch目录裁剪:根据目标平台的架构,将/arch目录下除了目标平台架构的子目录全部删除;/Documentation目录裁剪:该目录包含了关于内核的帮助说明文档,不参与内核编译,因此全部删除;/samples目录裁剪:该目录包含了一些关于内核的编程范例,不参与内核编译,因此全部删除;/tools目录裁剪:该目录包含了一些与内核交互的工具,不参与内核编译,因此全部删除;其它目录裁剪:删除不在文件列表list1、list2中的所有文件。
另一方面,本发明实施例提供了一种针对Linux内核源代码的文件级裁剪系统,包括:识别模块,用于根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件;文件列表生成模块,用于基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表;裁剪模块,用于根据所述参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪;以及编译模块,用于在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。
基于上述系统的进一步改进,所述Makefile文件包含:顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*和kbuildMakefiles,其中,所述顶层Makefile,是源代码根目录下的Makefile文件,用于编译生成vmlinux和各种模块;所述内核配置文件.config,.config用户保存用户对内核配置项的设置信息;所述arch/$(ARCH)/Makefile,根据指定的平台架构对内核进行相应配置,其中,ARCH为X86、ARM64、MIPS或其它CPU架构;所述scripts/Makefile.*,定义构建内核的通用规则;以及所述kbuild Makefiles,定义每个内核功能组件的编译规则,其中,如果所述参与编译的源代码文件列表下同时存在Makefile和Kbuild文件,则优先使用所述Kbuild文件。
与现有技术相比,本发明至少可实现如下有益效果之一:
1、针对Linux内核源代码的文件级裁剪方法,可实现对不参与内核编译的内核源代码文件进行裁剪,只保留需要的内核源代码文件。达到Linux内核源代码文件最小化裁剪的目的;针对一个具体的嵌入式设备,需要根据设备的配置以及项目的需求对标准的Linux内核进行定制裁剪,从而构造一个即满足场景需要,又高度精简的Linux内核。
2、对Linux内核编译时,基于每个子目录的Kbuild Makefile和.config文件,可确定需要参与内核编译的源代码文件列表list1,生成源代码文件列表list1;Kconfig文件、Kbuild文件和/scripts目录下的文件形成了辅助Linux内核配置、构建的文件列表list2,文件列表list2的生成只需要在源代码目录中根据文件名搜索即可得到;
3、在得到文件列表list1、list2之后,通过删除不在list1、list2列表中的文件,即可实现对Linux内核源代码文件进行裁剪;以及
4、针对一个具体的嵌入式设备,需要根据设备的配置以及项目的需求对标准的Linux内核进行定制裁剪,从而构造一个即满足场景需要,又高度精简的Linux内核。精简的内核在执行性能、响应时间、安全性、稳定性方面都会得到提升。
本发明中,上述各技术方案之间还可以相互组合,以实现更多的优选组合方案。本发明的其它特征和优点将在随后的说明书中阐述,并且,部分优点可从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其它优点可通过说明书以及附图中所特别指出的内容中来实现和获得。
附图说明
附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。
图1为根据本发明实施例的针对Linux内核源代码的文件级裁剪方法的流程图;
图2为根据本发明实施例的生成源代码文件列表list1的流程图;以及
图3为根据本发明实施例的针对Linux内核源代码的文件级裁剪系统的框图。
具体实施方式
下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。
本发明的一个具体实施例,公开了一种针对Linux内核源代码的文件级裁剪方法。如图1所示,针对Linux内核源代码的文件级裁剪方法包括:在步骤S102中,根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件;在步骤S104中,基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表;在步骤S106中,根据参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪;以及在步骤S108中,在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。
与现有技术相比,本实施例提供的针对Linux内核源代码的文件级裁剪方法,可实现对不参与内核编译的内核源代码文件进行裁剪,只保留需要的内核源代码文件。达到Linux内核源代码文件最小化裁剪的目的。针对一个具体的嵌入式设备,需要根据设备的配置以及项目的需求对标准的Linux内核进行定制裁剪,从而构造一个即满足场景需要,又高度精简的Linux内核。
下文中,将参考图1对根据本发明实施例的针对Linux内核源代码的文件级裁剪方法的各个步骤进行详细说明。
在步骤S102中,根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件。内核的配置文件.config包括:根据应用场景和硬件设备的特点,手动对内核进行配置,生成内核配置文件.config。具体地,根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中要参与编译的源代码文件包括:通过make命令进行Linux内核编译,通过顶层Makefile递归向下访问子目录的方式生成vmlinux和各种模块,顶层Makefile通过读取.config文件决定需要访问哪些子目录参与内核的编译;通过读取arch/$(ARCH)/Makefile的内容确定平台的架构信息;scripts/Makefile.*文件包含所有关于编译的定义、规则信息;每个子目录中都有一个Kbuild或Makefile文件,用于执行从其上层目录传递下来的编译命令;以及所有的Kbuild或Makefile文件从内核配置文件.config中读取内核的配置项信息,从而根据配置项的设置值,选择需要参与编译的源代码文件。
在步骤S104中,基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表。具体地,在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序包括:在配置.config文件后,实现Linux内核编译,其中,Linux内核编译是将内核源代码.c、.S文件编译进内核文件、内核模块或库文件;在编译源代码文件时,调用头文件,参与编译源代码文件包含.c、.S文件中所调用的.h头文件,将参与编译内核编译的源代码文件形成源代码文件列表list1,其中,源代码文件列表list1中的文件是全部Linux内核文件的真子集;以及对Linux内核编译时,基于每个子目录的Kbuild Makefile和.config文件,确定参与内核编译的源代码文件列表list1。
在Linux内核源代码文件中,除了用于编译内核的源代码文件之外,还包括用于辅助Linux内核配置、构建的文件,其中,通过以下三类文件形成辅助Linux内核配置、构建的文件列表list2:Kconfig文件,定义一套完整的规则来表述配置项及配置项间的关系,是配置项的描述文件、顶层以及各个子目录都包含有Kconfig文件;Kbuild,包含顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*、kbuildMakefiles;以及/scripts目录下的文件,包含用来配置内核的脚本文件,当配置内核时,需要与scripts目录下的脚本进行交互。
在步骤S106中,根据参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪。具体地,根据参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪包括:在得到文件列表list1、list2之后,通过删除不在源代码文件列表list1、list2中的文件,对Linux内核源代码文件进行裁剪,其中,裁剪步骤如下:/arch目录裁剪:根据目标平台的架构,将/arch目录下除了目标平台架构的子目录全部删除;/Documentation目录裁剪:该目录包含了关于内核的帮助说明文档,不参与内核编译,因此全部删除;/samples目录裁剪:该目录包含了一些关于内核的编程范例,不参与内核编译,因此全部删除;/tools目录裁剪:该目录包含了一些与内核交互的工具,不参与内核编译,因此全部删除;其它目录裁剪:删除不在文件列表list1、list2中的所有文件。
在步骤S108中,在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。具体地,Makefile文件包含:顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*和kbuildMakefiles。顶层Makefile,是源代码根目录下的Makefile文件,用于编译生成vmlinux和各种模块;内核配置文件.config,.config用户保存用户对内核配置项的设置信息;arch/$(ARCH)/Makefile,根据指定的平台架构对内核进行相应配置,其中,ARCH为X86、ARM64、MIPS或其它CPU架构;scripts/Makefile.*,定义构建内核的通用规则;以及kbuildMakefiles,定义每个内核功能组件的编译规则,其中,如果参与编译的源代码文件列表下同时存在Makefile和Kbuild文件,则优先使用Kbuild文件。
具体地,Kbuild Makefile用于指定哪些内核源代码文件参与编译,并规定了编译的方式,其中,通过obj-XXX、target-objs和lib-XXX这三个字段进行指定:obj-XXX,语法为obj-XXX=target.o,其中,XXX为y、m或$(CONFIG_YYY);y表示将Kbuild Makefile默认编译进内核;m表示将Kbuild Makefile默认编译成可动态插入内核的模块;$(CONFIG_YYY)表示Kbuild Makefile的编译方式取决于.config中对配置项CONFIG_YYY的设置;target为目标文件的名字,且目标文件对应一个target.c或target.S源代码文件,如果“CONFIG_YYY”既不是y也不是m,则目标文件将不会被编译也不会被连接;target-objs,语法为target-objs=target1.o target2.o……targetn.o,其中,一个目标文件target.o是由多个子目标文件:target1.o,target2.o,……,targetn.o组成;以及lib-XXX,语法为lib-XXX=target.o,其中XXX是y、m,y:表示将KbuildMakefile编译进一个单独的库文件;m:为了一致性,与“y”的定义一致,将目标文件编进一个库文件,lib-XXX通常出现在lib/和arc/*/lib子目录中。
本发明的一个具体实施例,公开了一种针对Linux内核源代码的文件级裁剪系统,包括:识别模块302,用于根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件;文件列表生成模块304,用于基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表;以及裁剪模块306,用于根据参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪;以及编译模块308,用于在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。
Makefile文件包含:顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*和kbuild Makefiles,其中,顶层Makefile,是源代码根目录下的Makefile文件,用于编译生成vmlinux和各种模块;内核配置文件.config,.config用户保存用户对内核配置项的设置信息;arch/$(ARCH)/Makefile,根据指定的平台架构对内核进行相应配置,其中,ARCH为X86、ARM64、MIPS或其它CPU架构;scripts/Makefile.*,定义构建内核的通用规则;以及kbuild Makefiles,定义每个内核功能组件的编译规则,其中,如果参与编译的源代码文件列表下同时存在Makefile和Kbuild文件,则优先使用Kbuild文件。
下文中,将参考图2,以具体实例的方式对根据本发明实施例的针对Linux内核源代码的文件级裁剪方法进行详细说明。
Linux内核裁剪技术
目前,传统的Linux内核裁剪通常是利用配置工具,通过对内核配置项的设置来实现。当一个内核功能组件的配置项设置为y时,表示将内核功能组件编译进内核;当一个内核功能组件的配置项设置为m时,表示将内核功能组件编译成可动态加载的模块;当一个内核功能组件的配置项设置为n时,表示该功能组件不参与编译。当一个内核功能组件不参与内核编译时,即实现了对该内核功能组件的裁剪。
常用的内核配置工具有如下几类:
1)make config
这是一种最为传统的通过手动设置所有配置项的配置方式。
2)make oldconfig
make oldconfig和make config类似,不同的是,它是在现有的内核配置文件基础上建立一个新的配置文件,只需要对新的内核配置项进行设置。
3)make menuconfig
这是一种基于字符终端的配置方式,提供了文本模式的图形用户界面,可通过光标移动来进行配置项的设置。
4)make xoncifg
这是一种基于X Windows图形窗口模式的配置方式,提供了友好的配置界面,可使用鼠标进行配置项的设置。
5)make gconfig
make gconfig和make xocnifg类似,不同的是,make gconfig依赖的是GTK库。
6)make defconfig
这是一种基于默认配置文件对内核进行配置的方式。
7)make allyesconfig
这是一种对内核所有配置项都设置为“y”的配置方式,表示选择内核的所有功能组件。
8)make allnoconfig
这是一种除必须的配置项设置为“y”外,其它配置项全部设置“n”的配置方式,该方式主要用于嵌入式系统的内核构建。
9)make allmodconfig
这是一种尽可能多的将配置项设置为“m”的配置方式。
上述9中内核配置方式的最终目的,都是为了生成一个内核的配置文件.config,该文件记录了所有内核功能组件以什么的方式参与编译,即:
如果是y:表示将该功能组件编译进内核;
如果是n:表示该功能组件不参与编译;
如果是m:表示将该功能组件编译成可动态加载的模块。
1、Linux内核编译过程分析
Linux内核编译是通过kbuild系统来实现,内核编译包含两个步骤,首先是把.c格式的源文件编译成.o格式的目标文件;然后是将大量.o目标文件链接成可执行文件。其中,在编译阶段,一个高级语言的.c源文件或者汇编.S源文件都会对应一个.o的目标文件。
在执行make命令进行编译时,会根据Makefile文件定义的方式来编译源代码和链接程序。Makefile文件分布在Linux内核源代码的各个目录中,对各个功能组件的编译规则进行独立的定义。Makefile包含五个内容:
(1)、顶层Makefile:源代码根目录下的Makefile文件,该文件作用是:编译生成vmlinux和各种模块。
(2)、内核配置文件.config:.config用户保存用户对内核配置项的设置信息
(3)、arch/$(ARCH)/Makefile:根据指定的平台架构对内核进行相应的配置,其中ARCH可以为X86,ARM64,MIPS或其它CPU架构。
(4)、scripts/Makefile.*:定义构建内核的通用规则
(5)、kbuild Makefiles:定义每个内核功能组件的编译规则,特别地,如果子目录下同时存在"Makefile"和"Kbuild"文件,则优先使用"Kbuild"文件。
基于kbuild系统进行Linux内核编译的流程如下:
通过make命令进行Linux内核编译,是通过顶层Makefile递归向下访问子目录的方式来生产vmlinux和各种模块,顶层Makefile通过读取.config文件,来决定需要访问哪些子目录参与内核的编译。通过读取arch/$(ARCH)/Makefile的内容确定平台的架构信息。scripts/Makefile.*文件包含了所有关于编译的定义、规则等信息。每个子目录中都有一个Kbuild或Makefile文件,可用来执行从其上层目录传递下来的编译命令。所有的Kbuild或Makefile文件都是从.config文件中读取内核的配置项信息,从而根据配置项的设置值,选择需要参与编译的文件。通过上述五个方面的内容,可最终实现对内核的编译、链接。
2、Kbuild Makefile文件语法分析
Kbuild Makefile主要功能是指定哪些内核源代码文件参与编译,并规定了编译的方式,该功能通过以下三个字段进行指定:
(1)、obj-“XXX”
语法为:obj-XXX=“target”.o,其中“XXX”可以是:
·“y”:表示将该功能组件默认编译进内核;
·“m”:表示将该功能组件默认编译成可动态插入内核的模块。
·“$(CONFIG_YYY)”:表示该功能组件的编译方式取决于.config中对配置项CONFIG_YYY的设置。
“target”为目标文件的名字,且该目标文件会对应一个target.c或target.S源代码文件。如果“CONFIG_YYY”既不是y也不是m,那么该目标文件将不会被编译也不会被连接。
(2)、“target”-objs
语法为:“target”-objs=“target1”.o“target2”.o……“targetn”.o
该字段表示:一个目标文件“target”.o文件是由多个子目标文件:“target1”.o,“target2”.o,……,“targetn”.o组成。
(3)、lib-“XXX”
语法为:lib-XXX=“target”.o,其中“XXX”可以是:
“y”:表示将该功能组件编译进一个单独的库文件;
“m”:为了一致性,与“y”的定义一致。
该字段表示:将目标文件编进一个库文件。lib-“XXX”通常出现在lib/和arc/*/lib子目录中。
3、Linux内核裁剪的新需求
传统的内核裁剪技术是根据应用场景、硬件设备的特点,将不需要的内核功能组件设置为不参与编译,即实现了对这些内核功能组件的裁剪。传统内核裁剪的主要目标是在满足场景需求的条件下,构造一个最小规模的二进制内核文件。
目前,随着Linux系统的应用领域越来越广泛,应用场景也越来越复杂。基于Linux定制专用内核的需求也越来越多,尤其是基于Linux定制裁剪专用的嵌入式系统。并且对Linux内核裁剪也产生了新的需求,主要表现为针对Linux内核源代码文件的裁剪。对Linux内核源代码的裁剪主要有以下两个原因:
(1)对于一些对源代码安全要求极其严格的领域,针对操作系统、业务系统等软件都需要进行源代码的人工审查。但是标准的Linux内核,例如Linux 5.4版本的内核大致有2762万多行代码,如果对全部源代码进行安全审查,工作量将是巨大的。另外,并不是内核中所有代码都会参与编译生成最终的二进制内核,因此如果对所有内核源代码都进行安全审查,会造成巨大的不必要的工作量。因此,需要针对linux内核源代码文件进行裁剪。
(2)同样是针对软件代码的安全问题,特别是在航天航空、汽车电子、工业控制等领域,对软件代码的可信验证尤为重要。可信认证通常是采用形式化验证技术对软件代码进行安全验证,形式化验证基于形式化规约,通过对软件代码进行模型构建,再利用模型检测手段验证软件系统是否满足设定的功能特性、是否存在安全隐患。对软件代码形式化验证的难点是对软件代码建模后会出现状态空间爆炸的情况,造成形式化验证的计算量十分巨大。因此,对于几千万行的全部Linux内核代码进行形式化验证,会出现状态空间爆炸的问题,即使是对状态空间进行缩减,计算量也是庞大的,很难在可接受的时间内完成对如此大规模软件代码的形式化验证工作。因此,需要针对linux内核源代码文件进行裁剪。
另外,通过裁剪Linux内核源代码,可以提高内核研发人员的工作效率。总之,对于一个特定的应用场景、定制化的硬件平台,对Linux内核源代码的裁剪成了当前的一个新需求。
针对Linux内核源代码裁剪的需求,基于对Linux内核编译过程的分析,本发明提出一种基于内核配置文件的自动化Linux源代码裁剪技术,可实现对不参与内核编译的内核源代码文件进行裁剪,只保留需要的内核源代码文件。达到Linux内核源代码文件最小化裁剪的目的。
4、参与Linux内核编译的源代码文件列表制定
要对Linux内核源代码文件进行裁剪,首先需要确定哪些文件会参与内核的编译,从而形成一个文件列表,然后再基于该文件列表实现对内核源代码文件的裁剪。Linux内核自动化裁剪的流程如下:
(1)根据需求配置内核,生成.config文件
首先内核研制人员需根据应用场景、硬件设备的特点,手动对内核进行配置,生成内核配置文件.config。
(2)生成参与内核编译的源文件列表
当内核研制人员配置.config文件后,即可实现内核的编译,内核编译主要是将内核源代码.c、.S等文件编译进内核文件、内核模块或库文件。其中,源代码文件在编译时,通常会调用头文件,因此参与编译的文件还会包含.c、.S文件中所调用的.h头文件。最终可以将参与编译内核编译的文件形成一个源代码文件列表list1,显然源代码文件列表list1中的文件是全部Linux内核文件的真子集。
对Linux内核编译时,基于每个子目录的Kbuild Makefile和.config文件,可确定需要参与内核编译的源代码文件列表list1,生成源代码文件列表list1的流程如下图所示:
(3)生成辅助Linux内核配置/构建文件列表
在Linux内核源代码文件中,除了用于编译内核的源代码文件,还有一些用于辅助Linux内核配置、构建的文件,主要包含以下三类:
1)Kconfig文件定义了一套完整的规则来表述配置项及配置项间的关系,是配置项的描述文件,顶层以及各个子目录都包含有Kconfig文件。
2)Kbuild包含5类文件:顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*、kbuild Makefiles。
3)/scripts目录下的文件:该目录只包含了用来配置内核的脚本文件。当配置内核时,需要和该目录下的脚本进行交互。
上述三类文件形成了辅助Linux内核配置、构建的文件列表list2。文件列表list2的生成只需要在源代码目录中根据文件名搜索即可得到。
5、Linux内核源代码裁剪流程设计
在得到文件列表list1、list2之后,通过删除不在list1,list2列表中的文件,即可实现对Linux内核源代码文件进行裁剪,裁剪流程如下:
1)/arch目录裁剪:根据目标平台的架构,将/arch目录下除了目标平台架构的子目录全部删除;
2)/Documentation目录裁剪:该目录包含了关于内核的帮助说明文档,不参与内核编译,因此全部删除;
3)/samples目录裁剪:该目录包含了一些关于内核的编程范例,不参与内核编译,因此全部删除;
4)/tools目录裁剪:该目录包含了一些与内核交互的工具,不参与内核编译,因此全部删除;
5)其它目录裁剪:删除不在文件列表list1、list2中的所有文件。
总之,基于上述步骤,即可实现对Linux内核源代码文件的裁剪。
本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。
Claims (10)
1.一种针对Linux内核源代码的文件级裁剪方法,其特征在于,包括:
根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件;
基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表;以及
根据所述参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪;以及
在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。
2.根据权利要求1所述的针对Linux内核源代码的文件级裁剪方法,其特征在于,所述Makefile文件包含:顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*和kbuild Makefiles,其中,
所述顶层Makefile,是源代码根目录下的Makefile文件,用于编译生成vmlinux和各种模块;
所述内核配置文件.config,.config用户保存用户对内核配置项的设置信息;
所述arch/$(ARCH)/Makefile,根据指定的平台架构对内核进行相应配置,其中,ARCH为X86、ARM64、MIPS或其它CPU架构;
所述scripts/Makefile.*,定义构建内核的通用规则;以及
所述kbuild Makefiles,定义每个内核功能组件的编译规则,其中,如果所述参与编译的源代码文件列表下同时存在Makefile和Kbuild文件,则优先使用所述Kbuild文件。
3.根据权利要求2所述的针对Linux内核源代码的文件级裁剪方法,其特征在于,内核的配置文件.config包括:根据应用场景和硬件设备的特点,手动对内核进行配置,生成内核配置文件.config。
4.根据权利要求3所述的针对Linux内核源代码的文件级裁剪方法,其特征在于,根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中要参与编译的源代码文件包括:
通过make命令进行Linux内核编译,通过顶层Makefile递归向下访问子目录的方式生成vmlinux和各种模块,顶层Makefile通过读取.config文件决定需要访问哪些子目录参与内核的编译;
通过读取arch/$(ARCH)/Makefile的内容确定平台的架构信息;
scripts/Makefile.*文件包含所有关于编译的定义、规则信息;
每个子目录中都有一个Kbuild或Makefile文件,用于执行从其上层目录传递下来的编译命令;以及
所有的Kbuild或Makefile文件从内核配置文件.config中读取内核的配置项信息,从而根据配置项的设置值,选择需要参与编译的源代码文件。
5.根据权利要求2所述的针对Linux内核源代码的文件级裁剪方法,其特征在于,所述Kbuild Makefile用于指定哪些内核源代码文件参与编译,并规定了编译的方式,其中,通过obj-XXX、target-objs和lib-XXX这三个字段进行指定:
所述obj-XXX,语法为obj-XXX=target.o,其中,XXX为y、m或$(CONFIG_YYY);y表示将所述Kbuild Makefile默认编译进内核;m表示将所述Kbuild Makefile默认编译成可动态插入内核的模块;$(CONFIG_YYY)表示所述Kbuild Makefile的编译方式取决于.config中对配置项CONFIG_YYY的设置;target为目标文件的名字,且所述目标文件对应一个target.c或target.S源代码文件,如果“CONFIG_YYY”既不是y也不是m,则所述目标文件将不会被编译也不会被连接;
所述target-objs,语法为target-objs=target1.o target2.o……targetn.o,其中,一个目标文件target.o是由多个子目标文件:target1.o,target2.o,……,targetn.o组成;以及
所述lib-XXX,语法为lib-XXX=target.o,其中XXX是y、m,y:表示将所述KbuildMakefile编译进一个单独的库文件;m:为了一致性,与“y”的定义一致,将目标文件编进一个库文件,lib-XXX通常出现在lib/和arc/*/lib子目录中。
6.根据权利要求1所述的针对Linux内核源代码的文件级裁剪方法,其特征在于,在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序包括:
在配置.config文件后,实现Linux内核编译,其中,所述Linux内核编译是将内核源代码.c、.S文件编译进内核文件、内核模块或库文件;
在编译源代码文件时,调用头文件,参与编译源代码文件包含.c、.S文件中所调用的.h头文件,将参与编译内核编译的源代码文件形成源代码文件列表list1,其中,所述源代码文件列表list1中的文件是全部Linux内核文件的真子集;以及
对Linux内核编译时,基于每个子目录的Kbuild Makefile和.config文件,确定参与内核编译的源代码文件列表list1。
7.根据权利要求1所述的针对Linux内核源代码的文件级裁剪方法,其特征在于,在Linux内核源代码文件中,除了用于编译内核的源代码文件之外,还包括用于辅助Linux内核配置、构建的文件,其中,通过以下三类文件形成辅助Linux内核配置、构建的文件列表list2:
Kconfig文件,定义一套完整的规则来表述配置项及配置项间的关系,是配置项的描述文件、顶层以及各个子目录都包含有Kconfig文件;
Kbuild,包含顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*、kbuild Makefiles;以及
/scripts目录下的文件,包含用来配置内核的脚本文件,当配置内核时,需要与所述scripts目录下的脚本进行交互。
8.根据权利要求7所述的针对Linux内核源代码的文件级裁剪方法,其特征在于,根据所述参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪包括:
在得到文件列表list1、list2之后,通过删除不在所述源代码文件列表list1、list2中的文件,对Linux内核源代码文件进行裁剪,其中,裁剪步骤如下:
/arch目录裁剪:根据目标平台的架构,将/arch目录下除了目标平台架构的子目录全部删除;
/Documentation目录裁剪:该目录包含了关于内核的帮助说明文档,不参与内核编译,因此全部删除;
/samples目录裁剪:该目录包含了一些关于内核的编程范例,不参与内核编译,因此全部删除;
/tools目录裁剪:该目录包含了一些与内核交互的工具,不参与内核编译,因此全部删除;
其它目录裁剪:删除不在文件列表list1、list2中的所有文件。
9.一种针对Linux内核源代码的文件级裁剪系统,其特征在于,包括:
识别模块,用于根据内核的配置文件.config,自动识别出原始Linux内核源代码文件中的要参与编译的源代码文件;
文件列表生成模块,用于基于识别出的要参与编译的源代码文件,形成原始Linux内核源代码文件中参与编译的源代码文件列表;
裁剪模块,用于根据所述参与编译的源文件列表删除不参与编译的源代码文件,达到对Linux源代码进行文件级裁剪;以及
编译模块,用于在对要参与编译的源代码文件执行make命令进行编译时,根据Makefile文件定义的方式来编译源代码和链接程序。
10.根据权利要求9所述的针对Linux内核源代码的文件级裁剪系统,其特征在于,所述Makefile文件包含:顶层Makefile、内核配置文件.config、arch/$(ARCH)/Makefile、scripts/Makefile.*和kbuild Makefiles,其中,
所述顶层Makefile,是源代码根目录下的Makefile文件,用于编译生成vmlinux和各种模块;
所述内核配置文件.config,.config用户保存用户对内核配置项的设置信息;
所述arch/$(ARCH)/Makefile,根据指定的平台架构对内核进行相应配置,其中,ARCH为X86、ARM64、MIPS或其它CPU架构;
所述scripts/Makefile.*,定义构建内核的通用规则;以及
所述kbuild Makefiles,定义每个内核功能组件的编译规则,其中,如果所述参与编译的源代码文件列表下同时存在Makefile和Kbuild文件,则优先使用所述Kbuild文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211154778.9A CN115437684A (zh) | 2022-09-21 | 2022-09-21 | 一种针对Linux内核源代码的文件级裁剪方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211154778.9A CN115437684A (zh) | 2022-09-21 | 2022-09-21 | 一种针对Linux内核源代码的文件级裁剪方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115437684A true CN115437684A (zh) | 2022-12-06 |
Family
ID=84248564
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211154778.9A Pending CN115437684A (zh) | 2022-09-21 | 2022-09-21 | 一种针对Linux内核源代码的文件级裁剪方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115437684A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116166322A (zh) * | 2023-04-24 | 2023-05-26 | 麒麟软件有限公司 | 一种移植Linux内核的方法 |
CN116756196A (zh) * | 2023-08-16 | 2023-09-15 | 麒麟软件有限公司 | 一种快速编辑Makefile文件的方法和插件 |
CN117453202A (zh) * | 2023-12-21 | 2024-01-26 | 深圳市芊熠智能硬件有限公司 | 一种Linux C程序源代码的可视化功能模块编辑方法 |
-
2022
- 2022-09-21 CN CN202211154778.9A patent/CN115437684A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116166322A (zh) * | 2023-04-24 | 2023-05-26 | 麒麟软件有限公司 | 一种移植Linux内核的方法 |
CN116166322B (zh) * | 2023-04-24 | 2023-07-04 | 麒麟软件有限公司 | 一种移植Linux内核的方法 |
CN116756196A (zh) * | 2023-08-16 | 2023-09-15 | 麒麟软件有限公司 | 一种快速编辑Makefile文件的方法和插件 |
CN116756196B (zh) * | 2023-08-16 | 2023-12-26 | 麒麟软件有限公司 | 一种快速编辑Makefile文件的方法和插件 |
CN117453202A (zh) * | 2023-12-21 | 2024-01-26 | 深圳市芊熠智能硬件有限公司 | 一种Linux C程序源代码的可视化功能模块编辑方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115437684A (zh) | 一种针对Linux内核源代码的文件级裁剪方法和系统 | |
US5911074A (en) | Process for manipulating data models used in software engineering | |
TWI536263B (zh) | 將作業系統之原始應用程式介面投射至其它程式語言 | |
KR101099173B1 (ko) | 소프트웨어 스위트를 구축하기 위한 시스템 및 방법 | |
US20030208743A1 (en) | Workflow code generator | |
US8122440B1 (en) | Method and apparatus for enumerating external program code dependencies | |
US20060130026A1 (en) | Method and system for automatically identifying and marking subsets of localizable resources | |
JPH05197697A (ja) | ソフトウエア・システム構築装置及び方法 | |
US20050065953A1 (en) | System and method for changing defined elements in a previously compiled program using a description file | |
JP2012504826A (ja) | 拡張可能な構文を有するプログラミング言語 | |
CN101866315B (zh) | 软件开发工具的测试方法及系统 | |
JP2014525622A (ja) | オペレーティングシステムのネイティブアプリケーションプログラミングインターフェイスのメタデータを用いた記述 | |
US10614227B2 (en) | Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system | |
US9317710B2 (en) | System and method for specification and enforcement of a privacy policy in online services | |
US20060074952A1 (en) | System and method to enable platform personality migration | |
Bolin | Closure: The definitive guide: Google tools to add power to your JavaScript | |
US20100299659A1 (en) | Attribute based method redirection | |
US6944620B2 (en) | File system creator | |
KR20080043345A (ko) | 선언적으로 정의되는 컨트롤 액션 | |
JP4851107B2 (ja) | コンピュータ実施方法 | |
Price | C# 10 and. NET 6–Modern Cross-Platform Development: Build apps, websites, and services with ASP. NET Core 6, Blazor, and EF Core 6 using Visual Studio 2022 and Visual Studio Code | |
CN115794254A (zh) | 基于云计算的组件研发管理平台和方法 | |
CN108304184B (zh) | 编译方法及装置 | |
US20110296373A1 (en) | Command line shell command generation based on schema | |
Schröpfer et al. | A Generic Projectional Editor for EMF Models. |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |