在玩BeagleboneBlack一段时间之后不可避免地接触到了u-boot,之前的玩耍过程大致上是这样的:

在MATLAB下耍,因为MATLAB提供了它的硬件支持,可以直接在命令行与之交互,也可在simulink下直接编译仿真模型下载到板子上运行,当时的感觉是,我勒个去,MATLAB真是无所不能。

在MATLAB下耍了一段时间之后,开始在BBB本身的Linux系统上耍,主要照着Derek Molly的那本书耍,操作GPIO,使用传感器等等。发现在Linux下操作硬件怎么这么容易,以前玩的51,430,STM32貌似都是要操作寄存器的。

接着发现了TI的StartWare,之前玩430的时候在CCS里面看到过这东西,不知道是啥,安装了也不知道是几个意思,现在才知道原来它就相当于BBB的库文件,有裸奔之用。看过几个例程之后发现,接近5k页的datasheet,读完不现实。

不过处理器的启动过程总是值得关注的,AM3358启动过程中需要一个MLO文件,那MLO是怎么来的,于是来到了u-boot面前。。。下载u-boot的源码(2017-03-r1),读了一下readme,大致知道怎么用了,依次敲入
make am335x_boneblack_defconfig
make all CROSS_COMPILE=arm-linux-gnueabihf-
编译了一大堆的文件,貌似有一两百个,看看顶层的Makefile,1600行,这可真够我喝一池子了,一点头绪都没有,然后找了本书《嵌入式Linux系统开发入门宝典——基于Cortex-A8处理器》,人家用2014-04来分析的,于是我也照着来。

敲入make am335x_boneblack_config之后发生了什么:
顶层Makefile第460行:

1     @$(MKCONFIG) -A $(@:_config=)

展开即为:

1 mkconfig -A am335x_boneblack

表示执行名为"mkconfig"的shell脚本,带了两个参数-A和am335x_boneblack,看看这个脚本干了些什么:

第28行,读取board.cfg文件:

1     line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' $srctree/boards.cfg`

找到这样一行:

Active  arm  armv7   am33xx   ti      am335x    am335x_boneblack      am335x_evm:SERIAL1,CONS_INDEX=1,EMMC_BOOT  ......

根据这一行声生成两个符号链接:

arch-am33xx -->> asm/arch
proc-armv -->> asm/proc
再生成两个文件:
include/config.mk
include/config.h

配置过程就结束了.接下来看看敲入make all CROSS_COMPILE=arm-linux-gnueabihf-之后发生了什么:

这样敲入指定的目标是"all",并将CROSS_COMPILE指定为arm-linux-gnueabihf-,去顶层makefile找我们的"all"目标,第744行:

all:        $(ALL-y)

"all"目标依赖于"ALL-y"这个变量,再去找"ALL-y",第698行:

ALL-y += u-boot.srec u-boot.bin System.map

发现我们的有三个目标,"u-boot.srec"为Motorola的xxxx格式的镜像,u-boot.bin就是二进制格式的镜像了,System.map是xxxx(我也不清楚).

但是下面第700行开始有一系列的ALL-$(CONFIG_NAND_U_BOOT)这样的东西,比如第703行和704行:

ALL-$(CONFIG_SPL) += spl/u-boot-spl.bin
ALL-$(CONFIG_SPL_FRAMEWORK) += u-boot.img

如果$(CONFIG_SPL)是y的话,那就表示我们的目标还要再加上spl/u-boot-spl.bin,下面同理,CONFIG_SPL定义在include/autoconf.mk文件中,在第472行被include进来:

-include include/autoconf.mk

autoconf.mk文件是在编译之前产生的,在第1046行:

include/autoconf.mk: include/config.h$(call cmd,autoconf)

在autoconfi.mk的第203行确实定义了这个变量

CONFIG_SPL=y

于是我们的"all"目标还要加上两个:spl/u-boot-spl.bin和u-boot.img,makefile会按照规则一个目标一个目标地去生成,以u-boot.bin为例,第771行:

u-boot.bin: u-boot FORCE

继续找u-boot的依赖,第918行:

u-boot:    $(u-boot-init) $(u-boot-main) u-boot.lds

继续找u-boot-init和u-boot-main的依赖,第931行:

$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ;

继续找u-boot-dirs的依赖,第940行:

$(u-boot-dirs): prepare scripts$(Q)$(MAKE) $(build)=$@

