Uboot makefile


一,新建工程后,新建一个名为“settings.json”的文件
    其中"search.exclude"里面是需要在搜索结果中排除的文件或者文件夹,"files.exclude"是左
侧工程目录中需要排除的文件或者文件夹
    settings.json 文件代码
    { "search.exclude":
        {"**/node_modules": true,
         "**/bower_components": true, 
        },
      "files.exclude": 
        {"**/.git": true, 
         "**/.svn": true, 
         "**/.hg": true,
         "**/CVS": true,
         "**/.DS_Store": true, 
        }
    }
二、makefile文件
    1.origin 用于告诉你变量是哪来的,语法为:
        $(origin <variable>)
    2.sym 命令分为“quiet_cmd_sym”和“cmd_sym”两个版本,这两个命令的功能都是一样的,
    区别在于 make 执行的时候输出的命令不同。quiet_cmd_xxx 命令输出信息少,也就是短命令,
    而 cmd_xxx 命令输出信息多,也就是完整的命令。
        如果变量 quiet 为空的话,整个命令都会输出。
        如果变量 quiet 为“quiet_”的话,仅输出短版本。
        如果变量 quiet 为“silent_”的话,整个命令都不会输出
      设置 V=0 或者在命令行中不定义 V 的话,编译 uboot 的时候终端中显示的短命令,但是还是会有命令输出,有时候我们在编译 uboot 的时候不需要输出命令,这个时候
    就可以使用 uboot 的静默输出功能。编译的时候使用“make -s”即可实现静默输出
    3.uboot 支持代码检查,使用命令“make C=1”使能代码检查,检查那些需要重新编译的文件。“make C=2”用于检查所有的源码文件
    4.在 uboot 中允许单独编译某个模块,使用命令“make M=dir”即可
    5.编 译 uboot 的 时 候 需 要 设 置 目 标 板 架 构 和 交 叉 编 译 器 ,“ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-”就是用于设置 ARCH 和 CROSS_COMPILE
    6.主 Makefile 会调用文件 scripts/Kbuild.include 这个文件,使用“include”包含了文件 scripts/Kbuild.include,此文件里面定义了
很多变量
    7.交叉编译工具变量设置
    AS = $(CROSS_COMPILE)as
    # Always use GNU ld
    ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),)
    LD = $(CROSS_COMPILE)ld.bfd
    else
    LD = $(CROSS_COMPILE)ld
    endif
    CC = $(CROSS_COMPILE)gcc
    CPP = $(CC) -E
    AR = $(CROSS_COMPILE)ar
    NM = $(CROSS_COMPILE)nm
    LDR = $(CROSS_COMPILE)ldr
    STRIP = $(CROSS_COMPILE)strip
    OBJCOPY = $(CROSS_COMPILE)objcopy
    OBJDUMP = $(CROSS_COMPILE)objdump
   8. 命令 make xxx_defconfig 执行流程 ,  conf 是主机软件

9. make命令的流程

 

三、uboot函数调用路径

       

    _main 中会调用 board_init_f 函数, board_init_f 函数主要有两个工作:
        ①、初始化一系列外设,比如串口、定时器,或者打印一些消息等。
        ②、 初始化 gd 的各个成员变量 uboot 会将自己重定位到 DRAM 的gd->relocaladdr 地址区域,这么做的目的是给 Linux 腾出空间,防止 Linux kernel 覆盖掉 uboot ,将 DRAM 前面的区域完整的空出来。在拷贝之前肯定要给 uboot 各部分  分配好内存位置和大小,比如 gd 应该存放到哪个位置, malloc 内存池应该存放到哪个位置等 等。这些信息都保存在 gd 的成员变量中,因此要对 gd 的这些成员变量做初始化。最终形成一 个完整的内存“分配图”,在后面重定位 uboot 的时候就会用到这个内存“分配图”。
initcall_run_list函数初始化序列  static init_fnc_t init_sequence_f []
 

        调用函数 relocate_code ,也就是代码重定位函数,此函数负责将 uboot 拷贝到新 的地方去,此函数定义在文件 arch/arm/lib/relocate.S 中。
调用函数 relocate_vectors ,对中断向量表做重定位,此函数定义在文件 arch/arm/lib/relocate.S 中。
       uboot 重 定 位 后 偏 移 为 0X18747000,uboot 对于重定位后链接地址和运行地址不一致的解决方法就是采用位置无关码,在使用 ld 进行链接的时候使用选项“-pie”生成位置无关的可执行文件,设置 uboot 链接选项,加入了“-pie”选项,编译链接 uboot 的时候就会使用到“-pie” 使用“-pie ”选项以后会生成一个 .rel.dyn 段, uboot 就是靠这个 .rel.dyn 来解决重定位问题的。
       .rel.dyn 段的格式,类似第 7 行和第 8 行这样的是一组,也就是两个 4 字节数据 为一组。高 4 字节是 Label 地址标识 0X17 ,低 4 字节就是 Label 的地址,首先判断 Label 地址 标识是否正确,也就是判断高 4 字节是否为 0X17 ,如果是的话高 4 字节就是 Label 值。
        第 7 行值为 0X87804198 ,第 8 行为 0X00000017 ,说明第 7 行的 0X87804198 是个 Label , 这个正是示例代码 32.2.6.3 中存放变量 rel_a 地址的那个 Label 。根据前面的分析,只要将地址 0X87804198+offset 处的值改为重定位后的变量 rel_a 地址即可。

        函数 relocate_vectors 用于重定位向量表

四、bootz命令


          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值