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移植之移植步骤

推荐阅读最新更新时间:2024-11-10 10:54

如何利用STM32CubeMX将TouchGFX移植到STM32F429IGT6并驱动RGB屏
TouchGFX的应用框架如下图所示: 1.STM32CubeMX配置 STM32CubeMX主要用来配置上面所示的应用框架图中的硬件抽象层和中间件层 RCC系统时钟:高速外部时钟(HSE)配置为外部晶振 由于要使用 FreeRTOS 操作系统 ,因此建议将HAL库的 Ti mebase Source从SysT ic k改为其他 定时器 ,选好定时器后,系统会自动配置TIM,此处设置为TIM7 FMC设置:配置外部 SD RAM 来作为RGBLCD的显存,根据自已的硬件进行参数以及引脚配置 DMA2D设置:激活DMA2D,配置颜色模式为RGB565,并开启DMA2D中断 LTDC参数设置:根据使用的屏幕参数
[单片机]
如何利用STM32CubeMX将TouchGFX<font color='red'>移植</font>到STM32F429IGT6并驱动RGB屏
玩转USB HID系列:Linux下使用Python开发USB HID
实验环境 ubuntu 16.04 LTS 64-bit python 3 STM32做下位机 开发步骤 安装pyusb 库 pip install pyusb 我们来与HID设备通讯! 我的STM32信息: interface 0 END POINT 0x01: OUT END POINT 0x82: IN 包大小:64 byte 完成功能:PC机向STM32写入2个字节(查询命令) STM32返回5个字节: :数据长度(这里应该为4) - :一个double的电压值的内存形式 import usb.util import usb.core import sys from ctypes import * import
[单片机]
STM32-不同芯片的移植
在实际项目中,我们根据项目需求选用最合适的芯片型号,有时会涉及到一个工程代码在不同芯片上的使用,不同型号的芯片如何移植呢?通过本文,您将了解基本的移植过程。 1.准备工作 1.1 根据芯片的命名规则确定要移植的型号的flash大小 其中用到的是芯片类型的flash的大小,比如STM32F103VBT6,表示flash大小的位为“B”,对应的是128k字节,由此可以该型号的flash大小。 1.2 根据flash大小选择合适的启动文件 ST官方提供了3个启动文件,分别适用于不同flash容量的STM32芯片,跟别为: startup_stm32f10x_ld.s 适用于小容量 产品 startu
[单片机]
STM32-不同芯片的<font color='red'>移植</font>
基于嵌入式Linux的家居监控系统设计
   1 系统流程架构   本系统的操作系统平台为Linux, 内核版本为2.6,目标板上包括视频采集、GPRS 模块和控制器S3C2440.控制器主要是负责向客户显示及后端服务提供图像数据。视频服务器的启动方式是由后台或触发启动。当用户触发事件时自动启动采集程序或者由用户远程启动,再进行图像数据的抓取。    2 系统设计    2.1 Linux 下设备驱动   Linux 是免费的操作系统,其源代码是公开的,我们能够根据实验的需求进行必要的研究和修改。在Linux 操作系统中,设备都是以文件形式的存在,对设备的操作就是对文件的操作,使用户可以调用通用的文件操作函数来进行访问和操作设备。 设备驱动程序是Linux
[电源管理]
arm linux 启动流程
本文探讨Linux操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。 这个部分比较有意思。因为在BIOS阶段(相当与嵌入式ARM Linux的 bootloader),计算机的行为基本上被写死了,程序员可以做的事情并不多;但是,一旦进入操作系统,程序员几乎可以定制所有方面。所以,这个部分与程序员的关系更密切。 我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统。下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉。 第一步、加载内核 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。 以我的电脑为例,/boot 目录下面大概是这样一些文件,ARM Linux一
[单片机]
arm <font color='red'>linux</font> 启动流程
ARM-Linux汇编到ADS汇编转换需要注意的问题
最近那些课比较麻今天拿出一段nand准备在ADS下搭建调试环境,发现两家的汇编代码有但不兼容,需要修改一下.现在罗列一下我主要修改的地方,其他很多可能没遇到,大家还是自己查一查文档吧。 1、修改头 如arm-linux汇编头: .text .global_start _start: 修改为ads版本: AREA nand1, CODE,READONLY ENTRY 注意AREA和ENTRY前面都有tab空格,否则编译出错。 2、修改段标志 去掉arm-linux汇编中的:号即可在ads中使用。 3、ads需要加上ENTRY和END指令表示程序入口和结束标志 4、ADS中的C语言混编 与arm-l
[单片机]
ARM-<font color='red'>Linux</font>汇编到ADS汇编转换需要注意的问题
u-boot1.1.6在s3c2440上移植
我用的2440开发板,取名为TX2440。 第一步:U-Boot -1.1.6需要交叉编译工3.3.2,首先安装arm-linux-gcc-3.3.2.tar.bz2。 第二步:将U-Boot-1.1.6放入smb服务器,在linux下解压。 (1)到U-boot-1.1.6目录下:cd u-boot-1.1.6 修改cpu/arm920t下的config.mk文件,将其中的-msoft-float注释掉: vi cpu/arm920t/config.mk #-msoft-float(意思是不使用软浮点进行编译。我们使用 的还是硬浮点) (2)修改U-boot-1.1.6目录下Makefile: 在smdk2410_config
[单片机]
linux操作系统交叉编译环境的建立方法
基于linux操作系统的应用开发环境一般是由目标系统硬件(开发板)和宿主PC机所构成。目标硬件开发板用于运行操作系统和系统应用软件,而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主PC机来完成(所以称为交叉编译)。双方之间一般通过串口,并口或以太网接口建立连接关系。   但在此我建议构建如下的交叉编译环境,适合个人或研发小组使用:单独拿出一台PC机(PII以上即可,就用以前淘汰的旧机器就可以),在该PC上安装桌面的Linux操作系统(如Red Hat Linux 8.0及以上),可以采用默认的安装选项(注意要包含ftp服务),这台PC作为Linux服务器,除管理员以外,一般不直接让其他人去操作。
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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