uboot 全称 universal boot loader,用来启动操作系统的。
其实,就是一段比较复杂的单片机代码,用来作为引导程序,它的主要任务是初始化硬件设备,将系统的软硬件环境带到一个合适的状态,再将内核从一个存储介质读入到内存中,然后,跳到内核的入口点去执行,即操作系统(OS)。
Das U-Boot is an open source, primary boot loader used in embedded devices. It is available for a number of different computer architectures, including 68k, ARM, AVR32, Blackfin, MicroBlaze, MIPS, Nios, PPC, and x86.
U-Boot是遵循GPL条款的开饭源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核远程许进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系统。
A boot loader is a computer program that loads an operation system or some other software for the computer after completion of the self-tests. Within the hard reboot process, it runs after completion of the self-tests, then loads and runs the software. A boot loader is loaded into main memory from persistent memory, such as a hard disk drive or, in some older computers, from a medium such as punched cards, punched tape, or magnetic tape. The boot loader then loads and executes the processes that finalize the boot. Like POST(power-on self-tests) processes, the boot loader code comes from a "hard-wired" and persistent location; if that location is too limited for some reason, that primary boot loader calls a second-stage boot loader or a secondary program loader.
选择U-Boot的理由:
①开放源码
②支持多种嵌入式操作系统内核
③支持多个处理器系列
④较高的可靠性和稳定性
⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等
⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等
⑦较为丰富的开发吊事文档与强大的网络技术支持。
Boot is short for bootstrap or bootstrap load and devices from the phrase to pull oneself up by one's bootstraps.
The importance of Das U-Boot in embedded Linux systems is quite succinctly stated in the book Building Embedded Linux Systems, by Karim Yaghmour, whose text about U-Boot begins, "Though there are quite a few other bootloaders, 'Das U-Boot' the universal bootloader, is arguably the richest, most flexible, and most actively developed open source bootloader available."
U-Boot 有两种工作模式:启动模式和下载模式。
U-Boot启动过程属于两个阶段stage1(编译)和stage2(C语言),stage1完成初始化硬件,为stage2准备内存空间,并将stage2的代码复制到内存中,设置好堆栈,然后,跳转到stage2,在stage2中调用内核。
1.编译生成U-Boot.bin 文件
以mini2440移植U-Boot为例(未经移植的U-Boot不支持mini2440\)
(1)选择要使用的board
make mini2440_config
(2)编译生成u-boot.bin
make CROSS_COMPILE=arm-linux-
2.U-Boot的使用-基本命令
不通过单板所支持的命令不一定会一样
(1)help用于查看当前单板所支持的所有命令
(2)printenv 查看环境相关变量
(3)setenv 添加、修改、删除环境变量
setenv name value 修改或添加变量name
setenv name 删除变量name
(4)saveenv 保持环境变量,将当前的定义的所有环境变量保存到flash
(5)tftp 通过网络下载文件(需要先配置网络)
例如:
Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.2.118
Uboot> setenv serverip 192.168.2.1 (tftp服务器地址)
Uboot> tftp 32000000 uImage (把serverip中的服务目录下的uImage通过tftp读入到 0x32000000)
(6) md 显示内存区的内容
md 采用16禁止和ASCII码两种形式来显示存储单元的内容
md 可以采用标识符.l(长字),.w(字), .b(字节)
Uboot> md.w 100000 以字的形式显示在0x100000处的内容
(7)mm 修改内存,地址自动增加
用法 mm[.b, .w, .l]address
mm提供一种互动修改存储器内容的方法,它会显示地址和当前的值,然后,提示用户输入 。如果输入了一个合法的16禁止的值,将会被写入改地址,然后,提示下一个地址。如果没有任何输入值,只是按下回车,那么该地址的内容保持不变。结果输入,则输入空格再回车。
Uboot> mm 100000
(8)flinfo 查看flash扇区信息
(9)protect flash写保护,打开或关闭扇区写保护
用法 protect off|on all 关闭|打开所有扇区的写保护
protect off|on start end 关闭/打开从start到end扇区的写保护(start和end是指定扇区的地址)
(10)erase 擦除flash扇区
用法 erase start end
在使用cp命令向nor flash 写入数据之前必须要先使用erase命令查除flash,因为nor flash按字节写入时,无法写入1,所以必须通过擦除来写入1.
Uboot> erase 3000 1effff
(11)cp 拷贝数据
用法cp [.b, .w, .l]src_address dst_address len 将内存 src_address 地址处的数据(长度为len)拷贝到dst_address处
cp提供了一种内存与内存,内存与flash之间数据拷贝的方法
Uboot>cp.b 31000000 50000 d0000
(12)go 执行内存中的二进制代码
用法 go addr [arg...]
(13)bootm 执行内存中的二进制代码,要求二进制代码有固定的头文件
(14)bdinfo(简写为bdi)显示开发信息
U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:
(1) 第一阶段的功能
*硬件设备初始化
*加载U-Boot第二阶段代码到RAM空间
*设置好栈
*跳转到第二阶段代码入口
(2)第二阶段的功能
*初始化本阶段使用的硬件设备
*检测系统内存映射
*将内核从Flash读取到RAM中
*为内核设置启动参数
*调用内核
开发板的Boot方式是什么,开发板上电以后是怎么执行的。
一般来说,三星的开发板有三种方式:nand、nor和ram。
具体用哪一种方式启动要看对应的CPU寄存器配置,如,S3C2440的CPU的OM[0:1]这两个引脚。
nand:对于2440来说,CPU是不给nand-flash分配地址空间的,nand-flash只相当于CPU的一个外设,S3C2440做了一个从nand-flash启动的机制。开发板一上电,CPU就自动复制。
nand-flash里面的前4K-Bytes内容到S3C2440内部集成的SDRAM,然后,把4K内容所在的RAM映射到S3C2440的0地址,从0地址开始执行。这4K的内容主要负责下面的这些工作:初始化中断矢量、设定CPU的工作模式为SVC32模式、屏蔽看门狗、屏蔽中断、初始化时钟、把整个U-Boot重定向到外部SDRAM、跳到主要的C函数入口。
nor:早起的时候,利用nor-flash启动的方式比较多,就是把U-Boot少些到nor-flash里面,直接把nor-flash映射到S3C2440的0地址,上电从0地址开始执行。
ram:直接把U-Boot放到外部SDRAM上跑,这一般debug时候用到。
所有版本的u-boot源代码压缩包都可以在ftp://ftp.denx.de/pub/u-boot/下载。