1_5.1.2_U-boot分析与使用_u-boot分析之Makefile结构分析_P

发布者:lxy64420245最新更新时间:2021-08-19 来源: eefocus关键字:U-boot  Makefile  结构分析 手机看文章 扫描二维码
随时随地手机看文章

我们分析一个文件的时候,最好的方式就是看它的makefile。


之前体验编译uboot时,我们第一步是配置uboot,第二步是编译。


分析配置uboot指令

配置uboot使用的指令是make 100ask24x0_config。


首先找到Makefile,用vim打开,查找100ask24x0_config,定位如下:

在这里插入图片描述

那么make 100ask24x0_config其实就是执行@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0指令,下面分析这条指令。


最左边的@符号表示执行该命令时不在终端显示该命令,然后是一个变量MKCONFIG,查找该变量的定义,可以看到该变量指向的是当前目录下的mkconfig文件。(CURDIR变量是makefile的内嵌变量,表示的是当前目录)

在这里插入图片描述

然后$(@:_config=)中@符号表示的是目标文件,(@:_config=)就是将目标文件名中的_config替换为空,这里就是将100askx0_config替换为100ask24x0。


所以@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0指令其实就是

@./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0。

在这里插入图片描述

下面解析@mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0指令。

在这里插入图片描述

打开mkconfig 文件,从上往下开始分析。


其中"$ #“表示的是所有参数的个数(PS:”$ @"表示所有参数),-gt是大于0的意思(greater than),所以这个while循环的意思是,如果参数个数大于0,那么执行do,如果第一个变量符合哪个格式,那么执行相应的操作,这里的$1是100ask24x0,所以直接break不执行任何操作,直接退出。


-gt是大于的意思(greater than)。

-eq是等于的意思(equal)。

-ne是不等于的意思(no equal)。

-ge是大于等于的意思(greater equal)。

-lt是小于的意思(less than)。

-le是小于等于的意思(less equal)。

在这里插入图片描述

这条指令的指令流程是先左边,如果左边成立就不执行后面的操作。


在文件的开始有将BOARD_NAME设为"",所以这里会执行后面那个操作,将BOARD_NAME设为$1,也就是100ask24x0。

在这里插入图片描述

所以执行完这条指令,BOARD_NAME = “100ask24x0”。

在这里插入图片描述

然后判断参数的个数是否小于4,如果小于则退出,大于6的话也退出。

在这里插入图片描述

然后在中断上输出一个信息。

在这里插入图片描述
在这里插入图片描述

判断SRCTREE和OBJTREE是否相等。

在这里插入图片描述

查看Makefile,SRCTREE为当前目录。

在这里插入图片描述

如果BUILD_DIR定义了的话,那么OBJTREE等于 $ (BUILD_DIR),否则等于 $ (CURDIR)。

在这里插入图片描述

查看BUILD_DIR,没有定义o,所以BUILD_DIR也没有定义,那么OBJTREE也为当前目录。

在这里插入图片描述

所以SRCTREE == OBJTREE,那么执行else的操作。切换到当前目录下的include文件夹,删除asm文件夹,将asm-arm链接为asm,也就是以后执行asm,就替换为执行asm-arm。(ln是链接指令,-s表示建立符号链接,这是一种软连接,类似windows系统下的快捷方式,命令格式为ln -s 源文件名称 软链接文件名称)

在这里插入图片描述
在这里插入图片描述

为什么要这样链接呢?这是因为编译不同架构的MCU时,使用的asm是不同的。


比如有这样一行指令#include ,那么在arm架构下就应该调用asm-arm文件夹下的type.h文件,在i386架构下就应该调用asm-i386文件夹下的type.h文件,使用不同架构的MCU,需要调用不同架构的文件。使用这样的软连接,就可以很方便的编译不同架构的文件。


接下来,删除asm-arm/arch文件夹。

在这里插入图片描述

然后,-z表示长度为0则为真,也就是字符串为空时为真,这里$6为s3c24x0,所以执行else的操作。


查看makefile,LNPREFIX为空,所以 ln -s ${LNPREFIX}arch-$6 asm-$2/arch 就是 ln -s arch-s3c24x0 asm-arm/arch。


也就是建立一个链接,将asm-arm/arch指向了arch-s3c24x0 。

