Boot来DIY自己的arm11(6410)的bootloader

U-Boot是用于多种嵌入式CPU( MIPS、x86、ARM等)的bootloader程序,U-Boot不仅支持嵌入式Linux系统的引导,还支持VxWorks, QNX等多种嵌入式操作系统。


查看S3C6410_Internal_ROM_Booting.pdf可看到系统启动的原理图如下:

Boot来DIY自己的arm11(6410)的bootloader


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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2c4b5a376011f5a91a566a097dc0a659.html