Start.S的引入
注:本次分析的u-boot是九鼎官方的u-boot代码
下载地址:链接:http://pan.baidu.com/s/1gfpDZqj 密码:7cqe
一 从uboot中找到整个项目的入口
1.从u-boot.lds中找到程序的入口
整个程序的入口取决于链接脚本u-boot.lds中ENTRY声明的地方,为ENTRY(_start)。
所以_start 符号所在的文件就是整个程序的起始文件, _start所在处的代码就是整个程序的起始代码。
2.用Source Insight工具进行查找
(1)当前状况:我们知道在uboot中的1000多个文件中有一个符号叫_start,但是我们不知道这个符号在哪个文件中。这种情况下要查找一个符号在所有项目中文件中的引用,要使用SourceInsight的搜索功能。
(2)查找方法:
选择工具栏中的R选项,如图所示:
然后点击进入,输入_start,并选择整个项目查找,便可以找到。
3.start.S中的头文件
#include <config.h>
#include <version.h>
#if defined(CONFIG_ENABLE_MMU)
#include <asm/proc/domain.h>
#endif
#include <regs.h>
#ifndef CONFIG_ENABLE_MMU
#ifndef CFG_PHY_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE
#endif
#endif
(1)#include <config.h>
这个文件不是源码中本身存在的文件,而是在mkconfig脚本中配置生成的,内容是#include <configs/x210_sd.h>
。
(2)#inlcude <version.h>
从include文件夹中找到这个头文件,打开后显示:
#ifndef __VERSION_H__
#define __VERSION_H__
#ifndef DO_DEPS_ONLY
#include "version_autogenerated.h"
#endif
#endif /* __VERSION_H__ */
这里的#include "version_autogenerated.h"是编译过程中生成的,里面的内容只有一行: #define U_BOOT_VERSION "U-Boot 1.3.4"
这个是uboot的版本号,在uboot启动时,我们看到的版本号信息就是从这来的。
(3)#include <asm/proc/domain.h>
asm目录不是uboot中的原生目录,uboot中本来是没有这个目录的。asm目录是配置时创建的一个符号链接,实际指向的是就是asm-arm,实际文件是:
include/asm-arm/proc-armv/domain.h
这样做的原因:
之所以start.S不直接包含asm-arm/proc-armv/domain.h,而要用asm/proc/domain.h主要是为了可移植性。因为如果直接包含,则start.S文件和CPU架构(和硬件)有关了,可移植性就差了。譬如我要把uboot移植到mips架构下,则start.S源代码中所有的头文件包含全部要修改。我们用了符号链接之后,则start.S中源代码不用改,只需要在具体的硬件移植时配置不同,创建的符号链接指向的不同,则可以具有可移植性。