什么是u-boot
uboot是个bootloader,是个大软件,是个最大的裸机程序,但是uboot没有多任务运行的机制,不能实现任务调度等操作系统应用的功能,虽然有协议栈,有文件系统,但是没有多任务运行的内核
uboot是研究裸机最好的范例,这个是本质区别
uboot包含了非常丰富的功能,而且是源代码全开放
U-boot的特点:
- 代码结构清晰、易于移植(见目录结构)
- 支持多种理
- 体系结构(见arch目录)
- 支持众多开发板(目前官方包中有200多种,见board目录)
- 命令丰富、有监控功能
- 支持网络协议、USB、SD等多种协议和设备
- 支持文件系统
- 更新较活跃,使用者多,有助于解决问题
最初是为powerpc开发的启动程序
内核启动以后,uboot就没什么事了,完成任务靠边站了
除了uboot以外,还有什么别的bootloader吗?
什么是协议栈?
就是网络TCP/IP的协议栈,其中有个文件夹叫做‘NET’,这个里面就是TCP/IP网络协议栈,网络功能,都在里面了
在uboot目录下重点说三个目录
- board
- CPU
- drivers
board里面是讲的和某块板子相关的代码,是板级的代码
CPU 目录里是对应的不同处理器的初始化代码,也就是说uboot能支持非常多的处理器,和非常多的不同的开发板,比如说2440也可以跑uboot,6410, 210, 4412 全可以跑uboot,它是个非常开放的系统,完全开源
drivers目录里面就是一些驱动了,GPIO, I2C, PCI, LCD 等驱动都在里面,驱动很多是通用的,可以直接用,根据不同的板子可以自己修改代码来移植
那么uboot在运行的时候,到底选择哪个呢,怎么选的呢
比如,我们现在用的是迅为的4412开发板,怎么选4412需要的代码呢?
u-boot.lds, 这个文件很重要------编译连接脚本,用来描述输出文件的内存布局,在CPU\A9中,也可以在编译以后,根目录里也会出现!
这个文件中有u-boot先执行什么,在哪个文件里执行,也就是4412的启动过程
u-boot.lds
1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
2 OUTPUT_ARCH(arm)
3 ENTRY(_start)
4 SECTIONS
5 {
6 . = 0x00000000;
7 . = ALIGN(4);
8 .text :
9 {
10 cpu/arm_cortexa9/start.o (.text)
11 cpu/arm_cortexa9/s5pc210/cpu_init.o (.text)
12 board/samsung/smdkc210/lowlevel_init.o (.text)
13 common/ace_sha1.o (.text)
14 *(.text)
15 }
16 . = ALIGN(4);
17 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
18 . = ALIGN(4);
19 .data : { *(.data) }
20 . = ALIGN(4);
21 .got : { *(.got) }
22 __u_boot_cmd_start = .;
23 .u_boot_cmd : { *(.u_boot_cmd) }
24 __u_boot_cmd_end = .;
25 . = ALIGN(4);
26 __bss_start = .;
27 .bss : { *(.bss) }
28 _end = .;
29 }
在汇编里看到 ’ .globl‘的关键字,就说明这个函数是能被别的文件调用的
可以看出u-boot的执行过程:
-
先执行 start.s 生成 start.o
cpu/arm_cortexa9/start.s
ldr pc, _start_armboot //
汇编到c函数
函数
start_armboot
的地址,赋值给pc指针
ldr是装载命令,这样,下一个指令就从start_armboot
函数开始执行了
start_armboot
这个函数是个C函数
它在文件lib_arm/board.c
中
就完成了从执行汇编语句到执行C语言语句的转变 -
在执行
cpu_init.s
生成cpu_init.o
cpu/arm_cortexa9/s5pc210/cpu_init.s
主要功能就是初始化DDR内存,也就是设置DDR加粗样式的参数,让DDR3能工作起来
mem_ctrl_asm_init_ddr3 这个函数是可以被别的文件调用的 -
在执行 lowlevel_init.s 生成 lowlevel_init.o
board/samsung/smdkc210/lowlevel_init.s
uboot最初执行的是汇编,集中在那三个汇编文件当中,然后就是C代码了,(在设置完栈之后就会转入c代码)。