从自己自学嵌入式,到现在已经有两个多有了,刚开始就是重新全面的打基础,包括c语言,数据结构,操作系统原理。网上找文档,源码,技术贴,视频,以及自己买书,买开发板,只要是能找到的方法都用上。因为这样一直都是很忙,即便有时忙的毫无头绪,但收获的尽是喜悦和快乐。虽然11年的时候还写一些博客,但最后因为时间上的缘故就没能保持下来。当我自己想想应该记录下自己的学习动态,并给自己以后留下一些学习笔记,我就想起了CSDN博客了。我将今天定位自己博客正式开始书写的第一天。今天我将整理一些关于u-boot的学习笔记,大多是从一些资料整理的知识,和一些自己的理解,有的知识点我会表明出处,以感谢原作者的无私分享。
一、u-boot工程的总体结构:
1、源代码组织
对ARM而言,主要的目录如下:
board 平台依赖存放电路板相关的目录文件,没一套开发板对应一个目录。 如:smdk2410 (arm920t)
cpu 平台依赖存放cpu的相关的文件,每一款cpu对应一个目录。如:arm920t、xscale、i386等目录
lib_arm 通用存放对ARM体系结构通用的文件,主要用于实现ARM平台的通用函数,如软件浮点。
common 通用通用的多功能函数实现,如环境,命令,控制台等。
include 通用头文件和开发板配置文件,所有开发板的配置文件都在configs目录下
lib_generic 通用 通用库函数的实现
net 通用存放网络协议的程序
drivers 通用通用设备驱动程序,主要有以太网接口的驱动,nand驱动。
........
2、makefile简要分析
所有这些目录的编译连接都是由顶层的makfile来确定的。
/*这是一些在开发化境执行的一些阶段,包括config文件的修改,makefile文件的配置,和一些环境变量的书写*/
//以上内容是尚观分享出来的。
我觉得要想具体理解到u-boot,还是那一点就是看源码,这几乎是我们无论任何嵌入式学习中都必须要做的事,也是最能帮你更快速成长的有效途径。
二、u-boot源码分析
(一)u-boot启动时一次调用到的重要函数
1)、start.s
在flash中执行的引导的代码,负责初始化硬件化境,把u-boot从flash加载到RAM中去,然后跳转到lib_arm/board.c中的start_armboot中去执行。
1.1.6版本的start.s流程
1、硬件环境初始化;
进入svc模式;关闭watch dog;屏蔽所有IRQ掩码;设置时钟频率FCLK、HCKK、PCLK;
清I/D cache; 禁止MMU和CACHE;配置memory control;
2、重定位;
如果当前代码不在连接制定的地址上(一般在编译源代码是会有“armlink--ro_base=0x50200000”这句,表示连接地址为0x50200000)则需要把u-boot从当前位置拷贝到RAM制定位置中;
3、建立堆栈,堆栈是进入C语言前必须初始化的;
4、清.bss区
5、跳到start_armboot函数中执行。(lib_arm/board.c)
2)lib_arm/board.c
start_armboot 是u-boot执行的第一个C语言函数,这里与平时我们认为的C语言执行一般第一个函数为
main函数没有冲突,因为只要是在启动文件中指定函数它就可以是你所指定的函数像这里的start_armboot。而不一定必须是main函数。
start_armboot的主要实现功能
1. 全局数据结构的初始化 ;
2. 调用通用初始化函数 ;
3. 初始化具体设备 ;
4. 初始化环境变量 ;
5. 进入主循环 ;
三、源代码分析
在这一部分由于代码比较多,就不再描述了,可以去百度文库搜索一下u-boot源码分析,这类文档也比较全,希望我们都能强烈的爱上看源码,因为写的好的源码就不仅是一门艺术,更是一种哲学。我个人就超喜欢看Linux 内核的源码。
明天博文:cramfs文件系统的学习。