mini2440系统移植篇之u-boot分析

1. Bootloader概念

系统上电后,需要一段程序来初始化重要的硬件,有些程序是固化在固件firmwware上的,如PC的BIOS。然后是Bootloader,如PC上的GRUB。对于嵌入式系统来说,一般只有Bootloader,它负责初始化内核运行的硬件环境,如内存,然后调用操作系统内核。一般最终产品它只需要启动内核就足够了,为了方便开发,还可以增强Bootloader功能,比如网络功能,通过网络下载文件,烧写文件到Flash中。

2. 嵌入式系统结构

嵌入式系统一般包含4部分。

1、引导加载程序,包括固化在固件的boot代码(可选)和Bootloader

2、Linux内核

3、文件系统,包括根文件系统和其他挂载的文件系统。从某方面说,Android也属于嵌入式,只是它的文件系统比较庞大,比QT漂亮而已。

4、用户应用程序,就是如计数器之类的应用。

3. U-Boot

U-Boot全称Universal Boot Loader,即通用Bootloader。确实,现在很多公司的bootloader都采用u-boot,基本上成为标准。u-boot可以看成是一个大型的裸机程序,它的优点是集成了很多好用的工具,命令,支持很多平台。

4. U-Boot配置

4.1. Makefile

u-boot要经过配置、编译、连接过程。先说配置,从readme文件可以知道,要使用开发板board/<board_name>,要先make <board_name>_config。比如我的2440开发板,make hyq2440_config。首先要修改makefile,增加编译选项

hyq2440_config:unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t hyq2440 samsung s3c24x0

unconfig是一些清理事情,不重要,根据makefile目标依赖命令的原理,分析一下@$(MKCONFIG) $(@:_config=) arm arm920t hyq2440 samsung s3c24x0

做了什么事情。makefile的前面定义了MKCONFIG := $(SRCTREE)/mkconfigSTRTREE就是当前目录,所以MKCONFIG就是源码根目录下的mkconfig$(@:_config=) 展开就是hyq2440_config。所以就变成

mkconfig hyq2440 arm arm920t hyq2440 samsung s3c24x0

$0   $1     $2   $3      $4       $5      $6

4.2. mkconfig

进入mkconfig看看干了什么事情。

4.2.1. 确定开发板名称BOARD_NAME

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"。定义了BOARD_NAME = hyq2440

4.2.2. 创建平台相关的头文件链接

ln -s ${SRCTREE}/include/asm-$2 asm。创建链接ln -s asm-arm asm

ln -s ${LNPREFIX}arch-$6 asm-$2/arch。创建链接ln -s arch-s3c24x0 asm-arm/arch

4.2.3. 创建顶层makefile包含的文件include/config.mk

echo "ARCH   = $2" >  config.mk

echo "CPU    = $3" >> config.mk

echo "BOARD  = $4" >> config.mk

config.mk配置文件内容为:

ARCH = arm

CPU = arm920t

BOARD = hyq2440

VENDOR = samsung

SOC = s3c24x0

4.2.4. 创建开发板相关头文件config.h

echo "#include <configs/$1.h>" >>config.h

echo "#include <asm/config.h>" >>config.h

> config.h 表示新建文件

/* Automatically generated - do not edit */

#include <configs/hyq2440.h>

#include <asm/config.h>

从配置中可以知道,如果在board新建一个开发板<board_name>,则在include/configs目录下要建一个<board_name>.h的头文件。

4.3. 配置文件<board_name.h>

1、这个文件主要用来定制u-boot的功能,比如:

/*----------------------------------体系配置----------------------------------*/

#define CONFIG_ARM920T 1 /* This is an ARM920T Core */

#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC  */

#define CONFIG_HYQ2440 1 /* in a HYQ2440 Board  */

 

/*---------------------------------内存配置--------------------------------------*/

#define CONFIG_NR_DRAM_BANKS  1    /* we have 1 bank of DRAM */

#define PHYS_SDRAM_1     0x30000000 /* SDRAM Bank #1 */

#define PHYS_SDRAM_1_SIZE     0x04000000 /* 64 MB */

 

/*--------------------------------Nor Flash驱动配置-----------------------------*/

#define PHYS_FLASH_1         0x00000000 /* Flash Bank #1 */

