嵌入式linux之uboot3(末尾附带博客讲解视频地址)

2019-07-12 16:54发布

                    UBOOT的移植与配置下面我们开始讲解UBOOT的配置原理和移植步骤。在讲解之前我们首先要理解一下下面这一张图的意思。 这是一张嵌入式与传统PC机启动的分析对比。在图中我们可以看到嵌入式中每个模块在PC机上都会找到相同作用的模块。在嵌入式中我们的bootloader就是一个引导操作系统的程序与bios有着相同的作用。我们拿到一个源码,尤其是像这个模块型的代码,首先要分析他的顶层makefile,才可以弄明白这几千个文件的源码是有什么作用和联系。 1.1 UBOOT的体验我们先提前做好一个uboot,通过这个成品uboot来逐步分析。首先我们对一个从网上下载的全新的uboot进行打补丁,这个补丁的内容就是对新版的uboot进行修改,这样做的好处就是补丁文件特别小,在任何地方我们只需要很小的补丁文件,再从网上找到通用的未经修改的uboot,对其进行进行打补丁就可以完成uboot的制作。总结一下操作流程解压缩tar xjf  文件 打补丁patch -p1 < ../补丁文件 配置  make 100ask24x0-config编译  make all执行完之后把生成的uboot.bin烧写到开发板中。启动开发板得到如下的效果图 下面我们就深入学习内部代码的实现原理。 上图是uboot要做的任务。1.2 Ubootmakefile分析Makefile的分析是十分重要的,最终目的是启动内核,在这章我们开始对顶层的makeflie进行分析。现在开始分析ubootmakefile的代码。首先,我们开始看它的配置 实际上我们在执行make 100ask_config这个命令的时候就是在执行。上面图片上的这一行代码。我们通过分析代码可以得到以下结论第一个参数是开发版的名称,之后我们创建一个平台相关的文件链接然后我们创建顶层的include/config.mk,这个里面包含了CPU还有单板名称总的来说就是之前图片上的那几个参数。然后我们创建开发板相关的头文件.从上面这几个信息我们可以知道如果我们要在创建一个新的开发版我们需要在include/config目录下建立一个你开发版名称命名的头文件。里面存放的就是开发版的配置信息。在配置完成之后,我们开始执行编译。从makefile可以了解uboot使用了哪些文件?哪个文件首先执行。可执行文件占用的内存情况。我们首先打开顶层makefile,刚开始是对编译器的选择。然后进入了顶层config.mk,在config.mk中定义了基地址等信息,注意顶层config.mk与分层config.mk的区别。之后开始制作运行的库,将许多.a .o文件编译成功,然后通过 这几个命令与各个文件依赖关系,基地址最终生成uboot.bin最后总结一下编译流程1 编译start.s这个启动文件2在开发板相关的每个目录下都执行当前目录下的makefile生成相应的库,3将上面两步骤生成的文件按照config.mk文件中制定的代码其实段和lds连接脚本继续宁链接4生成elf格式下的uboot,后面将它转换成二进制格式,最终烧写开发板  1.3 Uboot的源码分析在介绍完编译过程之后下面我们开始具体分析uboot的第一阶段启动代码start.s 左边的硬件初始化都是在这个阶段进行的。执行到最后设置好C语言的堆栈等环境就跳到c语言中初始化那些比较难的硬件如网卡,USB,串口。第二阶段就是从flash读出内核放到内存中,启动内核。第二阶段程序是lib_arm中的board.c里的程序,这里的程序对网卡等外设进行初始化之后跳转到一个main.c的循环,然后通过串口发送的命令来进行对应操作,具体就是run_command(命令)的操作,下一小节我们就开始分析run_command()具体的作用。1.4 自己写一个uboot命令现在我们分析UBOOT的命令是怎么实现的。模仿,现场展示。  1.5 uboot启动内核Uboot的最终目的就是启动内核,这一章节我们从开发手册上具体分析。