(学习资料摘抄和总结,非原创,勿载)
第一节 Bootloader基本概念
什么是Bootloader:是硬件启动的引导程序。是运行操作系统的前提。(类似于BIOS,将硬件信息告知操作系统来进行引导启动)
它是在操作系统内核和用户的应用程序之前就会运行的一段代码,用来对软硬件进行相应地初始化和设定,为最终运行操作系统准备好环境。
在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。
Bootloader的特点:
Bootloader不属于操作系统,采用汇编和C语言开发。需要针对特点的硬件平台编写。
在进行系统移植的时候,需要首先为开发板移植Bootloader,因为它是硬件启动的引导程序。
Bootloader依赖于CPU的体系结构,还依赖于嵌入式系统板设备的配置。
Bootloader操作模式:
自启动模式:过程没有用户介入,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行。
交互模式:可以通过串口接受用户的命令。目标机上的Bootloader通过串口或网络等从开发主机(HOST)上,下载内核映像和根文件系统映像等到RAM中。
常用的Bootloader工具:
第二节 U-Boot命令
命令类型:环境设置,数据传输,存储器访问,加载运行
命令: 1. printenv 显示所有环境变量
eg: U-boot #printenv
baudrate=115200
ipaddr=192.168.1.100
ethaddr=12:34:56:78:9A:BC
server ip=192.168.1.10
..............
2.setenv设置新的变量
U-boot # setenv myboard FS4412
U-boot# printenv
baudrate=115200
ipaddr=192.168.1.100
ethaddr=11:22:33:44:55:66
serverip=192.168.1.10
myboard=FS4412
Environment size:320/16380 bytes
3.saveenv 将当前定义的所有的环境变量值存入flash中
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
5.protect : 对Nor Flash写保护
protect on 0 10000 :对区间【0x0,0x10000】写保护
protect off 0 10000: 对FLASH区间【0x0,0x10000】取消保护
6.erase: 擦除Nor FLASH
erase all :擦除FLASH所有的扇区
erase 0 10000:擦除FLASH区间【0x0,0x10000】
7.Nand相关命令
nand read addr off size
nand write addr off size
nand erase [clean] [off size]
8.movi命令
movi init :初始化eMMC并显示相关信息
movi read u-boot/kernel addr
movi read rootfs addr size
movi write u-boot/kernel addr
movi write rootfs addr size
9.bootcmd 自启动命令:如果定义了该变量,在自启动模式下将会执行该环境变量中的命令
U-boot # setenv bootcmd tftp 41000000 uImage\; bootm 41000000
U-boot # saveenv
10.go addr:执行内存中的二进制代码,简单的跳转到指定的地址
11.bootm kernel-addr ramdisk-addr dtb-addr:引导内核为内核传参,其中内核和ramdisk通常为mkimage处理过的二进制文件
第三节.U-boot配置编译
1.平台相关:arch board include......
2.平台无关:common net fs drivers ...........
3.工具和文档:tools doc
目录结构如下:
U-boot的编译:
整个工程通过Makefile来组织编译。
顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。
------顶层目录下的Makefile------
它负责u-boot整体配置和编译
在Makefile中指定使用的交叉工具链
配置u-boot: make origen_config
编译: make
-----------U-boot编译生成的映像文件--------
文件名 内容
u-boot.map u-boot映像的符号表(方便源码跟踪)
u-boot u-boot映像的ELF格式
u-boot.bin u-boot映像原始的二进制格式(烧录用)(exynos4412需加入BL1)
u-boot.srec u-boot映像的S-Record格式
----------------------烧录编译产生的镜像 u-boot.bin -----------------------
-------初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录
专用的烧录工具如h-jtag或者DNW等
--------在u-boot已经能工作,升级或修正u-boot时,可用u-boot中的命令来烧录
其他方式如sd卡,Fastboot 命令
-------------------------------镜像固化位置-----------------------------------------
ROM, NOR, FLASH, NAND FLASH EMMC等
第四节 U-boot启动
第一条指令如何执行?
初始化哪些硬件,先后顺序如何?
如何加载内核?
性能提升?
注解:
-------BL1文件是一段外部代码,存放在SD卡或者nandflash上,除了BL1文件,还有BL0和BL2文件。
-------BL0文件是存放在CPU内部IROM中的一段固化代码,CPU上点之后,首先去运行BL0文件。
-------BL2文件是完整的U-boot代码。
-------三个文件的关系:BL0运行时,会将BL1拷贝到CPU的IRAM中,执行BL1
BL1文件执行起来之后会先初始化内存,后将BL2拷贝到外部内存中
======U-boot启动源码分析===========
----第一条指令位置(参考u-boot.map) arch/arn/cpu/armv7/start.S里的 _start:b reset
----设置为SVC模式 msr cpsr , r0
----关闭MMU Cache cpu_init_cp15
----基本硬件设备初始化: board/samsung/fs4412/lowlevel_init.S的 lowlevel_init
关中断,看门狗,初始化时钟,串口,flash内存
----自搬移到内存:relocate_code
----设置栈: IRQ stack frame
----主播进入C部分: bl _main(参见u-boot.map)
----大部分硬件初始化:arch\arm\lib\board.c\board_init_f 里的init_sequence
----搬移内核到内存运行:
common/main.c main_loop->getenv("bootcmd")
bootdelay >= 0 && s && !abortboot(bootdelay))下的run_command(bootcmd)
第五节 U-boot移植方法
----擅用对比软件Beyond
----选择官方源码版本下载,配置编译
指定交叉编译工具链-->指定CPU和board(参考最类似配置如origen)-->编译
----实现串口信息输出
跟踪运行路径(led点灯法);
串口输出(检查uart初始化相关部分代码,见lowlevel_init.s);
----网卡移植(实现能用tftp nfs 方便开发调试)
寄存器地址;
参数设置;
----FLASH移植(实现能下载软件到FLASH,产品能离线运行)