在这里插入图片描述
在这里插入图片描述

接下来类似,$2 = arm,所以删除asm-arm/proc文件夹,建立一个asm-arm/proc到proc-armv的链接。

在这里插入图片描述

然后建立一个config.mk文件,文件第一行是ARCH = arm,第二行是CPU = arm920t,第三行是BOARD = 100ask24x0,第四行是SOC = s3c24x0。


其中,>表示建立一个文件,>>表示在这个文件的末尾加上某些信息。

在这里插入图片描述
在这里插入图片描述

APPEND 默认是no,所以就创建一个config.h文件,在里面添加相关两行。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出,配置的主要操作是设置相关变量并将需要的文件包含进来。


分析编译uboot指令

编译uboot使用的指令是:make


打开makefile,从上往下看,可以看到包含了make 100ask24x0_config生成的config.mk文件,通过这条代码就将两条指令链接起来了。

在这里插入图片描述
在这里插入图片描述

然后包含了cpu/arm920t/start.o文件,该文件是由start.S文件编译生成的,将该文件传回本地,分析源码时会用上。注意注释中的说明,obj文件的顺序不可以随意改动,并且一定要将start文件放在最前面。

在这里插入图片描述

再往下看可以发现有很多.a文件,.a文件是静态库文件,这些库文件都是编译好了被打包成库,然后编译的时候调用。


LIBS += board/( B O A R D D I R ) / l i b (BOARDDIR)/lib(BOARDDIR)/lib(BOARD).a就是LIBS += board/100ask24x0/lib100ask24x0.a。


LIBS += cpu/( C P U ) / l i b (CPU)/lib(CPU)/lib(CPU).a就是LIBS += cpu/arm920t/libarm920t.a。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后是all,当我们使用make指令不添加任何参数时,makefile就会将文件中的第一个目标当做参数,一般就是all。这里我们主要是要生成u-boot.bin文件。

在这里插入图片描述

u-boot.bin则依赖于u-boot,这里的u-boot是elf格式的,目标的u-boot则是二进制的。

在这里插入图片描述

可以看到u-boot依赖于许多文件。可以直接展开来分析该语句,也可以执行make指令,在编译的最后面应该有这些指令的展开。

在这里插入图片描述

可以看到,在编译的最后有如下的展开。

在这里插入图片描述

通过这个指令,可以看到makefile指定的链接脚本,使用的代码段的基地址,以及生成的u-boot的文件位置分布,处在最前面的应该是start.o文件。

在这里插入图片描述

打开u-boot.lds链接脚本,之后分析u-boot就从start.S入手,这是一个汇编文件。

在这里插入图片描述

分析编译过程:make,我们可以知道:


第一个编译的文件:cpu/arm920t/start.S

链接脚本:/home/book/Desktop/test/042_uboot_test/u-boot-1.1.6/board/100ask24x0/u-boot.lds

链接地址:0x0+0x33f80000

这个0x33f80000怎么来的呢?可以通过greo “0x33F80000” * -nR来查找一下。


可以看到,这个值是根据TEXT_BASE这个变量来的,这个变量的设置是在board/100ask24xc/config.mk文件的25行定义的。

个变量来的,这个变量的设置是在board/100ask24xc/config.mk文件的25行定义的。
在这里插入图片描述

查看一下LDFLAGS,grep “LDFLAG” * -nR,出来很多信息,从上往下看。

在这里插入图片描述

可以看到是在config.mk文件的189行定义的,与之前的调试信息也吻合起来。

在这里插入图片描述

board/100ask24c0/config.mk被包含进来,这个文件里面定义了TEXT_BASE为0x33f80000。如果你想让u-boot改变位置,那么修改这个文件里面的TEXT_BASE变量就可以了。

在这里插入图片描述

关键字:U-boot  Makefile  结构分析 引用地址:1_5.1.2_U-boot分析与使用_u-boot分析之Makefile结构分析_P

上一篇:1_5.1.1_U-boot分析与使用_u-boot分析之编译体验_P
下一篇:1_5.1.3_U-boot分析与使用_u-boot分析之源码第1阶段_P

推荐阅读最新更新时间:2024-11-23 12:29

