- BootLoader:嵌入式系统从开始上电到系统启动需要一个引导过程,这个引导程序就叫作启动加载程序,即BootLoader。它在操作系统运行之前运行,它负责初始化硬件设备,建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。最常用的一种就是uboot。
- uboot的配置编译:uboot的编译是基于GNU Makefile组织编译的,顶层的Makefile完成对开发板整体配置,然后递归调用各级子目录下的Makefile,最后把所有编译过的程序链接成u-boot映像。 具体的配置流程:
- 解压uboot源码:"$ tar -xvf u-boot-2013.01.tar.bz2"
- 修改顶层的Makefile(改为自己交叉编译工具链):ifeq (arm, $(ARCH)) CROSS_COMPILE ?= /opt/arm-linux-gcc-4.8.3/bin/arm-none-linux-gnueabi-
- 进入源码目录,并配置:"$make exynos4412_config"
- 编译:make 编译好的uboot就可以烧写到开发板中。
- 串口调试命令:uboot烧写好后,还需要串口调试设置相关环境变量,主要有:
- 设置内核启动参数:setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200init=/linuxrc ip=192.168.9.233
- 自启动命令:bootcmd=自启动命令1;自启动命令2; ...(U-BOOT是单任务的裸机代码,不支持多任务,如果需要多个命令自启动,需要用命令分隔符“;”,按次序顺序执行:)setenv bootcmd tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
- 删除环境变量:$ setenv 变量
- 保存环境变量:$ saveenv
- uboot 的启动分析:uboot的启动流程是指从开机上电执行uboot到uboot加载操作系统的过程。可分为2个阶段
- 第一阶段功能:硬件设备初始化,加载uboot第二阶段代码到RAM中,设置好栈,跳转到第二阶段的代码入口。入口代码start.S
- 设置异常向量表
- 设置CPU的工作模式为系统模式,屏蔽中断。
- 设置控制寄存器地址
- 关闭看门狗
- 设置时钟
- 关闭MMU和Cache
- 初始化存储控制器:lowlevel_init
- 第二阶段:复制uboot到RAM
- 设置栈:栈是执行C程序的必要条件,因此进入C语言实现的初始化代码前,需要通过汇编进行栈的初始化。
- 清除BSS段
- 跳转到第二阶段代码入口
- 板级相关的初始化:board_init
- 时钟初始化:timer_init
- 环境变量初始化:env_init
- 串口、控制台初始化:init_baudrate,serial_init、console_init_f
- 配置内存:dram_init
- NORFlash初始化:flash_init
- Nand Flash初始化
- 调用main_loop
来源:https://www.cnblogs.com/endless-loop/p/6476398.html