U-Boot 系统基础入门

第四章:源码结构分析

1. 目录结构分析

U-Boot 的源码采用模块化设计,各个功能模块分布在不同的目录中。以下是主要目录及其功能:

📁arch/ - 架构相关代码
📁arm/ - ARM架构代码
📁x86/ - x86架构代码
📁mips/ - MIPS架构代码
📁board/ - 开发板相关代码
📁common/ - 通用功能实现
📁drivers/ - 设备驱动
📁include/ - 头文件
📁lib/ - 库函数
📁net/ - 网络协议栈
📁scripts/ - 构建脚本
📁tools/ - 工具程序

1.1 arch/ 目录

包含与CPU架构相关的代码,每个支持的CPU架构都有一个子目录:

注意: 移植U-Boot到新平台时,通常需要修改或添加arch目录下的相关文件。

1.2 board/ 目录

包含与具体开发板相关的代码,按厂商组织:

1.3 common/ 目录

包含U-Boot的核心功能实现:

1.4 drivers/ 目录

包含各种设备驱动,按类型组织:

2. 关键文件分析

2.1 Kconfig 文件

Kconfig 文件定义了U-Boot的配置选项,用于生成配置菜单(menuconfig)。

# SPDX-License-Identifier: GPL-2.0+
#
# (C) Copyright 2000-2013
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.

mainmenu "U-Boot $UBOOTVERSION Configuration"

config SRCARCH
    string
    option env="SRRARCH"

source "arch/$SRCARCH/Kconfig"
        

主要特点:

2.2 Makefile 文件

Makefile 定义了U-Boot的构建规则,采用递归式构建。

# SPDX-License-Identifier: GPL-2.0+
#
# (C) Copyright 2000-2013
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.

VERSION = 2023
PATCHLEVEL = 01
SUBLEVEL =
EXTRAVERSION =
NAME =

MAKEFLAGS += -rR --no-print-directory

# 检查构建环境
include scripts/Kbuild.include
        

主要特点:

2.3 u-boot.lds 文件

链接脚本定义了U-Boot的内存布局和段组织。

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * (C) Copyright 2013
 * David Feng 
 */

#include 
#include 

OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;
    . = ALIGN(8);
    .text :
    {
        *(.__image_copy_start)
        *(.vectors)
        arch/arm/cpu/armv8/start.o (.text*)
        *(.text*)
    }
    ...
}
        

主要特点:

重要: 移植U-Boot到新平台时,通常需要修改链接脚本以匹配硬件内存布局。

3. 源码组织特点总结

特点 描述 优势
模块化 功能模块分离到不同目录 便于维护和扩展
层次化 架构-板级-驱动分层 提高代码复用率
配置驱动 Kconfig/Makefile系统 灵活定制功能
可移植性 抽象硬件相关部分 支持多种平台