<2012 11 2> U-boot(2)U-boot架构分析与移植重点

有关bootloader<主要来自韦东山的书 bootloader版本是u-boot-1.1.6>,新版2010.6以后的目录结构有些变化,但是主要文件相同:
----------------------------------------------------
一、bootloader一般是board上电或者复位后的第一个程序,由C程序和少量的汇编写成。

主要有两个作用:1、初始化系统引导内核;

        2、开发阶段帮助下载和调试程序。

二、bootloader的两个阶段的工作:
1、第一阶段
# 硬件设备初始化(关闭Watchdog、关中断、设置CPU速度和时钟频率、RAM初始化...有些硬件初始化可以拿到第二阶段去做)
# 加载bootloader的第二阶段代码到RAM空间(读Flash--写RAM),先要准备这个RAM空间。
# 设置好栈
# 跳转到第二阶段代码入口

2、第二阶段
# 初始化本阶段使用的硬件(如串口、网卡等)
# 检测系统的内存映射(memory map)
# 加载内核映像和根文件系统映像到RAM空间(读Flash--写RAM)
# 设置内核启动参数,在适当时候能跳转到内核入口函数
# 建立cmdline的交互环境(为了帮助开发)

---------------------------------------------------
三、内核工作前的CPU必须所处的状态
1、# 寄存器
    R0 = 0;
    R1 = machine ID; @对于ARM架构CPU,机器ID可以再内核代码linux/arch/arm/tools/mach-types中找到
    R2 = 启动参数<tag lists>在RAM中起始基地址
# CPU工作模式
    禁止中断(IRQs和FIQs)
    工作模式为SVC模式
# MMU和数据Cache必须关闭。(指令Cache可以任意)

2、CPU通过R1中的ID和R2指示的<tag lists>参数列表单向地接受bootloader传递的启动参数,并进行有关核对与初始化。

关于tag lists的定义可以再内核源码include/asm/setup.h中找到
# 设置标记ATAG_CORE
  (bootloader与内核约定的参数存放地址)
# 设置内存标记
  (内存起始地址和内存大小)
# 设置命令行标记
  (命令行就是一个字符串,可以用来控制内核的一些行为)
# 设置标记ATAG_NONE
  (tag lists以此标记结束)

----------------------------------------------------
四、U-boot的配置、编译链接分析
1、配置命令: make <board_name>_config
make all
==>U-boot.bin(平坦的二进制格式); U-boot(ELF格式); U-boot.srec(Motorola格式)
==>工具子目录 tools: mkimage用来生成带U-boot格式头的内核映像文件uImage,(linux内核映像vmlinuz)

2、./mkconfig $1 $2 $3 $4 $5 $6
  board_name arm arm920t board_name NULL s3c24x0
命令进行配置
# 确定开发板名称BOARD_NAME=$1

# 创建平台/开发板相关头文件的链接($2 = arm)
  asm ===> asm-$2
  asm-$2/arch ===> arch-$6
  asm-$2/proc ===> proc-armv

# 创建顶层Makefile包含的文件include/config.mk
  config.mk文件内容:
  ARCH = arm
  CPU = arm920t
  BOARD = board_name
  SOC = s3c24x0

# 创建开发板相关头文件include/config.h
  config.h文件内容:
  #include <configs/BOARD_NAME .h>

3、如果要在board目录下新建一个开发板<board_name>的目录,则需要同时建立开发板配置信息文件include/config/<board_name>.h
该开发板配置信息文件中有两类宏参数:

# CONFIG_XXXXX 。选项,用于选择CPU、SOC、开发板类型、设置系统时钟、选择设备驱动等。。

# CFG_XXX 。参数,用于设置malloc缓冲池大小、U-boot提示符、U-boot下载文件时的默认加载地址、Flash的起始地址等。。

编译链接时,宏开关CONFIG_来决定是否包含代码,宏配置CFG_设置详细参数。

4、U-boot编译流程

# 首先编译cpu/arm920t/start.S 以及该目录下其他文件

# 然后,对于平台和开发板相关的目录、以及在每个通用目录按Makefile文件生成相应的库( .o .a 文件)

# 将前面两步生成的 .o .a 文件按照board/board_name/config.mk文件中指定的代码段起始地址、以及board/(board_name)/U-boot.lds链接脚本,进行链接。

# 最后将得到的ELF格式的U-boot转化为.bin .srec格式

====》cpu/arm920t/start.S 在.lds中指定为整个U-boot的入口文件。

=================================================
五、U-boot启动过程源码分析
# 第一阶段代码
cpu/arm920t/start.S                       <== 平台相关(SoC chip级初始化)

board/board_name/lowlevel_init.S   <== 开发板相关(board级,比如SDRAM等其他外界设备初始化)

# 第二阶段代码
从lib_arm/board.c中的start_armboot函数开始
主要工作
  1 设置系统时钟、初始化串口(传出打印信息)
   设置MPLL、改变系统时钟 (board/board_name/board_name.c 文件)
  2 检测内存映射参数(即内存起始地址、大小等),会传递到内核
  3 实现U-boot的命令模式
  4 设置内核启动参数(tag lists)(lib_arm/armlinux.c 文件)
一般配置两个tags给内核就可以
include/config/<board_name>.h中:

  #define CONFIG_SETUP_MEMORY_TAGS 1
  #define CONFIG_CMDLINE_TAG 1

lib_arm/armlinux.c中定义函数:
  setup_memory_tags
  setup_comandline_tag

最后通过lib_arm/armlinux.c中的do_bootm_linux函数来启动内核。最后通过

theKernel(0,bi->bi_arch_number,bd->bi_boot_params)

来调用内核。bi->bi_arch_number是机器ID,bd->bi_boot_params是标记列表tag lists的起始地址。

==============================================
六、移植U-boot时,一般选择的board的SoC已经是bootloader支持的。主要要考虑的外围器件与SoC的接口特点,如:
1、内存SDRAM
2、NandFlash、NorFlash
3、网卡
4、LCD(如果要支持bootloader阶段的LCD)
5、USB

转载于:https://www.cnblogs.com/andrew-wang/archive/2012/11/04/2753972.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值