解压u-boot-2010.03.tar.bz2就可以得到全部U-Boot源程序。在顶层目录下有29个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为3类。

● 与处理器体系结构或者开发板硬件直接相关。

● 一些通用的函数或者驱动程序。

● U-Boot的应用程序、工具或者文件。

表1.5列出了U-Boot顶层目录下各级目录的存放原则。

表1.5 U-Boot的源码顶层目录说明

目 录

特 性

解 释 说 明

board

平台依赖

存放电路板相关的目录文件,如RPXlite(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86) 等目录

cpu

平台依赖

存放了CPU相关的目录文件,如mpc8xx、ppc4xx、arm720t、arm920t、xscale、i386等目录

lib_ppc

平台依赖

存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数

lib_arm

平台依赖

存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数

lib_i386

平台依赖

存放对X86体系结构通用的文件,主要用于实现X86平台通用的函数

lib_avr32

平台依赖

存放对AVR32体系结构通用的文件,主要用于实现AVR32平台通用的函数

lib_blackfin

平台依赖

存放对BLACKFIN体系结构通用的文件,主要用于实现BLACKFIN平台通用的函数

lib_m68k

平台依赖

存放对M68K体系结构通用的文件,主要用于实现M68K 平台通用的函数

lib_microblaze

平台依赖

存放对Microblaze体系结构通用的文件,主要用于实现Microblaze平台通用的函数

lib_mips

平台依赖

存放对MIPS体系结构通用的文件,主要用于实现MIPS平台通用的函数

lib_nios

平台依赖

存放对NIOS体系结构通用的文件,主要用于实现NIOS平台通用的函数

lib_nios2

平台依赖

存放对NIOS体系结构通用的文件,主要用于实现NIOS2平台通用的函数

lib_sh

平台依赖

存放对SH体系结构通用的文件,主要用于实现SH平台通用的函数

lib_sparc

平台依赖

存放对SPARC体系结构通用的文件,主要用于实现SPARC平台通用的函数

libfdt

通用

支持设备树的库文件

api

通用

存放U-Boot提供的接口函数

common

通用

通用的代码,涵盖各个方面,以命令行处理为主

disk

通用

磁盘分区相关代码

nand_spl

通用

NAND存储器相关代码

include

通用

头文件和开发板配置文件,所有开发板的配置文件都在configs目录下

common

通用

通用的多功能函数实现

lib_generic

通用

通用库函数的实现

net

通用

存放网络相关程序

fs

通用

存放文件系统相关程序

post

通用

存放上电自检程序

drivers

通用

通用的设备驱动程序,主要有以太网接口的驱动

disk

通用

硬盘接口程序

examples

应用例程

一些独立运行的应用程序的例子,如helloworld

tools

工具

存放制作S-Record或者U-Boot格式的镜像等工具,如mkimage

doc

文档

开发使用文档

Rtc

通用

RTC的驱动程序

U-Boot的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板,配置编译过程只需其中部分程序。这里以S3C2410处理器为例,具体分析S3C2410处理器和开发板所依赖的程序,以及U-Boot的通用函数和工具。

U-Boot的源码是通过gcc和Makefile组织编译的。顶层目录下的Makefile可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,后把编译过的程序链接成U-Boot映像。

1)顶层目录下的Makefile

Makefile负责U-Boot整体配置编译,按照配置的顺序阅读其中关键的几行。

每一种开发板在Makefile下都需要有主板配置的定义。例如,smdk2410开发板的定义如下:

smdk2410_config:unconfig

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

执行配置U-Boot的命令make smdk2410_config,通过mkconfig脚本生成include/config.mk的配置文件,文件内容正是根据Makefile对开发板的配置生成的。

ARCH = arm

CPU = arm920t

BOARD = smdk2410

VENDOR = samsung

SoC = s3c24x0

上面的include/config.mk文件定义了ARCH、CPU、BOARD、VENDOR、SoC这些变量,这样,硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录如下:

board/Samsung/smdk2410

cpu/arm920t/

cpu/arm920t/s3c24x0/

lib_arm/

include/configs/smdk2410.h

再回到顶层目录的Makefile文件开始的部分,其中,下列几行包含了这些变量的定义:

# load ARCH, BOARD, and CPU configuration

include $(obj)include/config.mk

export ARCH CPU BOARD VENDOR SOC

Makefile的编译选项和规则在顶层目录的config.mk文件中定义,各种体系结构通用的规则直接在这个文件中定义。通过ARCH、CPU、BOARD、VENDOR、SoC等变量为不同硬件平台定义不同选项。不同体系结构的规则分别包含在ppc_config.mk、arm_config.mk、mips_config.mk等文件中。

