以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。

一、配置编译初体验

1、uboot来源于官方(uboot官网下载),或者SoC官方(研发s5pv210芯片的公司推出的开发板,SMDKV210),或者具体的开发板的官方(深圳市九鼎科技,X210)。

  • 这里以针对x210开发板移植好的uboot进行配置、编译和分析。

2、步骤

  • 将源码解压在适当的目录下;
  • 配置,即在uboot的根目录下执行make  x210_sd_config
  • 编译,即在uboot的根目录下执行make(或者make -j2,或者make -s,前者多线程编译,后者静默编译)。

二、uboot的源目录分析

1、包括文件、文件夹。

2、主要的文件有uboot根目录下的mkconfig,Makefile,前者负责uboot的编译,后者负责编译。

3、主要的文件夹有board,cpu、common、include等。board文件夹中每个子文件夹表示一个开发板。cpu文件夹中每个子文件夹都是一个SoC系列。

三、uboot的配置分析

1、配置,即确定所使用的文件夹、文件的路径。

2、总结

(1)在uboot的根目录下执行make  x210_sd_config时,x210_sd_config是目标,在主Makefile中有如下代码:

x210_sd_config : unconfig@$(MKCONFIG)   $(@:_config=)  arm  s5pc11x  x210  samsung  s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
  • 调用MKCONFIG所表示的脚本,即uboot根目录下的mkconfig脚本;
  • 该脚本接收6个参数,分别是x210_sd,arm,s5pc11x,x210,samsung,s5pc110;
  • $(@:_config=)表示匹配后面带有_config的参数,并取除去_config的部分,即取x210_sd。