u-boot-2009.08在mini2440上的移植 增加yaffs2文件系统
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 5.1,添加Yaffs2镜像烧写功能 由于现在很多使用Nand Flash 的系统,在Linux 下都用Yaffs2作为存储数据的文件系统,甚至是根文件系统。所以在BootLoader 下能够烧写Yaffs2 映像文件变得很必要。对于Yaffs2 映像烧写的支持其实
[单片机]
u-boot-2014.10移植(2)设置时钟/SDRAM
时钟修改 vim arch/arm/cpu/arm920t/start.S # if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #5 str r1, /* add by Flinn */
[单片机]
LED芯片的重要参数及两种结构分析
LED芯片是半导体发光器件LED的核心部件(LED灯),LED发光的原理主要在于LED芯片的P-N结。一般来说,半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。但这两种半导体连接起来的时候,它们之间就形成一个P-N结(LED电视)。 当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量而光的波长也就是光的颜色,是由形成P-N结的材料决定的(LED显示器)。 LED芯片主要由砷(AS)、铝(AL)、镓(Ga)、铟(IN)、磷(P)、氮(N)、锶(Si)这几种元素中的若干种组成,主要材料为单晶硅。 如下图所示为一种简
[电源管理]
u-boot-在2440上的移植详解(三)
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载: http://hbhuanggang.cublog.cn 一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器: arm-linux-gcc-4.3.2.tgz u-boot: u-boot-2009.08.tar.bz2 二、移植步骤 上接: u-boot-2009.08在2440上的移植详解(二) 5)准备进入u-boot的第
[单片机]
u-boot-在2440上的移植详解(三)
倍压整流电路结构优缺点分析
倍压整流电路的实质是电荷泵。最初由于核技术发展需要更高的电压来模拟人工核反应,于是在1932年由COCCROFT和WALTON提出了高压倍压电路,通常称为C-W倍压整流电路。 倍压整流电路有多种结构,各有优缺点。常见电路如下: 这三个电路都是6倍压整流电路,各有特点。我们通常称每2倍为一阶,用N表示,上述电路都是3阶,即N=3。如果希望输出电压极性不同,只要将所有的二极管反向就可以了。 电路1的优点是每个电容上的电压不会超过变压器次级峰值电压U的两倍,即2U,所以可以选用耐压较低的电容。缺点是电容是串联放电,纹波大。 电路2的优点是纹波小,缺点是对电容的耐压要求高,随着N的增大,电容的电压
[模拟电子]
Windows下u-boot-2011.03在Mini2440移植详解(3)
增加Nor Flash支持和增加DM9000支持 增加Nor Flash支持 参考网址:http://blog.csdn.net/l_backkom/article/details/6252410和《Mini2440之U-boot使用及移植详细手册2010-4-16》 修改该后串口输出如下: 显示2MiB。 relocaddr被修改成了0x33FB0000,和CONFIG_SYS_TEXT_BASE是一致的。reloc off为0,这个应该是copy前后的偏移。 @2014-03-31实验了一下在Nor下面saveenv,结果是失败,一直停留在Writing to Flash...上面,调试发现在u-boo
[单片机]
Windows下u-boot-2011.03在Mini2440移植详解(3)
移植u-boot-1.1.6之NOR的支持
u-boot-1.1.6里面默认配置文件里面支持的nor型号是 1 #if 0 2 #define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */ 3 #endif 4 #define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */ 而我们使用的nor flash不是LV400/LV800; 我们使用的芯片是MX29LV160DB,但是uboot里面没有,而有相近的AM29LV040B,这是需要借助数据手册仿写一个 MX29LV160DB特性有: 大
[单片机]
关于u-boot移植时的NAND FLASH问题
在移植U-BOOT的时候,大部分时间都是卡在nand flash里,因为我的nand flash容量比较大,512M的,网上的一般都是256M的吧,然后我就蛋疼蛋疼的搞了好久好久。。。 遇到的问题是这样:u-boot无法对nand flash正常读写,总是识别出各种坏块,几乎把整块nand都当作坏块了,最明显的就是保存环境变量时,使用saveenv命令,提示擦除时遇到坏块。 各种找原因,刚开始以为是底层驱动函数没有写好,然后就研究底层驱动开始,一点一点的理解。。。 在这里普及一下NAND的基本知识吧,刚开始我也稀里糊涂的。 NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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