嵌入式linux-系统移植,U-Boot编译,BootLoader介绍,uboot命令,uboot目

2019-07-12 16:55发布

文章目录

1,Bootloader介绍

1.1,什么是Bootloader

Bootloader是硬件启动的引导程序,是运行操作系统的前提;
在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。
  • 板子上电运行的第一个程序
  • 只做两件事情:1、板子上电对硬件进行初始化;2、启动引导,加载内核

1.2,Bootloader的特点

Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
在移植系统时,首先为开发板移植Bootloader。
Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。

1.3,Bootloader的操作模式

自启动模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
交互模式:在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。可以被 Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。也可以通过串口接收用户的命令。(板子上电后,在3,2,1倒计时之内敲键盘enter键,后进入进入该模式)

1.4,常用Bootloader介绍

在这里插入图片描述

1.5,u-boot介绍

u-boot(Universal Boot Loader)是德国DENX小组开发的用于多种嵌入式CPU的bootloader程序。遵循GPL条款。
从FADSROM、8xxROM 、PPCBOOT、Armboot逐步发展演化而来;
当前版本号:参考Makefile。
http://www.denx.de/wiki/U-Boot/WebHome
U-boot的特点:
代码结构清晰、易于移植(见目录结构)
支持多种处理器体系结构(见arch目录)
支持众多开发板(目前官方包中有200多种,见board目录)
命令丰富、有监控功能
支持网络协议、USB、SD等多种协议和设备
支持文件系统
更新较活跃,使用者多,有助于解决问题

2,U-boot命令介绍

命令分类
环境设置、数据传输、存储器访问、加载运行

2.1,printenv 显示所有环境变量

在这里插入图片描述

2.2,setenv 设置新的环境变量

U-boot # setenv myboard FS4412

2.3,saveenv 将当前定义的所有的环境变量值存入flash中

2.4,tftp 通过网络下载程序

U-boot # setenv ethaddr 11:22:33:44:55:66 //设置开发板的物理地址 U-boot # setenv ipaddr 192.168.1.100 U-boot # setenv serverip 192.168.1.10 U-boot # tftp 41000000 application.bin U-boot # tftp 41000000 zImage

2.4,protect 对Nor Flash写保护

protect on 0 10000 对区间[0x0, 0x10000]进行写保护
protect off 0 10000 对上述区间取消写保护

2.5,erase 擦除Nor FLASH

erase all 擦除FLASH所有的扇区
erase 0 10000 把FLASH区间 [0x0, 0x10000]擦除

2.6,Nand相关命令

nand read addr off size
nand write addr off size
nand erase [clean] [off size] NAND flash和NOR flash的区别详解 https://zhidao.baidu.com/question/1993729068599410707.html
NAND flash按块访问和NOR flash按字节访问
NAND flash必须先擦出后写

2.7,movi 命令

movi init —初始化eMMC并显示相关信息
movi read u-boot/kernel addr //读u-boot或读kernel,可以选择
movi write u-boot/kernel addr
movi read rootfs addr size
movi write rootfs addr size

2.8,bootcmd 自启动命令

如果定义了该变量,在自启动模式下将会执行该环境变量中的命令。
将文件通过tftp自动下载到指定的地址
U-boot # setenv bootcmd tftp 41000000 uImage; bootm 41000000
U-boot # saveenv 在这里插入图片描述 bootargs 是uboot传递给内核到启动参数,是一个字符串 console=xxx: 告诉内核启动时候到调试信息是从哪个设备输出,这里是串口2 init=xxx: 告诉内核linux到第一个用户进程是什么 root=xxx : 告诉内核根文件系统在哪里 root=/dev/nfs 表示根文件系统在网路远端 nfsroot=(开发板)ip:path rw 其中rw表示可读可写 ip=xxx :(Ubuntu ip)告诉内核开机的时候内核的ip地址是多少(静态分配ip) 在这里插入图片描述

2.8.1,bootm kernel-addr ramdisk-addr dtb-addr

引导内核为内核传参,其中内核和ramdisk通常为mkimage处理过的二进制文件。
从这个地址处自动启动程序
在这里插入图片描述

2.9,go addr 执行内存中的二进制代码,简单的跳转到指定地址(运行裸机程序)

