u-boot系统启动流程

u-boot系统启动流程


u-boot系统启动流程 大多数bootloader都分为stage1stage2两部分,u-boot也不例外。

依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

1Stage1

   start.S代码结构 u-bootstage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下

(1) 定义入口:该工作通过修改连接器脚本来完成。

2)设置异常向量(Exception Vector)。 

3)设置CPU的速度、时钟频率及终端控制寄存器。 

4)初始化内存控制器。 

5)将ROM中的程序复制到RAM中。 

6)初始化堆栈。 

7)转到RAM中执行,该工作可使用指令ldr pc来完成。

2Stage2

   C语言代码部分 lib_arm/board.c中的start arm bootC语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-bootarmboot)的主函数,该函数只要完成如下操作: 

1)调用一系列的初始化函数。 

2)初始化Flash设备。 

3)初始化系统内存分配函数。 

4)如果目标系统拥有NAND设备,则初始化NAND设备。 

5)如果目标系统有显示设备,则初始化该类设备。 

6)初始化相关网络设备,填写IPMAC地址等。 

7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

 


Uboot是嵌入式系统中最常用的bootloader,这里我们以s3c2410为例分析一下uboot的启动流程。首先通过uboot的链接文件,我们可以看到uboot运行是执行的第一段代码在start.S中。

ENTRY(_start)
        SECTIONS
        {
                . = 0x00000000;

        . = ALIGN(4);
                .text :
                {
                        cpu/arm920t/start.o (.text)
                        *(.text)
                }

        . = ALIGN(4);
                .rodata : { *(.rodata) }

        . = ALIGN(4);
                .data : { *(.data) }

        . = ALIGN(4);
                .got : { *(.got) }

        . = .;
                __u_boot_cmd_start = .;
                .u_boot_cmd : { *(.u_boot_cmd) }
                __u_boot_cmd_end = .;

        . = ALIGN(4);
                 __bss_start = .;
                .bss : { *(.bss) }
                _end = .;
        }

我们找到这个文件,以这个文件为起点看uboot的启动流程。这里我们通过一个图来说明这个过程。

u-boot系统启动流程_第1张图片

最后我们把整个uboot在执行过程中,代码的搬移籍内存的使用情况通过一个图,来说明一下。

u-boot系统启动流程_第2张图片


你可能感兴趣的:(u-boot系统启动流程)