Kernel 编译配置机制

编译kernel前需要一个配置相关的编译选项,最终的配置文件就是kernel根目录路下的 .config 文件

一:.config

这个文件里面保存的是kernel的配置选项,格式如下:

CONFIG_XX_XX=y/n/m/0xFFFFFF/32/”XXXXXXX”

这个文件由/scripts/kconfig/mconf.c负责解析,然后解析该文件并将解析结果以宏定义的形式写入到/include/generated/autoconf.h中。/include/generated/autoconf.h将会被/include/linux/kconfig.h包含,

因此,需要关心配置情况的内核源文件只需要#include <linux/config.h>即可。

二:make menuconfig

分析一下这个主make menuconfig在Makefile中的大体流程,我的内核版本:

VERSION = 3
PATCHLEVEL = 1
SUBLEVEL = 10
EXTRAVERSION =

make menuconfig 与主Makefile 中的%config 目标匹配:

依赖关系:

%config: scripts_basic outputmakefile FORCE
	./mpatch_gen.sh
	$(Q)mkdir -p include/linux include/config
	$(Q)$(MAKE) $(build)=scripts/kconfig [email protected]

依赖 scripts_basic outputmakefile FORCE 这三个目标

1:FORCE

其中 FORCE 为伪目标

PHONY += FORCE
FORCE:

PHONY 中的项目被称为伪目标,伪目标作为另外一个目标的依赖时,每次执行此规则是,伪目标所定义的指令都会执行。这个规则没有命令也没有依赖,它的目标也不是一个存在的文件名。在执行此规则时,目标FORCE总会被认为是最新的。这样当它作为其它规则的依赖时,因为依赖总被认为被更新过的,所以那个规则的中定义的命令总会被执行。

在这里 每次执行make menuconfig 时候 都认为 FORCE 是更新过的 ,下面的三条命令也一定会执行!

2:scripts_basic

# Basic helpers built in scripts/
PHONY += scripts_basic
scripts_basic:
	$(Q)$(MAKE) $(build)=scripts/basic
	$(Q)rm -f .tmp_quiet_recordmcount

build变量定义在scripts/kbuild.include中:

###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

这样看,上面的规则可以写成:

$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic

这个规则的命令最终会进入scripts目录,执行Makefile.build文件,并传递参数obj=scripts/basic.

这个往里面走就是到scripts/Makefile.build 中:

src := $(obj)

包含Makefile文件:

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)

第一个目标,

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) 	 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) 	 $(subdir-ym) $(always)
	@:

到这里其实只是构建了 $(builtin-target)等变量指定的目标,$(always)变量在这个Makefile中定义。

3:outputmakefile

看一下依赖关系:

PHONY += outputmakefile
# outputmakefile generates a Makefile in the output directory, if using a
# separate output directory. This allows convenient use of make in the
# output directory.
outputmakefile:
ifneq ($(KBUILD_SRC),)
	$(Q)ln -fsn $(srctree) source
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile 	    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif

当变量$(KBUILD_SRC)为空的时候,运行一个shell脚本scripts/mkmakefile,并传递四个参数。这个脚本主要是在$(objtree)参数指定的目录中生成一个Makefile文件。由于这里KBUILD_SRC为空,所以这个脚本并不会被执行。

4:规则命令

处理完上面的三个依赖之后,就执行接下来的命令,

我这边运行了一个shell脚本,配置了mpatch,然后创建了两个目录,按照上面的规则展开第三条命令:

$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build  obj =scripts/kconfig menuconfig

这个命令依然是执行scripts/Makefile.build这个makefile文件。并执行它里面menuconfig的规则。根据上面的分析,在Makefile.build会包含scripts/kconfig/Makefile文件。然后执行以menuconfig为目标的规则:

menuconfig: $(obj)/mconf
	@scripts/checkconfig/check-config.sh
	@echo "*** jscese test  ‘$(Kconfig)‘"
	$< $(Kconfig)

这里调用了mconf:

# mconf:  Used for the menuconfig target
#         Utilizes the lxdialog package

我这里还运行了check脚本,判断目前的.config文件的内容,检测里面的参数。

然后就运行加载了$(Kconfig)

ifdef KBUILD_KCONFIG
Kconfig := $(KBUILD_KCONFIG)
else
Kconfig := Kconfig

$(KBUILD_KCONFIG)是没有定义的,所以首先被调用加载的 是kernel 根目录下的Kconfig 文件

三:Kconfig

上面从make menuconfig中分析最后调用的也就是根目录的Kconfig文件,这也是第一个加载的Kconfig文件:

#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"

config SRCARCH
	string
	option env="SRCARCH"

source "arch/$SRCARCH/Kconfig"

这里的$(SRCARCH) 在主Makefile 里面定义,我的这是arm平台,流程如下:

target_ARM = $(shell cat .config | sed -n ‘/CONFIG_ARM=/p‘ | wc -l )
ifeq ($(target_ARM),1)
SUBARCH = arm
endif
ARCH	 ?= $(SUBARCH)
SRCARCH := $(ARCH)