3,U-BOOT 配置编译

3.1,U-Boot目录结构

平台相关
arch, board, include…
平台无关
common, net, fs, drivers…
工具和文档
tools, doc 在这里插入图片描述

3.2,配置编译

在这里插入图片描述

3.2.1,拷贝移植好的uboot,并解压

linux@linux:~$ cp /mnt/hgfs/Linuxsharexiaomei/u-boot-2013.01-fs4412.tar.xz linux@linux:~$ tar -vxf u-boot-2013.01-fs4412.tar.xz linux@linux:~$ cd u-boot-2013.01-fs4412/ linux@linux:~/u-boot-2013.01-fs4412$ ls api common drivers lib net spl arch config.mk dts MAINTAINERS post test board COPYING examples MAKEALL README tools boards.cfg CREDITS fs Makefile rules.mk build.sh disk helper.mk mkconfig sdfuse_q CodeSign4SecureBoot doc include nand_spl snapshot.commit

3.2.2,进入解压好的目录,使用Makefile或build.sh编译

  1. U-boot的编译
    整个工程通过Makefile来组织编译。顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。
  2. 顶层目录下的 Makefile
    它负责u-boot整体配置和编译
    在Makefile中指定使用的交叉工具链
    配置u-boot: make origen_config (先指定是哪个平台,再使用make命令编译)
    编译: make
linux@linux:~/u-boot-2013.01-fs4412$ make System not configured - see README make: *** [all] Error 1 linux@linux:~/u-boot-2013.01-fs4412$ make origen_config Configuring for origen board... linux@linux:~/u-boot-2013.01-fs4412$ make
或通过脚本执行Makefile
./build.sh
build.sh如下所示
linux@linux:~/u-boot-2013.01-fs4412$ cat build.sh #!/bin/sh sec_path="CodeSign4SecureBoot/" CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}') ROOT_DIR=$(pwd) CUR_DIR=${ROOT_DIR##*/} case "$1" in clean) echo make clean make mrproper ;; *) if [ ! -d $sec_path ] then echo "**********************************************" echo "[ERR]please get the CodeSign4SecureBoot first" echo "**********************************************" return fi make fs4412_config make -j$CPU_JOB_NUM if [ ! -f checksum_bl2_14k.bin ] then echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "There are some error(s) while building uboot, please use command make to check." echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" exit 0 fi cp -rf checksum_bl2_14k.bin $sec_path cp -rf u-boot.bin $sec_path rm checksum_bl2_14k.bin cd $sec_path cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-fs4412.bin mv u-boot-fs4412.bin $ROOT_DIR rm checksum_bl2_14k.bin rm u-boot.bin echo echo ;; esac

3.2.2.1,使用build.sh编译

linux@linux:~/u-boot-2013.01-fs4412$ ./build.sh

3.2.2.2,编译出错

