bootloader简述

来源:互联网 发布:骑马与砍杀战团mac版 编辑:程序博客网 时间:2024/05/29 14:57
Bootloader 是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始
化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系
统内核做好准备。
Bootloader 的启动
Linux 系统是通过 Bootloader 引导启动的。一上电,就要执行 Bootloader 来初始化系统。
系统加电或复位后,所有 CPU 都会从某个地址开始执行,这是由处理器设计决定的。
ARM 处理器在复位时从地址 0x00000000 取第一条指令。 嵌入式系统的开发板都要把板上 ROM 或 Flash 映射到这个地址。因此,必须把 Bootloader 程序存储在相应的 Flash 位置。系统加电后,CPU 将首先执行它。 
主机和目标机之间一般有串口可以连接,Bootloader 软件通常会通过串口来输入输出。
Bootloader 的主要功能是引导操作系统启动。 
1.
网络启动方式 这种方式开发板不需要配置较大的存储介质,跟无盘工作站有点类似。但是使用这种启 动方式之前,需要把 Bootloader
安装到板上的 EPROM 或者 Flash 中。Bootloader 通过以太网 接口远程下载 Linux
内核映像或者文件系统。这种方式对于嵌入式系统开发来说非常重要。 
使用这种方式也有前提条件,就是目标板有串口、以太网接口或者其他连接方式。
串口 一般可以作为控制台,同时可以用来下载内核影像和 RAMDISK 文件系统。
串口通信传输速 率过低,不适合用来挂接 NFS 文件系统。所以以太网接口成为通用的互连设备,一般的开发 板都可以配置 10M 以太网接口。 

于 PDA 等手持设备来说, 以太网的 RJ-45 接口显得大了些, USB 接口, 而 特别是 USB
的迷你接口,尺寸非常小。对于开发的嵌入式系统,可以把 USB 接口虚拟成以太网接口来通 讯。这种方式在开发主机和开发板两端都需要驱动程序。
另外,还要在服务器上配置启动相关网络服务。
Bootloader 下载文件一般都使用 TFTP 网络协议,还可以通过 DHCP
的方式动态配置 IP 地址。 DHCP/BOOTP 服务为 Bootloader 分配 IP 地址,配置网络参数,然后才能够支持网络传
输功能。如果 Bootloader 可以直接设置网络参数,就可以不使用 DHCP。 TFTP 服务为 Bootloader
客户端提供文件下载功能,把内核映像和其他文件放在/tftpboot目录下。这样 Bootloader 可以通过简单的 TFTP
协议远程下载内核映像到内存。
2. NOR Flash 可以支持随机访问,所以代码是可以直接在 Flash 上执行的.通常需要把 Flash 分区使用,每个区的大小应该是 Flash 擦除块大小的整数倍.
Bootloader 一般放在 Flash 的底端或者顶端,这要根据处理器的复位向量设置。要使 Bootloader 的入口位于处理器上电执行第一条指令的位置。
接下来分配参数区,这里可以作为 Bootloader 的参数保存区域。 
再下来内核映像区。Bootloader 引导 Linux 内核,就是要从这个地方把内核映像解压到 RAM 中去,然后跳转到内核映像入口执行。
然后是文件系统区。如果使用 Ramdisk 文件系统,则需要 Bootloader 把它解压到 RAM 中。 如果使用 JFFS2 文件系统,将直接挂接为根文件系统。
最后还可以分出一些数据区,这要根据实际需要和 Flash 大小来考虑了。 这些分区是开发者定义的,Bootloader 一般直接读写对应的偏移地址。到了 Linux 内核 空间,可以配置成 MTD 设备来访问 Flash 分区。
NAND
Flash具有芯 片价格低,存储容量大的特点。但是这些芯片一般通过专用控制器的 I/O 方式来访问,不能 随机访问,因此引导方式跟 NOR
Flash 也不同。在这些芯片上,需要配置专用的引导程序。 通常,这种引导程序起始的一段代码就把整个引导程序复制到 RAM
中运行,从而实现自举 启动,这跟从磁盘上启动有些相似。
U-Boot 工程简介
官方网址: ftp://ftp.denx.de/pub/u-boot
U-Boot 源码结构