是读取了.config中的 CONFIG_ARM的值来确定的。

接下来就是加载 arch/arm/Kconfig 这个Kconfig文件了!

Kconfig文件是Kernel配置机制的核心所在,Kernel 的源代码里面含有很多个Kconfig文件,基本上每一层的目录里面都有,分别对应各个功能模块,各个Kconfig之间通过 source 命令加载。

四:关系

.config文件是最终的配置文件,通过make menuconfig命令调用了mconf  来解析出.config里面的值,因为要形成图形操作配置界面,那么就要加载每一个值的配置规则以及依赖关系,所以就需要加载Kconfig文件来对.config中的值在图形界面上进行配置和操作的规则!在图形界面上进行操作剪裁之后,可以保存到.config中去,同时mconf也会将结果生成到/include/generated/autoconf.h中,以供整个kernel使用,这个过程可以研究mconf.c的源代码。

这里对整个配置体系的大体结构分析学习了一下,后续学习config语言以及与makefile之间的关系!

撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/25147245

Kernel 编译配置机制,布布扣,bubuko.com

时间: 2024-08-06 11:58:38

Kernel 编译配置机制的相关文章

linux内核的配置机制及其编译过程

linux内核的配置机制及其编译过程 国嵌第一天第三节:讲解的是内核在X86平台上的配置.安装过程,制作自己的Linux系统,并双系统启动. <Linux系统移植>第四章 http://blog.csdn.net/zhengmeifu/article/details/7682373 Linux内核具有可定制的特点,具体步骤如下: 1.1.1 配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Lin

嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译

嵌入式 Linux开发Kernel移植(二)--kernel内核配置和编译 本文选择linux 2.6.35.7版本kernel进行实践. 一.linux kernel源码目录分析 Kbuild,Kernel Build,管理内核编译的文件 Makefile,kernel工程的Makefile. arch,体系架构,arch目录下的子目录存放的是不同种类的架构 block,块设备,一般是存储设备,存放的块设备管理的相关代码 crypto,加密相关,存放加密算法实现代码 Documentation

kernel编译

Linux内核编译与安装 Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.Linux内核的一大特点就是采用了整体式结构,有很多过程组成,每个过程都可以独立编译,其模块机制又湿得内核保持独立而又易于扩充.Linux发行版实在Linux内核的基础之上,与外带的应用软件和工具打包配置之后发行的版本.最初的Linux内核在1991年由当时还在芬兰赫尔辛基大学计算机系读书的Linus T

spring注解机制和XML配置机制之间的比较

XML配置的优缺点: 优点有:1. XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译.2. 在处理大的业务量的时候,用XML配置应该更加好一些.因为XML更加清晰的表明了各个对象之间的关系,各个业务类之间的调用.同时spring的相关配置也能一目了然.当然,有人会说,用XML配置,在大的业务量时候会使得XML文件过大,不容易查看.这一点我们完全可以利用业务分解书写多个XML配置文件就可以了. 3.xml,在乎:整体业务关系:维护性. 缺

Kernel编译安装

写在前面: 博客书写牢记5W1H法则:What,Why,When,Where,Who,How. 本篇主要内容: ● kernel编译安装 kernel编译安装 回顾: 源码包编译安装步骤: (1)编译环境:开发软件包组.头文件.库文件 (2)./configure (3)make (4)make install kernel编译安装: (1)开发环境 包组: Development Tools Server Platform Development 其他: make menuconfig依赖包:

使用kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务的迷你主机

在运维工作中很多时候我们需要裁剪Linux系统,减少系统性能的消耗,提升系统服务的性能,以往通过光盘安装的Linux都是比较臃肿的,但出现这样的需求后,我可以对Linux进行重新编译再busybox工具移植即可实现,接下来我们一步一步实现kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务: 实现过程如下: 一.规划子主机的磁盘存储规划 1.添加一个大小为10G的硬盘 2.查询系统硬件信息参数: # lspci  00:00.0 Host bridge: Inte

Spring配置机制的优缺点 - Annotation vs XML

转自 http://tianzongqi.iteye.com/blog/1458002 XML配置的优缺点: 优点: XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译. 在处理大的业务量的时候,用XML配置应该更加好一些.因为XML更加清晰的表明了各个对象之间的关系,各个业务类之间的调用.同时spring的相关配置也能一目了然.当然,有人会说,用XML配置,在大的业务量时候会使得XML文件过大,不容易查看.这一点我们完全可以利用业务分解

转载:Centos7 从零编译配置Memcached

序言 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. 当然memcached分为服务端和客户端.服务端用来存放缓存,客户端用来操作缓存. 客户端有两种常见的实现方式. 第一种是用php代码根

大型项目使用Automake/Autoconf完成编译配置

使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefile,而且换个编译环境,Makefile还需要修改(Eclipse也是这样). 这么好的东东当然要拿来用了,但GNU的Autotool系列博大精深,工具数量又多,涉及的语言也多,要是自己从头看到尾,黄花菜都凉了,项目估计早就结束了:上网搜样例倒是有一大堆,但都是“hello world”的样例,离真