浅谈u-boot

什么是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代码)。

猜你喜欢

转载自blog.csdn.net/qq_44715649/article/details/89381573