12/spl/board/samsung/common/libsamsung.o /home/linux/u-boot-2013.01-fs4412/spl/board/samsung/fs4412/libfs4412.o | sed -n -e '/.*.u_boot_list[^ ]+/ ! {d;n}' -e 's/.*(.u_boot_list[^ ]+).*$/1/' -e 's/.[^.]+$//' -e ':s /^.+$/ { p;s/^(.*).[^.]*$/1/;b s }' | sed -n -e 'h;s/$/a/p;g;s/$/@/p;g;s/$/~/p;' | LC_COLLATE=C sort -u | sed -n -e '/a$/ { s/./_/g;s/a$/__start = .;/p; }' -e '/~$/ { s/./_/g;s/~$/__end = .;/p; }' -e '/@$/ { s/(.*)@$/*(SORT(1.*));/p }' > /home/linux/u-boot-2013.01-fs4412/spl/u-boot.lst arm-none-linux-gnueabi-gcc -E -g -Os -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -ffunction-sections -fdata-sections -DCONFIG_SYS_TEXT_BASE=0x43E00000 -DCONFIG_SPL_BUILD -I/home/linux/u-boot-2013.01-fs4412/include -fno-builtin -ffreestanding -nostdinc -isystem /home/linux/gcc-4.6.4/bin/../lib/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/include -pipe -DCONFIG_ARM -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux -march=armv7-a -include /home/linux/u-boot-2013.01-fs4412/include/u-boot/u-boot.lds.h -include /home/linux/u-boot-2013.01-fs4412/include/config.h -DCPUDIR=arch/arm/cpu/armv7 -I/home/linux/u-boot-2013.01-fs4412/spl/. -ansi -D__ASSEMBLY__ -P - < /home/linux/u-boot-2013.01-fs4412/arch/arm/cpu/u-boot.lds > /home/linux/u-boot-2013.01-fs4412/spl/u-boot-spl.lds cd /home/linux/u-boot-2013.01-fs4412/spl/ && arm-none-linux-gnueabi-ld.bfd -T /home/linux/u-boot-2013.01-fs4412/spl/u-boot-spl.lds --gc-sections -Bstatic arch/arm/cpu/armv7/start.o --start-group arch/arm/cpu/armv7/exynos/libexynos.o arch/arm/cpu/armv7/libarmv7.o arch/arm/lib/libarm.o board/samsung/common/libsamsung.o board/samsung/fs4412/libfs4412.o --end-group /home/linux/u-boot-2013.01-fs4412/spl/arch/arm/lib/eabi_compat.o -L /home/linux/gcc-4.6.4/bin/../lib/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4 -lgcc -Map u-boot-spl.map -o u-boot-spl arm-none-linux-gnueabi-objcopy --gap-fill=0xff -O binary /home/linux/u-boot-2013.01-fs4412/spl/u-boot-spl /home/linux/u-boot-2013.01-fs4412/spl/u-boot-spl.bin /home/linux/u-boot-2013.01-fs4412/tools/mkfs4412spl /home/linux/u-boot-2013.01-fs4412/spl/u-boot-spl.bin /home/linux/u-boot-2013.01-fs4412/spl/fs4412-spl.bin /home/linux/u-boot-2013.01-fs4412/tools/mkfs4412spl: 1: /home/linux/u-boot-2013.01-fs4412/tools/mkfs4412spl: Syntax error: "(" unexpected make[1]: *** [/home/linux/u-boot-2013.01-fs4412/spl/fs4412-spl.bin] Error 2 make[1]: Leaving directory `/home/linux/u-boot-2013.01-fs4412/spl' make: *** [spl/u-boot-spl.bin] Error 2
3.2.2.2.1,解决
linux@linux:~/u-boot-2013.01-fs4412$ cd tools/ linux@linux:~/u-boot-2013.01-fs4412/tools$ rm mkfs4412spl linux@linux:~/u-boot-2013.01-fs4412/tools$ cd ../ linux@linux:~/u-boot-2013.01-fs4412$ make clean linux@linux:~/u-boot-2013.01-fs4412$ ./build.sh

3.2.3,U-BOOT编译生成的映像文件

linux@linux:~/u-boot-2013.01-fs4412$ ls api build.sh COPYING drivers helper.mk MAKEALL net sdfuse_q test u-boot-fs4412.bin arch CodeSign4SecureBoot CREDITS dts include Makefile post snapshot.commit tools u-boot.lds board common disk examples lib mkconfig README spl u-boot u-boot.map boards.cfg config.mk doc fs MAINTAINERS nand_spl rules.mk System.map u-boot.bin u-boot.srec 文件名称 说明 u-boot.map U-boot映像的符号表(方便源码跟踪) u-boot U-Boot映像的ELF格式 u-boot.bin U-Boot映像原始的二进制格式(烧录用)
注意exynos4412需加入BL1 u-boot.srec U-Boot映像的S-Record格式

3.2.3.1,u-boot-fs4412.bin

  1. u-boot.bin是uboot编译源码后直接产生的,一般的的开发板,直接烧写这个文件就可以了
  2. 但是三星的cortex_a9 exynos4412这款CPU把uboot中一些初始化时钟等的代码剥离出去了,所以,编译好的这个u-boot.bin还要加上被剥离出去的部分,才可以正常使用
  3. 所以在build.sh脚本文件中,在u-boot.bin之前加上了剥离出去的部分后,生成了u-boot-fs4412.bin
在这里插入图片描述 在这里插入图片描述