$(Q)应该是quiet的意思,让make默默执行,变量build在scripts/kbuild.include文件中第170行定义:

build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

kbuild.include文件在第316行被include进来:

include $(srctree)/scripts/Kbuild.include

所以命令展开即为:make -f scripts/Makefile.build obj=$(u-boot-dirs),变量u-boot-dirs在第636行定义:

u-boot-dirs    := $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples

为变量libs-y加上tools和examples这么些目录,libs-y定义在575~632行,表示要编译的目录,以目录lib/为例,执行make -f scripts/Makefile.build obj=lib,表示使用scripts下的Makefile变量obj=lib执行make,这里没有指定目标,所以在Makefile.build中第一个目标将会是我们的目标,看看Makefile.build文件,第17行:

__build:

目标是__build,它是PHONY目标,再看第172行:

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \$(subdir-ym) $(always)@:

变量KBUILD_BUILTIN是1,所以它依赖于后面那一串变量,展开为builtin-target,lib-target,extra-y,subdris-ym,always,看看builtin-target在哪,第413行:

$(builtin-target): $(obj-y) FORCE

它依赖于变量obj-y,而obj-y定义在开头,是空的,但是在第64行会将要编译的目录,例如这里的lib目录下的Makefile include进来,在其中修改了obj-y变量,比如第23行:

obj-y += crc7.o

于是obj-y就有东西了,然后obj-y依赖于什么呢,.o文件估计依赖于.c或者.s文件,所以第334行:

$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE

但这里的目标多了前面的路径名,而此时obj-y并不包含路径名,再看第129行:

include scripts/Makefile.lib

在Makefile.lib文件中将对obj-y添加路径名,确定需要编译的子目录等等,对于子目录,它会执行同样的过程,第481行:

$(subdir-ym):$(Q)$(MAKE) $(build)=$@

整个Makefile的结构貌似就是这样子的,顶层makefile确定目标,要编译的目录,子目录中的makefile确定需要编译的文件以及它自己的子目录,然后这些.o文件一层一层地链接,最终生成u-boot.bin文件,其他的目标估计也是这个过程.

可是那个MLO文件在哪里呢?再看看这个目标:spl/u-boot-spl.bin,顶层makefile中第1080行:

spl/u-boot-spl.bin: spl/u-boot-spl@:
spl/u-boot-spl: tools prepare$(Q)$(MAKE) obj=spl -f $(srctree)/spl/Makefile all

命令展开为make obj=spl -f spl/Makefile all表示以spl/Makefile为文件,变量obj=spl,目标是all,执行make,spl下的makefile文件结构和顶层makefile结构类似,看看all目标,第191行:

all:    $(ALL-y)

展开为spl/u-boot-spl.bin,看看arch/arm/cpu/armv7/am33xx/config.mk文件:

ifdef CONFIG_SPL_BUILD
ALL-y    += MLO
ALL-$(CONFIG_SPL_SPI_SUPPORT) += MLO.byteswap
else
ALL-y    += u-boot.img
endif

如果定义了CONFIG_SPL_BUILD的话,ALL-y目标将会包含有MLO,编译前面的目标时,顶层makefile的配置文件是include下的autoconf.mk,里面是没有定义CONFIG_SPL_BUILD的,所以不会包含MLO,但是这里的makefile使用的是spl-autoconf.mk作为配置文件,有这么一行:

CONFIG_SPL_BUILD=y

所以MLO文件就会被编译出来了,那这个MLO干了些啥呢?......

转载于:https://www.cnblogs.com/heyxiaotang/p/6418532.html

BeagleboneBlack上u-boot的MLO文件是哪里来的相关推荐

  1. 解决使用Spring Boot、Multipartfile实现上传提示无法找到文件的问题

    解决使用Spring Boot.Multipartfile实现上传提示无法找到文件的问题 参考文章: (1)解决使用Spring Boot.Multipartfile实现上传提示无法找到文件的问题 ( ...

  2. spring boot的单个文件多文件上传原理及使用

    一.原理 自动配置原理 文件上传自动配置类-MultipartAutoConfiguration-MultipartProperties 自动配置好了 StandardServletMultipart ...

  3. Spring Boot接收前端上传的多个文件

    Spring Boot接收前端上传的多个文件 突然被问到这个功能,太久没用到这个功能,印象有些模糊,这个文章记录一下. 前端那里会传一个字段和一些文件到后端,然后后端接收保存一下. 代码 可以直接使用 ...

  4. SpringBoot+El-upload实现上传文件到通用上传接口并返回文件全路径(若依前后端分离版源码分析)

    场景 SpringBoot+ElementUI实现通用文件下载请求(全流程图文详细教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  5. 树莓派Linux内核源码配置、编译、挂载(boot/kernal/根文件)、开启新内核

    目录 一.树莓派Linux源码配置(适合树莓派) 总体概述 配置的三种方式 1.照搬厂家的配置(使用这种方式) 2.参考厂家的配置(感受一下) 3.完全自主配置(需要一定工作经验) 二.树莓派Linu ...

  6. linux boot efi分区 容量,解决Ubuntu上由于/boot容量不足引起的无法更新系统

    背景 使用 Ubantu 一段时间后发现无法更新系统了,在更新系统时提示如下: 这个更新需要花去 99.6 M 磁盘上总计 /boot 的空间.请在 31.2 M 磁盘上留出 /boot 空间.清空您 ...

  7. Spring Boot 实现万能文件在线预览-开源学习一

    Spring Boot 实现万能文件在线预览-开源学习一 1. 项目特性 支持word excel ppt,pdf等办公文档 支持txt,java,php,py,md,js,css等所有纯文本 支持z ...

  8. php 上传 类 代码,php 文件上传类代码

    /** * 文件上传类 */ class uploadFile { public $max_size = '1000000';//设置上传文件大小 public $file_name = 'date' ...

  9. 详细介绍!Linux 上几种常用的文件传输方式

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 责编:乐乐 来源:https://dwz.cn/VWIHhsOw 昨天发布一篇Linux文章( ...

  10. 编写程序,在文件file1.dat中存入字符串“good morning”,然后将file1.dat中的内容输出到屏幕上,并复制到文件file2.dat中

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p257 习题8 7.编写程序,在文件file1.dat中存入字符串"good morning ...

最新文章

  1. Ant Design of Vue —— setFieldsValue方法 动态操作Switch组件
  2. MS sql server和mysql中update多条数据的例子
  3. .net Forms身份验证不能用在应用的分布式部署中吗?
  4. python 装饰器是啥?
  5. IT168调研:企业移动安全应用状况调查
  6. python可以用来编写计算机网络程序吗_不必熟悉python或R编程语言,6步执行计算机视觉应用程序...
  7. 【解析】Alice and Bob_24行代码AC
  8. js的字符串和变量拼接
  9. [react] React为什么不要直接修改state?如果想修改怎么做?
  10. 六安瓜片在51CTO【礼树迎蛇 红满社区】
  11. .net如何获取文件夹中的文件_access递归列出文件夹中的文件
  12. frm ibd文件导入mysql_Mariadb,Mysql如何根据.frm和.ibd文件来恢复数据和表结构
  13. 什么是JavaScript垃圾回收?
  14. 智能判断图片中是否存在某物体_基于WT901传感器及NB-IOT无线技术开发的一款物体倾倒监测设备...
  15. 惠普服务器ssa找不到控制卡,DL380 Gen10服务器Vmware ESXi 6.0 系统SSACLI工具
  16. adoption/adaption
  17. 光储充一体化充电站,新能源汽车充电桩节能解决方案
  18. 读《松本行弘的程序世界》
  19. 数学建模评价类方法02——层次分析法
  20. access中本年度的四月一日_《四月一日灵异事件簿》一部打工人的励志故事,哈哈哈~(诙谐,温馨,人性,可爱,悬疑,友情,羁绊)...

热门文章

  1. 提升你幽默感的经典短句
  2. 【爆笑】句经典流行俏皮语【爆笑】[
  3. 等到花儿也谢了的await
  4. Excel中换行的问题
  5. jquery实现返回顶部功能
  6. 用以太坊区块链和jwt token保证Asp.Net Core的API交互安全(上)
  7. 动力节点【CRM客户管理系统】笔记1.简介、技术架构、软件开发生命周期、CRM核心业务介绍
  8. 免拆机,Kindle固件版本5.10.3~5.13.3如何越狱?简单、易操作版
  9. 取关几十个优质公众号,是否可惜?
  10. 无人驾驶:无人驾驶感知技术及应用