uboot初探

总结:

    1   uboot其实就是个大程序,大的裸机程序

    2   uboot 和Linux内核不一样,他没有多任务调度运行的机制,不能实现任务调度等操作系统应用功能,虽然可以挂接文件系统,也可以有网络协议栈

    3   uboot最初执行的是汇编,集中在那三个汇编文件当中,然后就是C代码了

uboot起初是为powerpc开发的启动程序,uboot是个bootloader,类似于PC机上的bios,常见的bootloader有:

uboot初探_第1张图片

uboot源码解压以后是这样子的:

uboot初探_第2张图片

里面的net文件夹 放的就是TCP/IP网络协议栈,net中的文件就是 都对印着一个网络协议源代码,很多人想移至网络功能,都在里面了。

uboot初探_第3张图片

uboot源码中的重点目录:board     , drivers   ,cpu

board    里面讲的是和某块板子相关的代码,是板级代码

cpu       目录里是对应的不同处理器的初始化代码(也就是说uboot能支持非常多的处理器,和非常多不同的开发板)

drivers  目录里面就是一些驱动,GPIO,I2C,PCI等,驱动很多都是通用的,可以直接用,根据不同的板子可以自己修改代码                 来移植

uboot初探_第4张图片

uboot运行的时候如何选择哪个处理器?

u-boot.lds 这个文件是编译链接脚本,用来描述输出文件的内存布局(这个文件平时看不到),在cpu\A9里面,而且编译以后再根目录也会出现,可以看一下虚拟机中的

uboot初探_第5张图片

在 u-boot.lds中可以看到,先执行什么,在哪个文件执行

uboot初探_第6张图片

里面有这么几句

 .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  

汇编执行完,怎么调到C文件里面呢?

在start.s 中里面有一句,

uboot初探_第7张图片

它的意思是把函数start_armboot的地址,赋值给pc指针,ldr是装载命令,下一个指令就从start_armboot函数开始执行了,而且start_armboot这个函数是个c函数,他在文件   lib_arm/board.c  中,这样,就完成了从执行汇编语句到执行C语言语句的转变,从此以后就全是c了。

    

你可能感兴趣的:(嵌入式开发_iTop4412)