[Linux学习笔记]F1C100S的u-boot学习记录

好不容易有时间空闲下来,就想着把之前心心念念的u-boot研究一下,顺带记录着。

Makefile简单分析

我们对整个u-boot-sunxi-with-spl进行编译的时候,一般需要执行以下几条命令:

shell 复制代码
make distclean
make ARCH=arm CROSS_COMPILE=/home/ender/sunxi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- licheepi_nano_defconfig
make ARCH=arm CROSS_COMPILE=/home/ender/sunxi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- CFLAGS=-g -j16

为了分析对应的指令的执行过程,可以在顶层Makefile中查找相应指令。

第一条指令,执行distclean:

即从srctree目录下找出符合条件的文件并打印至标准输出,再由管道输入到xargs命令构造参数,最后传给rm -rf,执行构建清除。当在顶层编译时,srctree的定义即为.(当前目录)。

第二条指令,执行defconfig:

由于xxxx_defconfig的前缀在不断发生变化,因此通过搜索后缀config找到匹配的目标为 搜索build变量的定义,位于srctree/scripts/Kbuild.include内 因此实际的make ARCH=arm CROSS_COMPILE=/home/ender/sunxi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- licheepi_nano_defconfig在Makefile中的依赖可以化简为以下:

Makefile 复制代码
licheepi_nano_defconfig: scripts_basic outputmakefile FORCE
    make -f ./scripts/Makefile.build obj=scripts/kconfig licheepi_nano_defconfig

FORCE使得目标被强制执行,其中依赖scripts_basic位于顶层Makefile内

依赖outputmakefile也位于顶层Makefile内

由此可知licheepi_nano_defconfig该目标终究会调用./scripts/Makefile.build,并传入参数obj=scripts/kconfig licheepi_nano_defconfig。

注意到Makefile.build中没有与licheepi_nano_defconfig相匹配的目标,因此先分析obj参数,看源码可知obj参数被做如下处理:

经过转换后,去除特定前缀,则src=obj=scripts/kconfig。

进一步的,src被用于组成kbuild-file,展开后得知kbuild-file=./scripts/kconfig/Makefile。并且在57行的include $(kbuild-file)中将文件./scripts/kconfig/Makefile包含进来了。 打开./scripts/kconfig/Makefile文件搜索,即可找到licheepi_nano_defconfig对应的目标如下:

此处第一条命令把licheepi_nano_defconfig文件经过$(CPP)工具预处理生成 generated_defconfig。 之后第二条命令通过 sed去掉每行开头的空白字符。 最后第三条命令调用 $<,即$(obj)/conf并结合KConfig来生成完整的配置信息,最终写入.config文件。

第三条指令:执行make:

U-Boot的默认目标是_all,因此在顶层Makefile中可以搜索到关键字:

此处150行的_all:没有指定目标所需的依赖,通过搜索找到225行处的以下定义:

得知_all依赖于all,故查找目标all:

all又依赖于目标.binman_stamp,而目标.binman_stamp又依赖于目标$(INPUTS-y),在980行处看到如下定义:

可知这里便是根据具体配置信息将依赖添加入$(INPUTS-y),从而使得Makefile能够正确构建出u-boot.bin,spl/u-boot-spl.bin等文件,然而我们的目标是u-boot-sunxi-with-spl.bin,继续搜索关键字,在arch/arm/dts/sunxi-u-boot.dtsi中得到以下内容:

得知其是通过binman工具整合而来,且依赖于spl/sunxi-spl.bin u-boot-nodtb等文件,查找spl/sunxi-spl.bin依赖,在顶层Makefile中得到以下内容:

可知其依赖于spl/u-boot-spl,追溯可得:

该命令等价于:

Makefile 复制代码
    make obj=spl -f ./scripts/Makefile.xpl all

U-boot源码分析:

相关推荐
busideyang10 小时前
STC8H单片机delay_ms函数闪烁不准?原因是参数溢出!
c语言·单片机·嵌入式硬件·嵌入式
Hello_Embed10 小时前
LVGL 入门(十五):接口优化
前端·笔记·stm32·单片机·嵌入式
GetcharZp14 小时前
硬件世界的“高速缓存”:为什么手机断电后,屏幕还会闪一下?
嵌入式
busideyang1 天前
为什么推挽输出不能接收串口数据,而准双向口可以?
c语言·stm32·单片机·嵌入式硬件·嵌入式
济6171 天前
STM32定时器进阶:从模式控制器完全指南,一文学会TRGI/TRGO---STM32 HAL库专栏
stm32·单片机·嵌入式·stm32hal库编程
FreakStudio2 天前
把 Flask 搬进 ESP32,高中生自研嵌入式 Web 框架 MicroFlask !
python·单片机·嵌入式·cortex-m3·异步编程·电子diy
Zevalin爱灰灰2 天前
零基础入门学用物联网(ESP8266) 第一部分 基础知识篇(五)
单片机·物联网·嵌入式·esp8266
Zevalin爱灰灰3 天前
零基础入门学用物联网(ESP8266) 第一部分 基础知识篇(四)
物联网·嵌入式·esp8266
FreakStudio3 天前
MicroPython+PycoClaw,3 分钟搞定 ESP32 跑上 OpenClaw!
python·单片机·嵌入式·电子diy
逆小舟3 天前
【SWM320】FreeRTOS搭建工程——1、框架学习
嵌入式·c·rtos