U-Boot 的移植(以xn2410为例)
  • 对嵌入式系统进行硬件分析, 掌握平台的资源信息.如:flash 的类型,容量,地址;SDRAM 的容量,地址等
    • 当前确定内存为64M, NorFlash为2M, Nandflash为128M
    • 根据2410的cpu手册,
      第一章确定NandFlash的寄存器起始地址为0x4E000000, 
      由第五章确定SDRAM的基地址为0x30000000,即片选6接内存。 0x3000-0000  --  0x3400-0000  ---> 64MB
      0x00000000为SROM的基地址,即片选0接NorFlash .  0x0000-0000  --  0x0020-0000  --> 2MB
      0x08000000为CS8900网卡基址,即片选1接网卡
    在u-boot中添加目标平台
    • 在顶层的Makefile中添加:
      格式: 
      #ARCH    CPU    BOARD    VERDOR    SOC
      xn2410_config: unconfig
          @echo "#define CONFIG_s3c24x" >> include/config.h
          @echo "#define CONFIG_xn2410" >> include/config.h
          @$(MKCONFIG) $(@:_config=) arm arm920t xn2410 NULL s3c24x
          @sed-i "s,^TEXT_BASE= .*,TEXT_BASE = 0x33F00000,g" $(obj)board/xn2410/config.mk
          @echo "... configured for Cirrus Logic xn2410 board"
      说明,TEXT_BASE 是 U-boot 把自己拷贝到SDRAM的地址,意义是text段的起始地址,U-boot 前面有一段代码是作拷贝, 然后从SDRAM执行。而代码
      . = EXC_OFF_SYS_RESET
      .globl        _start
      中的EXC_OFF_SYS_RESET 的定义在include/mpc85xx.h中,表示的是系统启动时默认的指令地址的偏移量。
      . = EXC_OFF_SYS_RESET 表示把该指令存放的地址指定为EXC_OFF_SYS_RESET
      u-boot是从TEXT_BASE +  EXC_OFF_SYS_RESET 开始执行的,而这个地址就是硬件启动设置时确定的
    • make xn2410_config后的结果是
      include/asm --->  include/asm-arm
      include/asm/arch ---> include/asm-arm/arch-ep93xx
      生成config.h: config.h --->include/config.h
       #include
  • 添加平台相关的代码及配置文件
    • cpu/arm920t: 

      部分代码对处理器及硬件平台最小系统进行初始化工作, 包括使初始化processor工作模式初始化Timer,设置pll,
      关闭watchdog, disable interrupt, disable mmu and cache, 初始化memory
      controller,设置堆栈指针, uboot binary image reallocattion, 初始化BSS段
      start.S(u-boot.lds)
      lowlevel_init.S
      board.c
      这些工作相当于Boot Loader 的stage1, 完成这部分工作后就会跳转到stage2:


  • cpu\arm920t\s3c24x0  
    这部分代码主要是片上基本外设的驱动代码, 包括:uart, timer, PLL, i2c, usbhost等, 其中uart, timer, PLL 是最基本的外设. 在uboot中一般都会定义标准的设备驱动接口, 如
    Uart
    serial_init()
    serial_setbrg()
    serial_getc()
    serial_tstc()
    serial_putc()
    serial_puts()
    serial.c
    eth.c
    cpu.c
  • board\xn2410
    这部分代码主要完成两部分工作: 一部分为平台SDRAM的初始化代码; 另外一部分就是stage 2 阶段针对硬件平台进行初始化及驱动的代码.
    board_init() 
    xn2410.c
    dram_init()
    flash_init()
  • NIC驱动 net/eth.c
    U-boot中对于网卡的驱动也是有标准接口的. (不标准的使用宏定义)
    eth_init()
    eth_halt()
    eth_rx()
    eth_send()
  • Platform 配置文件 include\configs\xn2410.h 
    所有的配置文件位于include\configs目录下
    该文件中包含了所有与平台相关的配置信息:
    如:
    处理器类型;
    平台存储器物理起始地址,长度
    串口参数
    网卡参数
    环境变量参数
  • 传递给linux的tag  include\configs\xn2410.h 
    #define CONFIG_CMDLINE_TAG                    1    /* enable passing of ATAGs    */
    #define CONFIG_SETUP_MEMORY_TAGS     1
    #define CONFIG_INITRD_TAG                        1
  • u-boot linux内核映像:
    mkimage-A
    arm -O linux -T kernel     -C gzip  -a 0xc0080000 -e 0xc0080000 -n
    "linuxkernel" -d ${dir}/zImage.gz ${dir}/vmlinux.gz.img
    mkimage-A
    arm -O linux -T ramdisk  -C gzip  -a 0xc4000000 -e 0xc4000000 -n
    "linuxramdisk" -d ${dir}/ramdisk.gz ${dir}/ramdisk.gz.imgU-boot 的环境变量
    比较重要的环境变量如下:
    baudrate
    bootargs
    bootcmd
    bootdelay
    ethaddr
    ipaddr
    loadaddr
    mtdparts
    serverip
    gatewayip
    U-boot 的shell 命令
    常用命令:
    1) Information Commands:
    help / bdinfo
    2) Memory Commands
    cp / md/ mm
    3) Flash Memory Commands
    cp / erase / flinfo/ mtdparts
    4) Execution Control Commands
    bootm/ go
    5) Download Commands
    bootp/ dhcp/ tftpboot
    6) Environment Variables Commands
    printenv/ saveenv/ setenv
    7) Miscellaneous Commands
    reset
    U-Boot 的源码是通过 GCC 和 Makefile 组织编译的。顶层目录下的 Makefile 首先可以设 置开发板的定义,然后递归地调用各级子目录下的 Makefile,最后把编译过的程序链接成 U-Boot 映像。
    1.顶层目录下的 Makefile 它负责 U-Boot 整体配置编译。按照配置的顺序阅读其中关键的几行。 每一种开发板在 Makefile 都需要有板子配置的定义。
    例如 smdk2410 开发板的定义 如下。
    smdk2410_config : unconfig
           @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
    执行配置 U-Boot 的命令 make smdk2410_config, 通过./mkconfig 脚本生成 include/config. mk 的配置文件。文件内容正是根据 Makefile 对开发板的配置生成的。  即
    ARCH  = arm
    CPU   = arm920t
    BOARD = smdk2410
    SOC   = s3c24x0
  • 原创粉丝点击