1 uboot其实就是个大程序,大的裸机程序
2 uboot 和Linux内核不一样,他没有多任务调度运行的机制,不能实现任务调度等操作系统应用功能,虽然可以挂接文件系统,也可以有网络协议栈
3 uboot最初执行的是汇编,集中在那三个汇编文件当中,然后就是C代码了
uboot起初是为powerpc开发的启动程序,uboot是个bootloader,类似于PC机上的bios,常见的bootloader有:
里面的net文件夹 放的就是TCP/IP网络协议栈,net中的文件就是 都对印着一个网络协议源代码,很多人想移至网络功能,都在里面了。
board 里面讲的是和某块板子相关的代码,是板级代码
cpu 目录里是对应的不同处理器的初始化代码(也就是说uboot能支持非常多的处理器,和非常多不同的开发板)
drivers 目录里面就是一些驱动,GPIO,I2C,PCI等,驱动很多都是通用的,可以直接用,根据不同的板子可以自己修改代码 来移植
u-boot.lds 这个文件是编译链接脚本,用来描述输出文件的内存布局(这个文件平时看不到),在cpu\A9里面,而且编译以后再根目录也会出现,可以看一下虚拟机中的
在 u-boot.lds中可以看到,先执行什么,在哪个文件执行
里面有这么几句
.text :
{
cpu/arm_cortexa9/start.o (.text)
cpu/arm_cortexa9/s5pc210/cpu_init.o (.text)
board/samsung/smdkc210/lowlevel_init.o (.text)
common/ace_sha1.o (.text)
*(.text)
}
uboot的执行过程是先执行start.s(start.o是源文件 start.s生成的),再执行cpu_init.s,
uboot最开始执行的代码,就是用汇编写的,就是这个start.s的代码,代码的最开始
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
上面的几行代码表示中断向量的意思,比如说一个中断来了,他会跳到 ldr pc, _irq
如果执行一个非法指令,系统会跳到 ldr pc, _undefined_instruction
这个过程和8051中的中断向量很像
ARM的每条指令是对齐的,都是占用4个字节,也就是说 ,中断向量表各个指令的位置是确定的,这样才能在中断发生时,系统能到固定的地址处找到相关指令
不管怎么样,uboot首先要执行start.s中的汇编程序,还有cpu/arm_cortexa9/s5pc210/cpu_init.s,board/samsung/smdkc210/lowlevel_init.s,这第三个都是汇编程序,
首先
cpu_init.s: 中的主要功能是初始化DDR内存,这里面有个mem_ctrl_asm_init_ddr3函数,这个函数是被其他文件调用的(因为前面有个global的关键字), 如果我们换了内存颗粒,就可以修改这里的代码(需要结合处理器的手册修改),实际上也是移植uboot的一个方面。
lowlevel_init.s:这里调用了 mem_ctrl_asm_init_ddr3
start.s:这里调用了lowlevel_init.s
总体的逻辑关系就是:start.s --调用---> lowlevel_init.s ----调用---> cpu_init.s
在start.s 中里面有一句,
它的意思是把函数start_armboot的地址,赋值给pc指针,ldr是装载命令,下一个指令就从start_armboot函数开始执行了,而且start_armboot这个函数是个c函数,他在文件 lib_arm/board.c 中,这样,就完成了从执行汇编语句到执行C语言语句的转变,从此以后就全是c了。