Linux移植之配置过程分析

发布者:BlissfulCharm最新更新时间:2024-08-26 来源: cnblogs关键字:Linux  移植  配置过程 手机看文章 扫描二维码
随时随地手机看文章

在Linux移植之移植步骤中已经将Linux移植的过程罗列出来了,现在分析一下Linux的配置过程,将分析以下两个配置过程:


1、make s3c2410_defconfig分析


2、make menuconfig分析


1、make s3c2410_defconfig分析


首先从顶层Makefile开始分析,找到类似smdk2410_defconfig的目标。找到了%config目标。表示后缀为config的目标遵循这个规则,config %config前面的config是一个Kconfig关键字,表示一个配置选项的开始。


416    config %config: scripts_basic outputmakefile FORCE

417        $(Q)mkdir -p include/linux include/config

418        $(Q)$(MAKE) $(build)=scripts/kconfig $@

继续分析s3c2410_defconfig目标的依赖scripts_basic outputmakefile FORCE


①、scripts_basic 依赖分析,它同样是一个目标。它没有依赖,其中Q表示如果在命令参数中输入V=1则Q=空,表示打印这条规则,反之则不打印这条规则;MAKE=make在系统参数中定义的。


328    scripts_basic:

349        $(Q)$(MAKE) $(build)=scripts/basic

build这个变量是一个通用的变量,它定义在$(srctree)/scripts/Kbuild.include文件中,srctree为Linux内核所在目录


121    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文件分析,它的目标为:


005    src := $(obj)


007    PHONY := __build

008    __build:


083    __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))

084         $(if $(KBUILD_MODULES),$(obj-m))

085         $(subdir-ym) $(always)

086        @:


接着分析src的作用:$(srctree)/scripts/Makefile.build把src (即scripts/basic)目录下的Makefile包含进来(如果有Kbuild则包含Kbuild)


16    kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))//kbuild-dir=scripts/basic

17    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为空所以不执行


358    outputmakefile:

359    ifneq ($(KBUILD_SRC),)

360        $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile

361            $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)

362    endif

 

③、FORCE依赖分析,它同样是一个目标。如下:


1491    PHONY += FORCE

1492    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正是定义在这个文件中:


66    %_defconfig: $(obj)/conf

67        $(Q)$< -D arch/$(ARCH)/configs/$@ arch/$(ARCH)/Kconfig

展开得:


66    s3c2410_defconfig: scripts/kconfig/conf

67        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正是定义在这个文件中:


13    menuconfig: $(obj)/mconf

14        $< 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 := 1

endif

ifeq ($(MAKECMDGOALS),gconfig)

    gconf-target := 1

endif



ifeq ($(qconf-target),1)

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  移植  配置过程 引用地址:Linux移植之配置过程分析

上一篇:Linux移植之make uImage编译过程分析
下一篇:Linux移植之移植步骤

推荐阅读最新更新时间:2026-03-21 17:17

TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程
1、U-Boot 工程简介 U-Boot ,全称为Universal Boot loader, 即通用Bootloader。 它的名字有两重含义:可以引导多种操作系统:Linux、NetBSD、VxWorks0、QNX、RTEMS、ARTOS、Lynx等; 支持多种架构的CPU :PowerPC、MIPS、x86、ARM、NIOS、XScale等。 具有如下特性: 2、U-Boot 源码结构 在 U-Boot-1.1.6 的基础上分析和移植,从sourceforge 网站下载U-Boot-1.1.6.tar.bz2 后解压即可得全部源码。 U-Boot-1.1.6 根目录下共有26个子目录,可以分为4
[单片机]
TQ2440 学习笔记—— 28、<font color='red'>移植</font>U-Boot【U-Boot 的<font color='red'>配置</font><font color='red'>过程</font>】
ABB机器人示教器Dsqc62版的配置过程
很多学员在学习和使用机器人的过程中,会遇到一个很重要的东西,就是我们机器人要做输入输出时需要配置对应的信号。 那我们配置对应信号的前提是要配置IO版。本篇文章就是基于已经配置好了DSQC652的信号板情况下的一个IO设置。 注意:各位学员需要注意,并不是所有信号板都是DSQC652,要根据你的信号板进行配置。 DSQC652板 一、 检查是否支持已经配置好io板 1.打开主菜单,点击控制面板。 2.找到控制面板中的配置进行点击 3.找到devicenet device点击进去 4.在这边查看是不是已经配置好652板 二、 添加组输入信号 1.我们打开菜单之后,选择控制面板。 2.进入控制面板之后选择
[嵌入式]
ABB机器人示教器Dsqc62版的<font color='red'>配置</font><font color='red'>过程</font>
PLC定位控制项目配置过程
一、项目配置方法 通过工艺对象的方式进行驱动的基本定位器功能,驱动工艺对象的使用说明如下。 (1) 新建博途项目,添加1500PLC,组态与驱动的网络连接 (2) 配置驱动的通信报文为111 示例1. V90 PN的设置 示例2. S120的设置 (3) 双击“工艺对象”中的“新增对象”,在弹出的画面中选择“SINAMICS” (4) 为工艺对象配置驱动,本示例选择S120中的驱动轴_1 (5) 在程序块中调用“TO_BasicPos”命令来实现驱动的基本定位功能控制 二、TO_BasicPos功能块介绍 TO_BasicPos功能块输入/输出参数说明见表2-1。 表2-1 TO_BasicPos
[嵌入式]
PLC定位控制项目<font color='red'>配置</font><font color='red'>过程</font>
uboot总结:uboot配置和启动过程3(config.mk分析)
说明:文件位置:在uboot的目录下,文件名为:config.mk。是一个makefile文件,以后会被主Makefile调用。 它的主要作用的是: (1)具体的设置交叉编译工具链接(主Makefile中也有设置交叉编译工具链) (2)加载include/autoconfig.mk文件(这个文件是在主Makefile中生成的) (3)指定-Ttext链接地址 (4)makefile的推导规则 下面来具体的分析代码: 1、设置交叉编译工具链 2、加载autoconfig.mk文件,这个文件是在主Makefile中生成 3、设置链接地址,这个TEXT_BASE是在主Makefile中的x210_sd_config部分配
[单片机]
stm32异步串口通讯配置过程
| 串口是一种全双工通讯方式 单工 数据传输只支持数据在一个方向上传输 半双工 允许数据在两个方向上传输,在同一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信 全双工 允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力 异步串口常见连接方式 相同端口数据传输 不同端口数据传输 这里必须保证通讯两端数据共地,此外还需注意不同端口间的电平转换,如TTL、232. | 异步通讯时序图 这里以8位字长为例,进行数据传输时,接收方首先捕捉数据起始位- -由高电平到低电平的数据跳变,低电平会保持一个数据周期(空闲时,数据线保持高电平)
[单片机]
STM32F0xx_ DAC输出电压配置详细过程
前言 数模转换DAC的功能在现实应用中所占的分量,相对定时器TIM、串口USART等要小的多,这也是ST为什么内部集成DAC模块相对来说不是那么多的原因。但在有需要使用数模转换功能的项目中,自带的这个DAC模块基本上可以取代外挂一片DAC芯片,因为自带的这个模块功能也很强大,只需要简单的配置一下就可以输出指定的电压信号(如:PWM波形、三角波、正选波),中途无需要软件干预。当然,今天提供的软件工程只有输出电压的基本操作,没有输出特殊的波形。但是,当你了解输出电压的原理之后,以后你想输出这些特殊的波形,也就容易多了。 STM32F0系列的DAC功能大部分是单通道,相对比较简单。只有STM32F072系列芯片是两路输出通道、有DA
[单片机]
STM32F0xx_ DAC输出电压<font color='red'>配置</font>详细<font color='red'>过程</font>
STM32F0xx_看门狗 (独立+窗口)配置详细过程
Ⅰ、概述 对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗。 今天提供两种看门狗的软件工程实例,供大家下载。 两种看门狗各有各的特点,应用在不同的场合,下面将分别简单总结一下独立和窗口看门狗的功能。 Ⅱ、下载 文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。 ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手
[单片机]
STM32F0xx_看门狗 (独立+窗口)<font color='red'>配置</font>详细<font color='red'>过程</font>
STM32F0xx_ EXIT中断配置详细过程
Ⅰ、概述 EXIT外部中断在使用到按键或者开关控制等应用中比较常见,低功耗中断唤醒也是很常见的一种。因此,EXIT在实际项目开发中也是比较常见的一种。 STM32F0中外部中断EXIT属于中断和事件的章节,请看参考手册第十二章,但需要配合系统配置控制器(System configuration controller)进行操作,为中断分配引脚,详情请看参考手册第十章。 Ⅱ、下载 文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。 ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考
[单片机]
STM32F0xx_ EXIT中断<font color='red'>配置</font>详细<font color='red'>过程</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved