uboot的配置(make xxx_config)和编译(make)工程解读

2023-05-16

uboot编译三步走:

  1. make xxx_config
  2. make
  3. make install

 

第一步make xxx_config

这一步是产生板子的配置文件。

我们假设是配置ast2500evb板子,那么这里的配置命令就是 make ast2500evb_config

uboot/Makefile

这里%_config中%表示通配任意字符,即匹配ast2500evb_config。

首先执行依赖target ‘unconfig’的命令:删除之前配置时产生的文件。

然后执行命令@$(MKCONFIG) -A $(@:_config=)

$(MKCONFIG)为uboot/mkconfig, .

 

${CURDIR}为makefile变量,表示当前目录

$(@:_config=)表示将target(即%_config)中的_config替换为=后面的(null), 实际这里就相当于执行mkconfig -A ast2500evb

我们接着看mkconfig文件。

uboot/mkconfig

这是一个shell脚本。

$#: 表示参数个数

$n:表示第n个参数

首先判断参数的个数是否为2(makefile调用时的格式为mkconfig -A ast2500evb,参数个数为2)。

然后使用egrep提取boards.cfg中的数据,egrep使用的正则表达式: "^[[:space:]]*${2}[[:space:]]"

注意,这个正则表达式中有shell变量${2},要先替换。替换后正则表达式为

"^[[:space:]]*ast2500evb[[:space:]]"。

egrep正则表达式匹配任何以一个或多个空白符开头后跟ast2500evb字符串再后跟一个空白符的行,或者以ast2500evb字符串开头后跟一个空白符的行。

boards.cfg为输入文件。

boards.cfg描述了板子的arch, cpu, soc, board等信息。

对于我们的例子而言,egrep输出ast2500evb arm arm1176 ast2500evb – ast2500.

之后,通过set将这些信息赋值给$1, $2, $3…

这样之后,

$1 代表target  ast2500evb;

$2代表arch arm;

$3代表cpu arm1176;

$4代表board ast2500evb

$5代表vendor –

$6代表soc ast2500

然后将这些信息设置为相应的变量:

注意,55行的${1%_config},%_config表示去掉_config以及其右边的字符串,即表示将$1中的_config以及_config右边的所有字符串去掉。

接下去,创建特定的文件和目录。

$SRCTREE: 表示当前工程的顶层目录uboot/

$OBJTREE: 表示build目录,该目录由make -O=xxx来指定,如果没有指定,则默认为$SRCTREE.

$SRCTREE和$OBJTREE都定义在uboot/Makefile中。

假定$SRCTREE == $OBJTREE, 即我们make时没有指定-O=xxx参数。

那么mkconfig会在uboot/include下面创建一个asm软链接,链接到../arch/arm/include/asm

然后删除之前创建的链接文件uboot/include/asm/arch(uboot/arch/arm/include/asm/arch), 并创建本次配置的arch链接文件.

接着创建asm/proc链接文件:

之后,创建uboot/include/config.mk文件,文件内容为

ARCH   =

CPU   =

BOARD   =

SOC   =

并配置板子目录变量为ast2500evb

然后创建uboot/include/config.h文件,并写入定义行注释代码。

接着向config.h写入内容:

174-177行写入一些预定义的宏,这些宏由boards.cfg中的最后一列(Options)而来。

比如:

那么174-177行就向config.h写入如下宏:

#define CONFIG_AT91SAM9260

#define CONFIG_SYS_USE_DATAFLASH_CS0

由于ast2500evb没有Options,故174-177行不执行。

对于ast2500evb是写入如下定义:

config_cmd_defaults.h locates at uboot/include/config_cmd_defaults.h

config_defaults.h locates at uboot/include/config_defaults.h

configs/ast2500evb.h locates at uboot/configs/ast2500evb.h

asm/config.h locates at uboot/arch/arm/include/asm/config.h

config_fallbacks.h locates at uboot/include/config_fallbacks.h

config_uncmd_spl.h locates at uboot/include/config_uncmd_spl.h

到这里,make menuconfig就执行结束了。

总结一下,make ast2500evb_config会创建

uboot/include/asm   ->  uboot/arch/arm/include/asm

uboot/include/asm/arch  ->  uboot/arch/arm/include/asm/arch-ast2500

uboot/include/asm/proc  ->  uboot/arch/arm/include/asm/proc-armv

uboot/include/config.mk

uboot/include/config.h

 

第二步 make

执行make时,默认的target是all, uboot/Makefile中有两处定义了all:

这里,第二个all会覆盖第一个all。故执行make或make all时,对应uboot/Makefile:448处的all.

从448行,我们知道,执行make的时候,它的依赖为$(ALL-y)和$(SUBDIR_EXAMPLES)。我们主要来看一下$(ALL-y)都是些啥:

$(ALL-y)包含了u-boot.srec, u-boot.bin, System.map. 我们的例子中ast2500evb没有配置CONFIG_NAND_U_BOOT, CONFIG_ONENAND_U_BOOT, CONFIG_SPL, CONFIG_OF_SEPARATE, CONFIG_SPL等。

u-boot.srec, u-boot.bin都是基于u-boot的格式转换。u-boot.bin为“裸”的二进制格式,可以直接被cpu执行(只有*.txt, *.bss之类的段,没有其他的header之类的,比如elf header等)。其他的*.srec, *.hex是有文件格式的,就像有文件头描述之类的一样,该类文件需要解析成bin文件才能被cpu执行。

u-boot这个又依赖于伪目标depend,$(SUBDIR_TOOLS) ,$(OBJS) ,$(LIBBOARD) ,$(LIBS) ,$(LDSCRIPT) ,$(obj)u-boot.lds

u-boot是通过链接程序ld,将*.o, *.a, *.so等,以及链接脚本u-boot.lds生成的elf可执行文件(linux os可识别的可执行文件格式,含有elf header)。

这个u-boot直接给cpu是无法执行的,因为cpu可不认elf header。

所以,u-boot.bin就是将u-boot中的text, bss之类的段提取出来的纯可执行的二进制文件。

下面是u-boot的elf header和文件内容:

我们来看看u-boot.bin中的内容:

从下面的对比来看,u-boot.bin中的内容就是u-boot中offset 0x10000开始处的内容。

我们接着来介绍下u-boot的依赖depend,$(SUBDIR_TOOLS) ,$(OBJS) ,$(LIBBOARD) ,$(LIBS) ,$(LDSCRIPT) ,$(obj)u-boot.lds.

depend是用来生成依赖关系的。比如源文件*.c引用了头文件*.h,depend的作用就是用于生成*.c依赖*.h这样的依赖关系,有了这个依赖关系后,当*.h有变化时,make就会重新编译对应的*.c文件。

$(SUBDIR_TOOLS)就是tools.

$(OBJS)就是*.o, 它包含哪些呢?

uboot/Makefile

这里的CPUDIR是在uboot/config.mk中定义的,uboot/config.mk在uboot/Makefile中包含。

uboot/Makefile

uboot/config.mk

CPUDIR就是uboot/arch/arm/cpu/arm1176, 这里$(ARCH), $(CPU)就是在由make ast2500evb_config生成的uboot/include/config.mk中定义。

因此, $(OBJS)为uboot/arch/arm/cpu/arm1176/start.o.

补充一下,uboot/include/config.mk 164和165行的文件是在depend的依赖中生成的。

uboot/Makefile

$(LIBBOARD): 就是 uboot/board/ast2500evb/libast2500evb.o

uboot/Makefile

$(LIBS): 就是下列各种*.o

uboot/Makefile

$(LDSCRIPT): 就是指定连接器脚本,即uboot/board/ast2500evb/u-boot.lds

uboot/Makefile

u-boot.lds文件中定义了程序的入口、代码段、数据段地址等信息:

至此,我们大概了解了这几个依赖:depend,$(SUBDIR_TOOLS) ,$(OBJS) ,$(LIBBOARD) ,$(LIBS) ,$(LDSCRIPT) ,$(obj)u-boot.lds。

我们接着看依赖$(OBJS)。

$(OBJS)是通过进入到$(CPUDIR)目录(CPUDIR=uboot/arch/arm/cpu/arm1176)中执行make而得到的。

uboot/arch/arm/cpu/arm1176/Makefile

uboot/config.mk中定义了*.o生成的规则。

uboot/config.mk

我们看下一个$(LIBBOARD)

$(LIBBOARD) = uboot/board/ast2500evb/libast2500evb.o

uboot/Makefile

$(LIBBOARD)这个target是通过进入其所在目录(uboot/board/ast2500evb),执行make而得到的。

uboot/board/ast2500evb/Makefile

类似地,$(LIBS)也是分别进入目标所在的目录,执行make操作而得到。

 

最后,我们来看一下$(ALL-y)的一个依赖System.map是如何生成的。

System.map是通过u-boot这个elf可执行文件而来的。

uboot/Makefile

System.map是一个map文件,记录了符号和地址信息。

 

第三步 make install

(略)

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uboot的配置(make xxx_config)和编译(make)工程解读 的相关文章

  • 正确学习javascript。困惑的指南

    正确学习 javascript 困惑的指南 迷失了 javascript xff1f 这一点都不奇怪 你需要一个能告诉你真正重要的指南 我们只有一个 向左看 有一个框架市场 xff0c 它们相互竞争 xff0c 赞扬它们的能力 向右看 这是
  • 【ROS学习2】创建ROS工作空间及功能包

    目录 创建ROS工作空间及功能包工作空间 workspace src 代码空间 Source Space build 编译空间 Build Space devel 开发空间 Development Space install 安装空间 In
  • 【GStreamer 】5-5-总结USB相机转RTSP网络视频流-推流usb摄像头JPEG

    我们使用gstreamer rtsp server xff0c 实现了USB相机转RTSP网络流的基本功能 xff0c 之前很多篇都讲了如何实现 xff0c 这一次我们集中精力解决之前的一些问题 文章 GStreamer 5 4 USB相机
  • C程序设计语言 5-3

    练习5 3 用指针方式实现第2章中的函数strcat 函数strcat s t 将t指向的字符串复制到s指向的字符串的尾部 include lt stdio h gt int my strcat char char int main cha
  • NuttX 文件系统架构介绍(7.14)

  • 谈谈memcpy函数的优化(纯C)

    在使用C语言编程时 xff0c 我们常用memcpy来复制内存数据 xff0c 但很少有人会关注到memcpy怎么实现 最简单的memcpy功能实现如下 xff1a void low memcpy void dst const void s
  • USB DEVICE调试心得

    一 USB设备链接后无法HUB不上报发现新设备 USB控制器未打开 xff0c USB DP DM引脚配置不正确 二 能够发现设备 xff0c 但HOST端提示获取描述符失败 获取描述符是 USB DEVICE 链接后 HOST 向 DEV
  • PX4uORB介绍[4]-对象和数据结构

  • ubuntu禁止显示器休眠的方法

    近期在firefly RK3399开发板上调试代码 xff0c 经常遇到显示器自动休眠 xff0c 并且发现每次休眠都对系统实时性产生一些影响 xff0c 最终在万能的CSDN博客上找到解决办法 xff1a Linux不让显示器休眠的方法
  • STM32F4 SPI RX/TX DMA 读写FLASH数据

    STM32 使用DMA读写FLASH数据需要注意以下几点 xff1a 1 SPI全双工模式下 xff0c 无论读写FLASH数据均需要同时使能RX TX DMA 2 写数据时回读数据应当丢弃 xff0c 读数据时应当发送0xff来启动SPI
  • C++ vector的用法总结(整理)

    vector 是向量类型 xff0c 它可以容纳许多类型的数据 xff0c 如若干个整数 xff0c 所以称其为容器 它相当于一个动态的数组 当程序员无法知道自己需要的数组的规模多大时 用其来解决问题可以达到最大节约空间的目的 vector
  • 【问题已解决】无法定位程序输入点XXX于动态链接库xxxxxx

    因为刚接触OSG需要用CMake进行编译 xff0c 在操作上的问题还可以适应 xff0c 主要是电脑环境的影响比较大 编译成功后 xff0c 运行程序提示缺少一些dll文件 这里的主要处理办法是下载缺失的部分 xff0c 加到对应的文件夹
  • [python]重新安装pip

    目录 pip简介 一 恢复easy install文件 二 安装pip pip简介 python中一开始的import指令大家都不陌生 xff0c 也是因为可以调用不同模块的功能 xff0c 被称为 胶水语言 一般安装外部库有很多种方式 x
  • 【ROS2 入门】Jeston TX1 JetPack_4.6.3环境 ubuntu 18.04 ROS2 安装

    大家好 xff0c 我是虎哥 xff0c 从今天开始 xff0c 我将花一段时间 xff0c 开始将自己从ROS1切换到ROS2 xff0c 在上一篇中 xff0c 我们再虚拟机环境中安装了 ROS2 eloquent版本 xff0c 并完
  • 【已解决】拯救者Y7000不能调节亮度

    在上午的时候 xff0c 电脑突然有一些进程失控 xff0c 在任务管理器中一些服务关不掉 xff0c 电脑接近死机 xff0c 只能重启来解决 但是重启之后电脑突然很暗 回顾今天发生的情况 xff0c 应该是软件的锅了 应该是因为该型号的
  • 【已解决】win10 “你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。

    在访问局域网共享盘的时候 xff0c 突然出现报错 通过强大的网友 xff0c 通过改变组策略权限可以解决 1 按下win 43 R xff0c 输入gpedit msc 2 打开 管理模板 gt 网络 gt Lanman工作站 gt 启动
  • 【已解决】win10离线安装.net framework 3.5(错误:0x8024402c)

    首先说一下问题的背景 xff0c PC是离线环境win10系统 xff0c 主要在在离线安装VS2008的时候需要先安装这个低版本 Net 网上有很多方式 xff0c 这次参考价值最大的是这两个 Win10离线安装 net framewor
  • 【已解决可更新】VS2008 写入位置 0xCDCDCDCD 时发生访问冲突

    这个问题分两个小问题来细说 问题的背景是VS2008项目中封装了网络协议接口类 xff0c 对象成员有一个SOCKET类型成员变量和封装的进行三次握手的成员函数 在调用成员函数时报错发生访问冲突 1 写入位置 0xCDCDCDCD 时发生访
  • 【python】删除python代码中的简单注释

    可以当作一个简单的小工具来使用 xff0c 不过也是比较有局限性 xff0c 只能去掉 开头的注释行 使用内置函数 xff0c 没有引入模块 filename 61 34 xxx txt 34 打开名为xxx的txt文件 file 61 o
  • 再见2022,加油2023

    其实变化最大的一点就是 xff0c 这一年自己变成了一个北漂 没有很多的成熟的规划 xff0c 没有很多预算准备来到了北京 那会儿和之前的同事合租 xff0c 也给他添了不少麻烦 最开始到北京的时候 xff0c 因为口罩问题入职前生活状态比

随机推荐

  • 有效解决“SyntaxError: Non-UTF-8 code starting with” 语法错误

    在程序中出现中文的时候会有这种报错 xff0c 在代码的第一行加一句注释 xff0c 说明一下字符类型可以解决 coding 61 gbk coding utf 8这两种在我的程序里是亲测有效的
  • STM32F407定时器编码器接口模式

    STM32F407定时器编码器接口模式 16位定时器扩展32位 span class token comment TIM5初始化为编码器接口模式 xff0c 读取光栅尺数值 span span class token keyword voi
  • STM32F407的USB_HID 基础配置STM32CubeMX

    STM32F407的USB HID 基础配置 示例详解 参考 xff1a https blog csdn net zhanglifu3601881 article details 89675307 工具 xff1a STM32CubeMX5
  • STM32F407通过FSMC连接W5100S进行TCP网络通信

    STM32F407通过FSMC连接W5100S进行TCP网络通信 一 W5100S硬件 1 HS NM5100SA模块 模块厂家 xff1a 成都浩然电子http www hschip com HS NM5100SA以太网络控制器接口模块是
  • 【ROS2 入门】ROS2 创建工作空间

    大家好 xff0c 我是虎哥 xff0c 从今天开始 xff0c 我将花一段时间 xff0c 开始将自己从ROS1切换到ROS2 xff0c 在上几篇中 xff0c 我们一起了解ROS 2中很多基础概念 xff0c 从今天开始我们逐步就开始
  • STM32F407通过SPI连接W5100S进行TCP网络通信

    STM32F407通过SPI连接W5100S进行网络通信 一 W5100S硬件 1 HS NM5100SA模块 模块厂家 xff1a 成都浩然电子http www hschip com HS NM5100SA以太网络控制器接口模块是将W51
  • STM32F407 内部自带FLASH 模拟 EEPROM

    STM32F407 内部自带FLASH 模拟 EEPROM 一 STM32F407自带FLASH STM32F4 本身没有自带 EEPROM xff0c 但是 STM32F4 具有 IAP xff08 在应用编程 xff09 功能 xff0
  • 国标GB/T 18384.1 绝缘检测算法 推导公式

    国标GB T 18384 1 绝缘检测算法 推导公式 国标中关于绝缘检测算法只有结果 xff0c 没有推导公式 xff0c 如下 xff1a 根据电流回路相等原则 xff0c 推导出公式1 xff1a V1 V1 为正常情况下电池正负极电压
  • LTC6820和isoSPI使用笔记

    一 LTC6820使用笔记 1 MSTR主控 受控 MSTR 引脚 11 引脚 12 xff1a 串行接口主 从选择器输入 位于隔离式接口的主控器侧 xff08 SPI主机 xff09 xff0c 引脚接 VDD 位于隔离式接口的受控器侧
  • ESP8266学习笔记1--硬件

    1 ESP12F模块 原理图 自制开发板 原理图
  • ESP8266学习笔记2--Arduino环境搭建

    1 安装Arduino IDE https www arduino cn thread 5838 1 1 html 2 安装esp8266扩展 https www arduino cn thread 76029 1 1 html 安装成功后
  • ESP8266学习笔记3-闪存文件系统

    3 3 1 闪存文件SPIFFS基本操作 程序来源 xff1a 太极创客http www taichi maker com homepage esp8266 nodemcu iot iot c spiffs spiffs operation
  • 同一寄存器不同位域赋值的两种方法

    当一个寄存器有不同位域时 xff0c 我们需要给不同位域赋值 如何赋值方便呢 xff1f 下面有两种方法 xff0c 总结一下 个人觉得位域写法更简洁 整体寄存器法 typedef struct StrNa uint32 t reg1 re
  • mavlink解析

    之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本系列共三篇 xff0c 这是第一篇 本文大概总结了下对mavlink协议的理解 以下如不说明都是说mavlink v1 0版本 首先附上mavlink的各个消息的简
  • Tomcat部署及优化

    目录 1 Tomcat概述 1 Tomcat的概念 2 Tomcat的核心组件 3 Java Servlet 的概念 4 JSP的概念 5 Tomcat中最顶层的容器 server 6 四个子容器的作用 7 Tomcat请求过程 2 Tom
  • STC89C52系列单片机内部资源——串口通信

    计算机通信是将计算机技术和通信技术的相结合 xff0c 完成计算机与外部设备或计算机与计算机之间的信息交换 可以分为两大类 xff1a 并行通信与串行通信 并行通信通常是将数据字节的各位用多条数据线同时进行传送 并行通信控制简单 传输速度快
  • 用TCP/UDP 网络调试助手(PC版)无法获取网页信息

    以前的网页均是http开头的 xff0c 是没有加密的 xff0c 以前用GET就能获取网页的信息 xff0c 但是现在的基本是https开头的 xff0c 是加密的 xff0c 所以现在用以前的方法 xff0c 只能返回301错误 现在想
  • Ubuntu 20.04安装Ros Noetic及Ubuntu 18.04安装ROS Melodic(两版本详细填坑)

    Ubuntu 20 04安装Ros Noetic及18 04安装ROS Melodic 表1 1 ROS的历史版本 1 设置安装源2 添加秘钥3 更新列表4 开始安装5 配置ROS环境变量6 安装rosinstall6 1 初始化核心组件r
  • linux 根文件系统,根设备,sys_open, sys_read, sys_write, sys_mount, sys_mknod

    笔者语 xff1a 1 内容涉及比较多 xff0c 自己也没有分章节 xff0c 因为觉得这些内容关联性很强 xff0c 自己也懒的去弄了 2 本文涉及以下内容 xff1a 2 1 内核启动过程中 xff0c 第一个文件系统为rootfs
  • uboot的配置(make xxx_config)和编译(make)工程解读

    uboot编译三步走 make xxx configmakemake install 第一步make xxx config 这一步是产生板子的配置文件 我们假设是配置ast2500evb板子 xff0c 那么这里的配置命令就是 make a