Linux移植之配置过程分析
在Linux移植之移植步骤中已经将Linux移植的过程罗列出来了,现在分析一下Linux的配置过程,将分析以下两个配置过程:
1、make s3c2410_defconfig分析
2、make menuconfig分析
1、make s3c2410_defconfig分析
首先从顶层Makefile开始分析,找到类似smdk2410_defconfig的目标。找到了%config目标。表示后缀为config的目标遵循这个规则,config %config前面的config是一个Kconfig关键字,表示一个配置选项的开始。
config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
继续分析s3c2410_defconfig目标的依赖scripts_basic outputmakefile FORCE
①、scripts_basic 依赖分析,它同样是一个目标。它没有依赖,其中Q表示如果在命令参数中输入V=1则Q=空,表示打印这条规则,反之则不打印这条规则;MAKE=make在系统参数中定义的。
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
build这个变量是一个通用的变量,它定义在$(srctree)/scripts/Kbuild.include文件中,srctree为Linux内核所在目录
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
将scripts_basic 依赖翻译后为
scripts_basic:
make -f $(srctree)/scripts/Makefile.build obj=scripts/basic
表示进入Makefile.build文件make,并且obj参数为scripts/basic。接着打开Makefile.build文件分析,它的目标为:
src := $(obj)
PHONY := __build
__build:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
$(if $(KBUILD_MODULES),$(obj-m)) \
$(subdir-ym) $(always)
@:
接着分析src的作用:$(srctree)/scripts/Makefile.build把src (即scripts/basic)目录下的Makefile包含进来(如果有Kbuild则包含Kbuild)
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))//kbuild-dir=scripts/basic
include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)//如果存在Kbuild就包含Kbuild,否则保护Makefile
再回到最终的目标:规则的命令是一个冒号命令”:”,冒号(:)命令是bash的内建命令,通常把它看作true命令。bash的help解释(help :)为:No effect; the command does nothing. A zero exit code is returned.(没有效果,该命令是空操作,退出状态总是0)。
__build的依赖除了$(always),(builtin−target)(lib-target) (extra−y)(subdir-ym)这些变量在$(srctree)/scripts/basic/Makefile中没有定义,因此builtin-target、lib-target、extra-y、subdir-ym都为空串,只有always有值。always在scripts/kconfig/Makefile中定义为dochecklxdialog,而dochecklxdialog目标所在规则的注释写着# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)。也就是说,build目标的依赖dochecklxdialog是用来检查生成配置对话框所需的ncurses库是不是已经安装在本机了,如果没有安装,make过程会报错退出。因此在make menuconfig前,我们要保证该库已经被安装在本地。
以上文字照抄自配置Linux Kernel时make menuconfig执行流程分析。总结一下也就是说scripts_basic 这个依赖作用是检查ncurses库是否已经安装在本机。这个库在生menuconfog界面时需要用到。
②、outputmakefile 依赖分析,它同样是一个目标,没有依赖。KBUILD_SRC不空的话执行规则。KBUILD_SRC为空所以不执行
outputmakefile:
ifneq ($(KBUILD_SRC),)
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif
③、FORCE依赖分析,它同样是一个目标。如下:
PHONY += FORCE
FORCE:
从上面看到,FORCE 既没有依赖的规则,其底下也没有可执行的命令。如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名。在执行此规则时,目标总会被认为是最新的。就是说:这个规则一旦被执行,make就认为它的目标已经被更新过。这样的目标在作为一个规则的依赖时,因为依赖总被认为被更新过,因此作为依赖所在的规则中定义的命令总会被执行。FORCE所在规则为空,也是什么都不做。FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中,就是相当于是一个关键字,如果我们想要某个目标每次make的时候都一定会被重新生成,就把FORCE写为该目标的依赖。
以上文字照抄自配置Linux Kernel时make menuconfig执行流程分析。
④、接着分析第一条规则$(Q)mkdir -p include/linux include/config,它表示创建include/linux include/config两个文件夹
⑤、最后分析第二条规则$(Q)$(MAKE) $(build)=scripts/kconfig $@,将它展开得到:
make -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig smdk2410_defconfig
上面这句规则的意思是调用Makefile.build文件,最终的目标为s3c2410_defconfig,由上面第①条分析可知,Makefile.build文件包含了scripts/kconfig/Makefile,而s3c2410_defconfig正是定义在这个文件中:
%_defconfig: $(obj)/conf
$(Q)$< -D arch/$(ARCH)/configs/$@ arch/$(ARCH)/Kconfig
展开得:
s3c2410_defconfig: scripts/kconfig/conf
scripts/kconfig/conf -D arch/arm/configs/s3c2410_defconfig arch/arm/Kconfig
它的意思是先是生成conf程序,然后利用conf程序解析 s3c2410_defconfig文件与Kconfig文件配置单板,最后生成 .config文件,供make uImage时调用
1、make menuconfig分析,这个目标与s3c2410_defconfig目标一致,都是%config,所以只是分析最后阶段,调用Makefile.build文件,包含了scripts/kconfig/Makefile,而menuconfig正是定义在这个文件中:
menuconfig: $(obj)/mconf
$< arch/$(ARCH)/Kconfig
故menuconfig目标的规则的命令为scripts/kconfig/mconf arch/arm/Kconfig。mconf在这里实际上是scripts/kconfig目录下的一个可执行文件,此条命令里arch/arm/Kconfig字符串作为命令行参数传入该可执行文件运行,该可执行文件如果存在.config的内容,则依据.config的内容文件,生成配置界面;否则依据arch/arm/Kconfig文件提供的菜单配置,生成配置界面。
NOTE: 这里为什么说scripts/kconfig/mconf就是一个可执行文件呢?继续往下看scripts/kconfig/Makefile中的内容:
lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o conf-objs := conf.o zconf.tab.o
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
kxgettext-objs := kxgettext.o zconf.tab.o hostprogs-y := conf qconf gconf kxgettext ifeq ($(MAKECMDGOALS),menuconfig)
hostprogs-y += mconf
endif ifeq ($(MAKECMDGOALS),xconfig)
qconf-target :=
endif
ifeq ($(MAKECMDGOALS),gconfig)
gconf-target :=
endif ifeq ($(qconf-target),)
qconf-cxxobjs := qconf.o
qconf-objs := kconfig_load.o zconf.tab.o
endif
如果在编译内核的过程中,需要现编译出一些可执行文件供内核编译阶段使用,就需要借助Kbuild框架的本机程序支持的特性。Kbuild 框架中,专门使用hostprogs-y变量来指示在内核编译阶段需要使用的一些可执行文件,通过hostprogs-y += mconf,就向make程序指明mconf是一个编译阶段需要使用的可执行文件。另外,Kbuild框架使用-objs后缀来指明相应的可执行文件需要通过多个目标文件来链接生成,mconf-objs := mconf.o zconf.tab.o $(lxdialog)就是向make指明,mconf文件是由mconf.o zconf.tab.o lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o链接生成的。再有,未明确写明生成规则时,Kbuild框架默认.o文件是由同名.c或.S文件编译生成的。
保存配置信息后会在内核根目录下生成一个.config文件,该文件保存了所做的内核配置信息。
参考自配置Linux Kernel时make menuconfig执行流程分析。
Linux移植之配置过程分析的更多相关文章
- Linux移植之make uImage编译过程分析
编译出uboot可以运行的linux内核代码的命令是make uImage,下面详细介绍下生成linux-2.6.22.6/arch/arm/boot/uImage的过程: 1.vmlinux.Ima ...
- Linux移植之auto.conf、autoconf.h、Mach-types.h的生成过程简析
在Linux移植之make uImage编译过程分析中分析了uImage文件产生的过程,在uImage产生的过程中,顺带还产生了其它的一些中间文件.这里主要介绍几个比较关键的文件 1.linux-2. ...
- Linux移植之tag参数列表解析过程分析
在Linux移植之内核启动过程start_kernel函数简析中已经指出了start_kernel函数的调用层次,这篇主要是对具体的tag参数列表进行解析. 1.内存参数ATAG_MEM参数解析 2. ...
- Linux移植之子目录下的built-in.o生成过程分析
在Linux移植之make uImage编译过程分析中罗列出了最后链接生成vmlinux的过程.可以看到在每个子目录下都有一个built-in.o文件.对于此产生了疑问built-in.o文件是根据什 ...
- Linux移植之内核启动过程引导阶段分析
在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压.自解压完成之后内核代码从物理地址为0x30008000处开始运行.下面分析在 ...
- linux移植问题汇总(一)
linux移植问题汇总(一) 在此记录移植linux过程中出现的问题以及解决方法. 项目GitHub地址 linux3.0.80:https://github.com/numbqq/linux-3.0 ...
- 嵌入式linux移植LAMP服务器
一.工具准备工作 要想在ARM平台上移植一套Apache+Msql+PHP的Web型服务器. 所用物理机系统: Ubuntu 14.04 LTS(64位) 交叉编译环境: arm-linux-g ...
- Ubuntu Linux下如何配置Android开发环境
下载和安装Win7系统Android开发环境中讲了怎样在Win7系统中安装Android开发环境,那么怎样在Linux系统中配置Android开发环境呢?本篇文章就将演示如何使用Eclipse.And ...
- [置顶] ARM-Linux下WEB服务器Boa的移植、配置和运行测试
Linux下使用的轻量级WEB服务器主要有:lighttpd.thttpd.shttpd和boa等等,而Boa是使用最为广泛的轻量级WEB服务器之一(当然,阿帕奇是世界使用排名第一的Web服务器软件) ...
随机推荐
- [原创]delphi在win7下创建共享文件夹源代码
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 获取当前ip
测ip地址http://2018.ip138.com/ic.asphttps://www.ip.cn/
- Windows 10 显示中的仅更改文本大小和加粗选项
问题描述: 在Windows 10 1703 之前的版本,在控制面板-显示中,存在如下图中的图形界面设置: 系统升级到Windows 10 1703 或是Windows 10 1709 之后,不再存在 ...
- tomcat架构分析(valve机制)
关于tomcat的内部逻辑单元的存储空间已经在相关容器类的blog里阐述了.在每个容器对象里面都有一个pipeline及valve模块. 它们是容器类必须具有的模块.在容器对象生成时自动产生.Pipe ...
- java spring bean的什么周期
http://www.cnblogs.com/TIMHY/p/7794973.html
- 消息队列RabbitMQ与Spring
1.RabbitMQ简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. 官网:http://www.rabbitmq.c ...
- MVC003之调用BLL层方法(BLL层调用了WebService)
项目又BLL类库,在类库中引用了webservice.在web层调用BLL的方法时 错误如下: 在 ServiceModel 客户端配置部分中,找不到引用协定“OAService.IntranetSe ...
- metasploit framework(五):meterpreter基本命令和python扩展
基于内存的DLL注入式payload 注入合法的系统进程并建立stager 基于stager上传和预加载DLL进行扩展模块的注入(客户端API) 基于stager建立的socket连接建立加密的TLS ...
- nutch笔记
1.Nutch 是一个开源Java实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫.
- WPF背景透明内嵌WebBrowser不显示问题,即AllowsTransparency = true 和 Webbrowser 等控件显示冲突
首先感谢两位先导者: 1. 解决 WPF AllowsTransparency = true 和 Webbrowser 等控件显示冲突 原文地址:https://www.cnblogs.com/zhi ...