(2)在mkconfig脚本(见博客http://blog.csdn.net/oqqhutu12345678/article/details/73166954)

  • 创建符号链接;
  • 创建include/config.mk文件;注意这里的config.mk不是根目录下的config.mk文件;
  • 创建include/config.h文件。

(3)创建include/config.mk文件是为了让主Makefile在第133行包含。(见四7)

(4)include/config.h文件中,仅有一行代码:#include<configs/x210_sd.h>

  • 这里的configs是include文件夹里的一个子文件夹;
  • configs下的每个文件对应一个开发板的头文件,它是一些宏定义配置文件,是移植时最主要的文件。
  • 其中x210_sd.h被用来生成autoconfig.mk文件。
  • autoconfig.mk文件被主Makefile引入,指导整个编译过程,此文件中的宏会影响uboot中的大部分.C文件中的一些条件编译的选择,从而实现最终的可移植性。

四、uboot的主Makefile分析

1、uboot的版本号(24~29行)

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

2、(1)export   HOSTARCH  HOSTOS,HOSTARCH 、 HOSTOS分别表示主机的CPU架构和操作系统;

(2)  |  表示管道?

3、静默编译:make -s

  • -s表示参数,silent执行(50~54行)

4、2种编译管理方法(78~123行)

(1)原地编译:编译得到的文件和源文件在同一个目录下,简单但是会污染源目录;

(2)单独文件夹输出的编译:设置一个输出目录,承载编译输出结果。

(3)默认原地编译。

(4)指定具体的输出目录方法

  • a、编译时,用make O=输出目录;
  • b、或者先export BUILD_DIR=输出目录,然后编译时直接make。

5、OBJTREE,SRCTREE,TOPDIR

  • 三者分别表示编译后,.o文件存放的目录的根目录( \root\uboot\ ),源码目录的根目录(\root\uboot\),顶层目录。原地编译时,前者和中者目录是相等的。

6、MKCONFIG(101行):是Makefile中定义的一个变量,值为源码根目录下的mkconfig,而mkconfig是一个脚本。

7、$(obj)include/config.mk(主Makefile中的133行)

  • include/config.mk文件是在配置阶段生成的,见本文的三2(2)。 此文件的内容如下:
ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110
  • 配置值来自主Makefile第2589行的配置项里的传参;
  • 在主Makefile中的134行将这些变量export出来作为环境变量。

8、ARCH和CROSS_COMPILE(主Makefile中的136~182行)

  • 这两个是环境变量;
  • ARCH定义为当前编译的目标的CPU架构,在这里是ARM;
  • CROSS_COMPILE定义交叉编译工具的前缀;

---------------------------------------------根目录下的config.mk文件-----------------------------------------------------------------

见博客http://blog.csdn.net/oqqhutu12345678/article/details/73167054

9、include $(TOPDIR)/config.mk(主Makefile中的185行)

  • 这是根目录下的config.mk文件,不是include/config.mk

10、编译工具定义(根目录下的config.mk文件中的94~107行)

AS   = $(CROSS_COMPILE)as
LD  = $(CROSS_COMPILE)ld
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
RANLIB  = $(CROSS_COMPILE)RANLIB

11、包含开发板配置项目(根目录下的config.mk文件中的112行)

(1)代码为

sinclude $(OBJTREE)/include/autoconf.mk

(2)autoconf.mk是在配置中自动生成的,参见三2(4),它是一些宏,指导编译进行方向。

(3)原料是include/configs/x210_sb.h,include/configs下的每个头文件对应一个开发板。

12、链接脚本(根目录下的config.mk文件中的142~149行)

(1)如果定义了CONFIG_NAND_U_BOOT,则链接脚本是u-boot-nand.lds,没有定义则链接脚本为u-boot.lds。

  • uboot的最终链接地址是在Makefile中用-Ttext xxxx的形式来指定,好像和链接链接脚本没有多大的关联?

(2)实际在board\samsung\x210下的u-boot.lds。见博文http://blog.csdn.net/oqqhutu12345678/article/details/73166096

13、TEXT_BASE(在根目录下的config.mk中的156~158行):为整个uboot链接时指定链接地址。

14、自动推导规则(在根目录下的config.mk中的239~256行)。

-------------------------------------------------------------------------------------------------------------------------------------------------

15、在主Makefile中,第291行出现了整个Makefile的第一个目标ALL,其实我们make时,就是make ALL。

综上所述,整个配置和编译过程涉及的文件主要有:

主目录下的Makefile文件

根目录下的config.mk文件(被主Makefile文件调用)

根目录下的mkconfig文件(配置阶段的配置脚本)。

uboot源码——主Makefile分析相关推荐

  1. u-boot源码配置原理分析

    作者:杨老师,华清远见嵌入式学院讲师. u-boot的源代码默认是不针对任何目标平台的,当我们要移植u-boot到一个特定的目标平台时,需要生成针对目标平台的配置文件.u-boot目前已经支持的芯片可 ...

  2. uboot源码——内核启动分析

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考资料:http://www.cnblogs.com/biaohc/p/6403863.html 总结:uboot启动linux内核的整个 ...

  3. uboot源码——mmc驱动分析

    以下内容源于朱有鹏<物联网大讲坛>课程的学习,以及博客http://www.cnblogs.com/biaohc/p/6409197.html的学习整理,如有侵权,请告知删除. 一.ubo ...

  4. 开发板与虚拟机组网、uboot源码makefile分析、uboot安全启动与非安全启动方式、uboot源码配置与编译流程、制作TF启动盘

    开发板与虚拟机组网. 局面:开发板.PC(Ubuntu系统).网线直连PC:设置Ubuntu系统:1.设置桥接模式,桥接到PC的有线网卡上:2.手动配置IP V4的地址信息,注意和开发板保持在同一网段 ...

  5. X210之uboot源码分析

    uboot源码分析 Makefile分析1 自己参考源码. Makefile分析2 ifdef O ifeq ("$(origin O)", "command line& ...

  6. U-Boot源码目录分析(VScode工程创建及文件夹过滤)

    参考:U-Boot工程目录介绍 作者:一只青木呀 发布时间: 2020-10-21 14:47:30 网址:https://blog.csdn.net/weixin_45309916/article/ ...

  7. 嵌入式之uboot源码分析-启动第二阶段学习笔记(下篇)

    接上部分---->嵌入式之uboot源码分析-启动第二阶段学习笔记(上篇) 注:如下内容来自朱老师物联网大讲堂uboot课件 3.2.14 CFG_NO_FLASH (1)虽然NandFlash ...

  8. uboot源码分析(基于S5PV210)之启动第一阶段

    目录 一.start.S引入 1.u-boot.lds中找到start.S入口 2.SourceInsight中如何找到文件 3.SI中找文件技巧 二.start.S解析 1.不简单的头文件包含 2. ...

  9. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. 循环爬取图片_Java爬取简单的网页内容和图片
  2. 23.3. Ethernet0/0 - Wan口配置
  3. Ajax请求全局配置
  4. 我的Linux成长路---001 Linux学习初期计划
  5. nginx 电子书_Nginx最详细的反向代理配置步骤,拿去不谢
  6. python视频帧提取并保存_如何用python实现视频关键帧提取并保存为图片?
  7. 电商页面设计需要的素材模板|好的模板就是好的参考
  8. PHP 5 将于年底停止更新,六成用户将面临安全风险
  9. Azure上部署FTP服务
  10. python 将txt文件转换为excel_Python学习笔记-Txt文件转Excel文件
  11. 《钢构CAD》不断致力于帮助用户取得更多成就
  12. Matlab吴恩达机器学习编程练习ex5:正则化线性回归和偏差v.s. 方差Regularized Linear Regression and Bias v.s. Variance
  13. Zabbix安装错误解决方案
  14. 计算机网络超文本是什么意思,什么是超文本链接,和超文本有什么区别?
  15. 男人四十以后适合在哪个行业创业?为什么?
  16. U²-Net:铅笔肖像画的生成
  17. 自动控制原理(4)——传递函数、典型环节的传递函数
  18. CentOS下的服务器审计系统:script
  19. 配置汇编环境(王爽)
  20. oracle插入日期异常,Oracle插入日期数据常见的2个问题和解决方法

热门文章

  1. JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码。
  2. 利用selenium webdriver点击alert提示框
  3. CSS3 选择器 基本选择器介绍
  4. 五.几何对象和空间参考
  5. redhat rpmforge epel 安装源配置
  6. 如何让tomcat服务器运行在80端口,并且无需输入项目名即可访问项目()
  7. Linux内核中的常用宏container_of其实很简单【转】
  8. C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
  9. 限制MySQL Binlog的传输速率
  10. Eclipse之ANT使用