嵌入式Linux启动过程分析3-bootloader

选用u-boot作为系统的bootloader
bootloader定义:是一段程序,能在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核

使用bootloader的目的是:启动内核(终极目的是启动内核)
在这个过程中需要进行许多的工作包括:
1.读flash
2.初始化外设
3.启动内核

使用u-boot作为引导启动代码,工作过程可以分为两个阶段

第一阶段
1.硬件设备的初始化(主要针对ARM处理器的设置,其次还有本阶段使用外设的设定,如:看门狗,RAM(BANK设置),中断,CPU等)
2.为加载第二阶段的代码到RAM做准备
3.加载第二阶段代码到RAM中
4.设置栈
5.跳转到第二阶段的C入口处

第二阶段
1.初始化本阶段要使用的硬件设备(串口,网络,usb等,可以根据宏开关进行设置)
2.检测内存映射(确定板上使用多少的内存,他们的地址空间是多少,可以根据具体的硬件设备直接进行设置,不需要复杂的算法)
3.若不需要启动内核,则在此处main_loop()函数死循环,等待用户操作。需要则进行下列的操作
4.将内核和根文件系统从flash中读到RAM中(可能需要解压,根文件系统不是必要的这取决于什么类型的根文件系统及内核访问他的方法)
5.设置内核的启动参数
6.启动内核

u-boot通过启动参数与内核进行交互,通过R2寄存器标记启动参数列表在RAM中的首地址


使用过程分析:
一、配置过程
首先执行./mkconfig 。。。。。命令
作用:
1.获取平台信息
2.根据平台信息创建相应的链接文件(这样做的目的是同用性强)
3.生成顶层的config.mk文件(平台内容,arch等信息) include/config.mk
4.创建平台相关的头文件include/config.h。内容为相应的平台头文件,#include <configs/xxxxxxx.h>   相应的头文件为配置选项和参数。宏开关就是在此处
二、编译链接过程
执行make all即可编译

查看编译过程中显示的过程提示结合Makefile文件进行分析

在LDFLAGS 变量中有 -T board/smdk2410/U-Boot.lds -Ttext  0x33F80000 的字样

Makefile 中有
OBJS  = cpu/$(CPU)/start.o
OBJS := $(addprefix $(obj),$(OBJS))
LIBS参数
LIBS  = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2        /libjffs2.a \
    fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a

OBJS的第一个值为cpu/$(CPU)/start.o 即为/cpu/arm920t/start.o  

LIBS变量是平台相关的各个目录、通用目录下的库

OBJS、LIBS所代表的.o .a文件就是U-Boot的构成

$(OBJS):
                $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

$(LIBS):
                $(MAKE) -C $(dir $(subst $(obj),,$@))

$(SUBDIRS):
                $(MAKE) -C $@ all

会进入相应的目录执行make命令
当所有的.o 和.a文件生成后,就剩下最后的链接

对应Makefile中的

$(obj)u-boot:           depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
    UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
    cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
        --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
        -Map u-boot.map -o u-boot

  其中LDFLAGS确定了连接方式 -T board/smdk2410/U-Boot.lds -Ttext 0x33F80000 指定了程序的布局、地址

查看相应的U-Boot.lds文件
        . = 0x00000000;

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


确定了可执行文件的开始代码start.s






你可能感兴趣的:(嵌入式Linux启动过程分析3-bootloader)