顶层目录的Makefile中还要定义交叉编译器,以及编译U-Boot所依赖的目标文件

ifeq (arm,$(ARCH))

CROSS_COMPILE ?=arm-none-linux-gnueabi-

# 交叉编译器的前缀

endif

# load other configuration

include $(TOPDIR)/config.mk

# U-Boot objects....order is important (i.e. start must be first)

OBJS = cpu/$(CPU)/start.o # 处理器相关的目标文件

#定义依赖的目录,每个目录下先把目标文件连接成*.a文件

LIBS = lib_generic/libgeneric.a

LIBS += lib_generic/lzma/liblzma.a

LIBS += lib_generic/lzo/liblzo.a

LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ];

Then echo "board/$(VENDOR)/common/lib$(VENDOR).a"; fi)

LIBS += cpu/$(CPU)/lib$(CPU).a

ifdef SOC

LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a

endif

ifeq ($(CPU),ixp)

LIBS += cpu/ixp/npe/libnpe.a

endif

LIBS += lib_$(ARCH)/lib$(ARCH).a

还有U-Boot镜像编译的依赖关系如下:

ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

$(U_BOOT_ONENAND)

all: $(ALL)

$(obj)u-boot.hex: $(obj)u-boot

$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@

$(obj)u-boot.srec: $(obj)u-boot

$(OBJCOPY) -O srec $< $@

$(obj)u-boot.bin: $(obj)u-boot

$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

$(obj)u-boot.ldr: $(obj)u-boot

$(CREATE_LDR_ENV)

$(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)

$(obj)u-boot.ldr.hex: $(obj)u-boot.ldr

$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary

$(obj)u-boot.ldr.srec: $(obj)u-boot.ldr

$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary

$(obj)u-boot.img: $(obj)u-boot.bin

./tools/mkimage -A $(ARCH) -T firmware -C none \

-a $(TEXT_BASE) -e 0 \

-n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \

sed -e 's/"[ ]*$$/ for $(BOARD) board"/') \-d $< $@

$(obj)u-boot.imx: $(obj)u-boot.bin

$(obj)tools/mkimage -n $(IMX_CONFIG) -T imximage \

-e $(TEXT_BASE) -d $< $@

$(obj)u-boot.kwb: $(obj)u-boot.bin

$(obj)tools/mkimage -n $(KWD_CONFIG) -T kwbimage \

-a $(TEXT_BASE) -e $(TEXT_BASE) -d $< $@

$(obj)u-boot.sha1: $(obj)u-boot.bin

$(obj)tools/ubsha1 $(obj)u-boot.bin

$(obj)u-boot.dis: $(obj)u-boot

$(OBJDUMP) -d $< > $@

Makefile默认的编译目标为all,包括u-boot.srec、u-boot.bin和System.map。u-boot.srec和u-boot.bin就是通过ld命令按照U-Boot.map地址表把目标文件组装成U-Boot的。其他Makefile内容就不再详细分析了,通过上述代码分析应该可以为读者阅读代码提供一些线索。

2)开发板配置头文件

除了编译过程Makefile以外,还要在程序中为开发板定义配置选项或者参数。这个头文件是include/configs/.h。用相应的BOARD定义代替。

这个头文件中主要定义了两类形式的参数。

一类形式的参数用来选择处理器、设备接口、命令、属性等,以及定义总线频率、串口波特率、Flash地址等参数。

大部分参数前缀是CONFIG_,例如:

#define CONFIG_ARM920T 1

#define CONFIG_KGDB_BAUDRATE 115200

#define CONFIG_CS8900

#define CONFIG_KGDB_BAUDRATE 115200

另一类形式的参数为:

#define PHYS_FLASH_SIZE 0x00100000

#define USE_920T_MMU 1

根据对Makefile的分析,编译分为两步。第1步是配置,如make smdk2410_config;第2步是编译,执行make就可以了。

编译完成后,可以得到U-Boot各种格式的映像文件和符号表,如表1.6所示。

表1.6 U-Boot编译生成的映像文件

文 件 名 称

说 明

文 件 名 称

说 明

System.map

U-Boot映像的符号表

u-boot.bin

U-Boot映像原始的二进制格式

u-boot

U-Boot映像的ELF格式

u-boot.srec

U-Boot映像的S-Record格式

U-Boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中就可以了。U-Boot和u-boot.srec格式映像都自带定位信息。

热点链接:

