什么是U-Boot
U-Boot是一个开源的系统引导,是用开引导启动内核的。它的整个工作可以分为两个部分,两部分合力完成把程序加载到内存中启动内核的工作。U-Boot是由根据Linux源代码改变删减发展而来的,所以U-Boot工作的两部分中的第一部分的源代码主要由汇编语言完成硬件的初始化,搭建C语言可以运行的环境,第二部分主要由C语言完成剩余其他工作。这样的系统的移植性会更好。
什么是start.S
start.S文件存放在U-Boot系统的CPU目录下,而CPU目录下存放的正是和处理器相关的操作文件。start.S文件是U-Boot启动时执行的第一个文件来完成U-Boot启动的第一部分操作,来完成硬件的一系列初始化工作,为后续的操作做铺垫。
从u-boot.lds中通过搜索引擎查找start入口
通过查资料和分析我们发现无论是什么语言C语言、汇编语言都需要一个标志,告诉系统,通过标志来找到文件可执行的入口位置。C语言规定的main( )为执行的起点。而我们这里u-boot.lds文件中是通过查找链接脚本中的ENTRY声明位置,中的关键字符号,来确定该符号所在文件,所在位置就是整个程序的起始位置。也就是说,通过ENTRY(_start)便可确定start.S文件是我们整个程序的起始代码所在文件。
具体查看下列代码:
/*
* (C) Copyright 2002
* Gary Jennejohn, DENX Software Engineering,
* See file CREDITS for list of people who contributed to this project.
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")* OUTPUT_ARCH(arm)
ENTRY(_start)
/* ↑这里这里 */
start.S源码分析
通过查看U-Boot的源代码。我们找到了start.S的部分源代码,从而可以进行进一步的分析。
1. “config.h”、”version.h”是在include目录下,他们两个都是在配置过程中会自动生产的文件,在他们的文件中右包含了其他文件,包含很多配置过程需要调用的宏,把子文件封装在该文件中,增加了系统的可移植性。
#include< config.h >
#include< version.h >
/*
*************************************************************************
*
* Jump vector table as in table 3.1 in [1]
*
*************************************************************************
*/
2. “.globl ” 是个关键字,它的作用是声明全局标志,也就是说_start这个符号是可以被外部调用使用的。 _start是我们在上文提到的定义的标志起始代码的符号。