uboot的配置、编译分析

在这篇文章里将来介绍s3c24x0的uboot的配置和编译的过程,首先,我们知道uboot在编译之前还要有其他的操作,分别是

  1. 解压缩:拿到手的uboot一般是一个压缩包,第一步需要先解压缩(废话)
  2. 打补丁:下载的uboot是从官网上下载的,所以它可能不是我们想要的,要想添加适合我们自己的功能,就要有一个自己
    的补丁文件,然后打补丁(patch -p1 < …/u-boot-1.1.6_jz2440.patch)
  3. 配置:针对某一款具体的开发板执行配置命令,这里是(make 100ask24x0_config)
  4. 编译:最后一步才是编译,直接执行make命令,会生成我们需要的u-boot.bin
    经过上面四步就可以编译生成一个u-boot.bin,那么,接下来分析这个配置和编译的具体过程,首先,执行完make 100ask24x0_config都了什么呢?这个需要去makefile中寻找
    在这里插入图片描述
    在makefile中搜索100ask24x0_config,可以找到上面图中的信息,
  5. 首先我们需要知道MKCONFIG这个变量的值,再去makefile中进行搜索,变量值为 MKCONFIG := $(SRCTREE)/mkconfig
    从这个名字来看,是uboot源码目录下的mkconfig文件
  6. $(@:_config=)表示的是上面的依赖,将后面的_config使用空格替代,也就是100ask24x0
    所以,在执行make 100ask24x0_config之后,相当于mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

接下来需要去uboot源码文件下去查看mkconfig这个文件的内容,下面查看部分重要的部分,下面是实际执行的命令,括号里是编号
mkconfig($0) 100ask24x0($1) arm($2) arm920t($3) 100ask24x0($4) NULL($5) s3c24x0($6)
在这里插入图片描述
首先一开始从14行到21行是对输入的参数进行判断,是否有这些内容,显然这些内容和我们没有关系,接下来23行是对变量BOARD_NAME的值进行判断,这个变量定义了但是赋值为NULL,所以赋值为$1,也就是100ask24x0,25和26行是参数个数的判断,这里不符合我们的执行条件,略过。
在这里插入图片描述
接着进入include目录,删除原本的asm文件,创建asm-arm文件的新链接文件asm,我们进入include目录看一下是否有这个文件的存在
在这里插入图片描述
这个文件和分析的一样,确实是一个链接文件,指向了asm-arm
在这里插入图片描述
上面接着对$6进行了判断,显然我们输入的$6不等于NULL,所以这里执行的是else分支,这个分支中也是创建了一个链接文件asm/arm目录下的proc,指向了asm目录下的arch-s3c24x0,来看看是不是这样的
在这里插入图片描述
在这里插入图片描述
接着往下分析,从上面的注释中可以看出,接下来是为编译创建include文件,67行是创建一个文件并输入ARCH = arm,68,69行是往这个文件中追击内容
CPU = arm920t
BOARD =smdk2410
,$5是NULL,71行不会执行,73执行之后会追加SOC=s3c24x0
来看看这个文件是否存在,以及其中的内容
在这里插入图片描述
在这里插入图片描述
接着往下分析,上面的内容是这个文件最后的内容了,从注释信息来看,是创建头文件config.h,这个文件里的内容是
#include <configs/100ask24x0.h>,来看看
在这里插入图片描述
这个文件就是我们需要的配置问价,源码里一些是否支持什么命令也是在这个文件里进行修改的,配置过程分析结束之后,接下来就要对编译过程进行分析了。

分析makefile
在这里插入图片描述
从这里可以看到,在编译的时候会使用我们刚才生产的inclide/config.mk文件,主要是配置一些编译信息,比如说如果是arm架构的话,交叉编译工具链就是arm-linux-gcc,如下图所示
在这里插入图片描述
在这里插入图片描述
注意上面这一行,这个变量很重要,我们先列出来,将$CPU进行替换之后,OBJS=cpu/arm920t/start.o
在这里插入图片描述
中间是编译的一些动态库的链接,这里我们就不再分析,一直往下就可以看到第一个依赖all,
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND),我们的目的是生成u-boot.bin,u-boot.bin又依赖于uboot(ELF格式),

在这里插入图片描述
最终呢,u-boot是依赖于上面这一大堆内容的,这些信息就是编译u-boot时的一些链接动态库,和具体的编译选项,具体的可以对u-boot执行make命令,最后的信息就是上面这些信息的替换
在这里插入图片描述
上面是链接编译时所需要的一些动态库,然后进行具体的编译,u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 ,包含了链接脚本的目录和代码段的链接地址,去看一下这个链接脚本的内容
在这里插入图片描述
在这里插入图片描述
注意点:

  1. 最开始的当前地址是0x00000000,但是实际的地址要加上运行地址0x33F80000,在uboot的根目录下的config.mk中有对链接选项的制定,将TEXT_BASE作为链接地址,TEXT_BASE是在board/100ask24x0/config.mk中定义 在这里插入图片描述
  2. 在这个链接脚本里有一个新的段u_boot_cmd,这是uboot自定义的段,一些uboot的命令是放在这个段里的
总结,分析makefile之后
1. 第一个文件是cpu/arm920t/start.s
2. 链接地址是在board/100ask24x0/u-boot.lds
3. 0x33F80000
发布了33 篇原创文章 · 获赞 2 · 访问量 1014

猜你喜欢

转载自blog.csdn.net/weixin_41791581/article/details/103655366