#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1

#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */

#define CONFIG_AMD_LV160B         1

#define PHYS_FLASH_SIZE         0x00200000 /* 2MB */

#define CONFIG_SYS_MAX_FLASH_SECT (35) /* max number of sectors on one chip */

#define CONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Erase */

#define CONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Write */

需要哪些代码有效,就开启响应的宏。

5. U-Boot编译链接

先编译u-boot,从编译的log反过来看u-boot编译链接过程。

cd /home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot 

&& 

arm-linux-ld -Bstatic -T u-boot.lds  -Ttext 0x33f80000 

$UNDEF_SYM cpu/arm920t/start.o 

--start-group 

lib_generic/libgeneric.a 

lib_generic/lzma/liblzma.a 

lib_generic/lzo/liblzo.a 

cpu/arm920t/libarm920t.a 

cpu/arm920t/s3c24x0/libs3c24x0.a 

lib_arm/libarm.a fs/cramfs/libcramfs.a 

fs/fat/libfat.a fs/fdos/libfdos.a 

fs/jffs2/libjffs2.a 

fs/reiserfs/libreiserfs.a 

fs/ext2/libext2fs.a 

fs/yaffs2/libyaffs2.a 

fs/ubifs/libubifs.a 

net/libnet.a 

disk/libdisk.a 

drivers/bios_emulator/libatibiosemu.a 

drivers/block/libblock.a 

drivers/dma/libdma.a 

drivers/fpga/libfpga.a 

drivers/gpio/libgpio.a 

drivers/hwmon/libhwmon.a 

drivers/i2c/libi2c.a 

drivers/input/libinput.a 

drivers/misc/libmisc.a 

drivers/mmc/libmmc.a drivers/mtd/libmtd.a 

drivers/mtd/nand/libnand.a 

drivers/mtd/onenand/libonenand.a 

drivers/mtd/ubi/libubi.a 

drivers/mtd/spi/libspi_flash.a 

drivers/net/libnet.a 

drivers/net/phy/libphy.a 

drivers/net/sk98lin/libsk98lin.a 

drivers/pci/libpci.a 

drivers/pcmcia/libpcmcia.a 

drivers/power/libpower.a 

drivers/spi/libspi.a 

drivers/rtc/librtc.a 

drivers/serial/libserial.a 

drivers/twserial/libtws.a 

drivers/usb/gadget/libusb_gadget.a 

drivers/usb/host/libusb_host.a 

drivers/usb/musb/libusb_musb.a 

drivers/usb/slave/libusb_slave.a 

drivers/video/libvideo.a 

drivers/watchdog/libwatchdog.a 

common/libcommon.a 

libfdt/libfdt.a 

api/libapi.a 

post/libpost.a 

board/samsung/hyq2440/libhyq2440.a 

 

--end-group /home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot/lib_arm/eabi_compat.o 

-L /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t 

-lgcc -Map u-boot.map -o u-boot

arm-linux-objcopy -O srec u-boot u-boot.srec

arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin

从编译log看出,使用链接脚本u-boot.lds来编译,最后生成的起始地址是0x33f80000,把各个平台和驱动下面的libxxx.a链接进来,最后生成u-boot.bin二进制文件。链接脚本对应的是cpu体系下各自的u-boot.lds

5.1. 链接脚本

SECTIONS

{

. = 0x00000000;

 

. = ALIGN(4);

.text :

{

cpu/arm920t/start.o (.text)

board/samsung/hyq2440/lowlevel_init.o (.text)

board/samsung/hyq2440/nand_read.o (.text)

*(.text)

}

 

. = ALIGN(4);

.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

 

. = ALIGN(4);

.data : { *(.data) }

 

. = ALIGN(4);

.got : { *(.got) }

 

. = .;

__u_boot_cmd_start = .;

.u_boot_cmd : { *(.u_boot_cmd) }

__u_boot_cmd_end = .;

 

. = ALIGN(4);

__bss_start = .;

.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }

_end = .;

}

链接脚本指定镜像中代码段text,只读数据段rodata,全局初始化数据区datau-boot命令和全局未初始化数据区bss的排列位置。并且知道,第一段代码是cpu/arm920t/start.o,对应目录下的汇编文件start.S

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值