Linux移植之配置过程分析

发布时间:2024-08-26  

在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的物联网设备或家庭自动化系统制造商经常需要处理的事项。在这种情况下,制造商可能会定期发布设备上运行的操作系统或应用软件更新,以便提高性能、增添新功能或修复发现的安全漏洞。制造......
    Device Manager (SBDM) 是总部位于瑞士的存储和安全专家 Swissbit 用于管理存储设备的软件工具。最新版本的 SBDM 使客户能够进行固件更新,同时还提供 Swissbit......
    部位于瑞士的存储和安全专家 Swissbit 用于管理存储设备的软件工具。最新版本的 SBDM 使客户能够进行固件更新,同时还提供 Swissbit 存储解决方案生命周期状态的全面数据和分析。因此,该软件......
    可视化和测量快照捕捉足以满足需求。而面对复杂挑战时,我们的技术合作伙伴网络则提供了一系列高性价比的专业软件工具,能够满足不同行业的需求。”此次CanKing 7软件更新,不仅吸纳了用户的宝贵反馈,更充......
    车载总线数据库转换工具 - INTEWORK-VDC;随着车载总线数据库设计工具INTEWORK-VDE的推出,经纬恒润软件团队也对原HiFire.Sure软件进行了重构和升级,并重新命......
    自适应刷新的存储器系统“,申请公布号为CN118525334A,申请日期为2023年1月13日。 国家知识产权局信息显示,本专利公开了一种具有自适应刷新命令的存储器系统。在一个方面,在通道内具有多个存储体的存储器系统或设备可以从应用处理器接收每存储体命令......
    想要永久修改可以使用env save命令将当前内存中的环境变量更新到外部存储设备中。     使用run bootcmd_pxe开始下载linux内核与设备树文件。看到......
    ,可以设计一段特定的驻留代码,专门用于接收来自主机新的代码,将其烧写到相应的Flash空间,完成后跳转到新的代码去执行新的程序,用户程序接收到来自主机的更新命令后跳转到这段驻留代码。驻留代码通过串口接收命令......
    更轻松地为其车队采购和构建一个端到端的 OTA 系统。 Elektrobit-Airbiquity joint OTA solution OTA 软件更新可推动 OEM 厂商的新兴业务模式的发展并增加其收入来源。例如:到 2028......
    ; 3) 更新软件源 执行以下命令更新软件源: # apt update The software package is provided......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>