U-Boot是用于多种嵌入式CPU( MIPS、x86、ARM等)的bootloader程序,U-Boot不仅支持嵌入式Linux系统的引导,还支持VxWorks, QNX等多种嵌入式操作系统。
查看S3C6410_Internal_ROM_Booting.pdf可看到系统启动的原理图如下:
linux的Uboot分析
对于.lds文件,它定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。
SECTIONS {
...
secname start BLOCK(align) (NOLOAD) : AT ( ldadr )
{ contents } >region :phdr =fill
...
}
secname和contents是必须的,其他的都是可选的。下面挑几个常用的看看:
1、secname:段名
2、contents:决定哪些内容放在本段,可以是整个目标文件,也可以是目标文件中的某段(代码段、数据段等)
3、start:本段连接(运行)的地址,如果没有使用AT(ldadr),本段存储的地址也是start。GNU网站上说start可以用任意一种描述地址的符号来描述。
4、AT(ldadr):定义本段存储(加载)的地址。
结合u-boot.lds进行分析:
OUTPUT_FORMAT("elf32­littlearm", "elf32­littlearm", "elf32­littlearm")
//指定输出可执行文件是elf格式,32位ARM指令,小端
OUTPUT_ARCH(arm)
//指定输出可执行文件的平台为ARM
ENTRY(_start)
//指定输出可执行文件的起始代码段为_start.
SECTIONS
{
. = 0x00000000 ; 从0x0位置开始
. = ALIGN(4) ; 代码以4字节对齐
.text : ;指定代码段
{
cpu/s3c64xx/start.o (.text) //代码的第一个代码部分
cpu/s3c64xx/s3c6410/cpu_init.o// (.text)//初始化CPU
cpu/s3c64xx/onenand_cp.o // (.text)
cpu/s3c64xx/nand_cp.o //(.text)//拷贝nandflash 8K至stepstone
cpu/s3c64xx/movi.o //(.text)//把nandflash剩余部分拷贝至DRAM中运行
*(.text)//代码剩余部分
lib_arm/div0.o
}
. = ALIGN(4)
.rodata : { *(.rodata) }//指定只读数据段
. = ALIGN(4)
.data : { *(.data) } //指定读/写数据段
. = ALIGN(4)
.got : { *(.got) } //指定got段, got段式是uboot自定义的一个段, 非标准段
__u_boot_cmd_start = . //把__u_boot_cmd_start赋值为当前位置, 即起始位置
.u_boot_cmd : { *(.u_boot_cmd) } //指定u_boot_cmd段, uboot把所有的uboot命令放在该段.
__u_boot_cmd_end = .//把__u_boot_cmd_end赋值为当前位置,即结束位置
. = ALIGN(4)
__bss_start = .// 把__bss_start赋值为当前位置,即bss段的开始位置
.bss : { *(.bss) }// 指定bss段
_end = .//把_end赋值为当前位置,即bss段的结束位置
}
在链接器脚本中可以看出,程序入口时start.s,下面开始分析start.s
/*
* armboot - Startup Code for S3C6400/ARM1176 CPU-core
*
* Copyright (c) 2007 Samsung Electronics
*
*
* 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
*
* 2007-09-21 - Restructured codes by jsgood (jsgood.yang@samsung.com)
* 2007-09-21 - Added moviNAND and OneNAND boot codes by jsgood (jsgood.yang@samsung.com)
* Base codes by scsuh (sc.suh)
*/
#include <config.h>
#include <version.h>
#ifdef 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