在linux中配置编译u-boot方法,U-Boot编译过程解析相关推荐

  1. linux中配置 http_proxy 代理的方法

    目录 参数 配置文件 命令行 参数 设置 http_proxy 代理主要是内网与外网ip进行连接 ip是自身电脑的ip地址 端口号是代理的端口 配置文件 可以通过配置文件进行配置 etc/bashrc ...

  2. 在Linux中配置软 RAID,使用mdadm命令创建RAID5, RAID设备的数据恢复

    1.在Linux中配置软 RAID RAID(Redundant Array of Inexpensive Disks,独立磁盘完余阵列)用于将多个廉价的小型磁盘驱动器合并成一个磁盘阵列,以提高存储性 ...

  3. Linux分区如何表示,Linux中硬盘分区的表示方法

    满意答案 linux中硬盘分区的表示方法在linux中使用fdisk -l 命令可以查看磁盘的分区,显示的结果:/dev/sda1/dev/sda2/dev/sda3在这里sd表示挂载的是scsi硬盘 ...

  4. linux ipset 流量,linux中ipset命令的使用方法详解

    linux中ipset命令的使用方法详解 发布时间:2020-10-25 17:07:19 来源:脚本之家 阅读:97 作者:lijiaocn 栏目:服务器 ipset介绍 iptables是在lin ...

  5. linux oracle查询乱码问题,linux中oracle中文乱码解决方法

    乱码问题的根源是字符集的修改,下面我们来看一下linux中oracle中文乱码解决方法. 查看客户端的语言编码设置: 配置文件中的配置: cat ~/.bash_profile 注意修改配置信息:ex ...

  6. linux操作系统为SCSI硬盘分区,Linux中硬盘分区的表示方法

    Linux中硬盘分区的表示方法 在linux中使用fdisk -l 命令可以查看磁盘的分区,显示的结果: /dev/sda1 /dev/sda2 /dev/sda3 在这里sd表示挂载的是scsi硬盘 ...

  7. 虚拟机linux ftp慢,虚拟机Linux下配置FTP服务器的方法

    虚拟机Linux下配置FTP服务器的方法 1.确保虚拟机系统与宿主系统是桥接设置,以方便连接. 2.在虚拟机系统中安装ftp服务器,我安装的是vsftpd服务器.由于安装的虚拟机系统CentOS 中已 ...

  8. Linux中history历史命令使用方法详解

    在/etc/profile里添加如下:#History export HISTTIMEFORMAT="[%F %T]" HISTDIR=/home/common/.hist if ...

  9. cat查看tomcat日志 linux_linux怎么使用cat命令查看文件? linux中cat命令的使用方法

    Linux系统中查看文件内容时,可以使用cat命令来查看,但是cat命令一般只适合查看文件内容较少的文件.该怎么使用cat命令呢?下面我们就来看看详细的教程. 1.cat命令的语法格式为:cat [参 ...

  10. linux 中配置假域名来测试

    1.linux中配置假域名 找到hosts文件进行编辑 命令:vim /etc/hosts 配置: #centos (本机IP)192.168.1.179 www.imooc.com(假域名,自己设置 ...

最新文章

  1. 机器学习-逻辑回归-代价函数
  2. 解决跨域常见方案(is therefore not allowed access)
  3. 【转】android IDE——通过DDMS查看app运行时所占内存情况
  4. 微信分享时,描述内容怎么换行
  5. 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...
  6. sftp 安全文件传输
  7. ​让AI触类旁通93种语言:Facebook最新多语种句嵌入来了
  8. htpasswd用法
  9. Process Explorer 诊断和排错实例(下)
  10. 浏览器中的 HTTP 请求从发起到结束经历的所有阶段
  11. yml格式写法中容易遇到的坑
  12. 图形学笔记(四)——Harris 角点检测器延申
  13. Redis cluster Hget hash field value异常分析案例--一个空格带来的惨案
  14. 每日一个小技巧:今天告诉你拍照识别文字的软件有哪些
  15. MAC 安装PS 破解
  16. 英语语言学u c,英语语言学资料(一)
  17. ubuntu20 安装rtx3080 记录
  18. 夏季晒黑如何变白?店湾妹教你几招,皮肤回归白嫩
  19. Vue3:全局注册(参数:globalProperties,组件:component)
  20. 如何清理台式计算机内存,如何清理电脑运行内存_电脑运行内存不足怎么解决-win7之家...

热门文章

  1. POJ 1595 素数打表水题
  2. SQLServer 2008数据库查看死锁、堵塞的SQL语句
  3. Lync Server 2010 客户端访问提示验证服务器中的证书时遇到问题解决方法
  4. 奇怪的Adobe dynamic link
  5. 并行开发 5.同步机制(下)
  6. VScode加文件头的方式
  7. Kubernetes1.4即将发布
  8. 页面静态化3 --- 伪静态技术
  9. 2月份13个jQuery最佳插件推荐
  10. 排序算法--直接插入排序