首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

U-Boot 移植全解析:mini2440 開發板編譯配置、構建流程與鏈接腳本深度剖析

     編輯:關於C++

編譯前準備:環境變量與輸出目錄

為保持源碼目錄整潔,推薦使用外部構建目錄:

export BUILD_DIR=/tmp/build
make mini2440_config
make all
# 或一條命令:
make O=/tmp/build mini2440_config
make all

Makefile 會自動識別 O= 參數,將 OBJTREE 設為輸出目錄,SRCTREE 為源碼目錄。

階段一:make mini2440_config —— 配置生成

1. 主機架構檢測

HOSTARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/arm.*/arm/ ...)
HOSTOS   := $(shell uname -s | tr '[:upper:]' '[:lower:]')

自動識別編譯主機架構(如 x86 → i386)與操作系統(Linux → linux)。

2. 執行 mkconfig 腳本

./mkconfig mini2440 arm arm920t mini2440 samsung s3c24x0

參數含義:
Target=mini2440、Arch=arm、CPU=arm920t、Board=mini2440、Vendor=samsung、SoC=s3c24x0

3. mkconfig 核心動作

  • 創建頭文件鏈接:include/asm → asm-arm、include/asm-arm/arch → arch-s3c24x0、include/asm-arm/proc → proc-armv
  • 生成 include/config.mk:記錄 ARCH、CPU、BOARD、VENDOR、SOC
  • 生成 include/config.h:
    #define CONFIG_BOARDDIR board/samsung/mini2440
    #include
    #include

階段二:make all —— 完整構建流程

1. 依賴檢查

若無 include/config.mk 直接報錯 System not configured。

2. 自動生成 include/autoconf.mk

從 include/common.h(間接包含 config.h)提取所有 CONFIG_* 宏,經 sed 處理生成 Make 可用的變量定義。

3. 遞歸構建子目錄

核心依賴順序:

depend → SUBDIRS(tools/examples) → OBJS(cpu/arm920t/start.o) → 
LIBS(arch/libarm.a, cpu/libarm920t.a, board/libsamsung.a, common/libcommon.a...) →
LDSCRIPT(cpu/arm920t/u-boot.lds) → u-boot (ELF) → u-boot.bin / System.map

4. 關鍵構建步驟詳解

依賴生成

各子目錄執行 make _depend 生成 .depend 文件,記錄 .o 依賴的 .h 文件。

鏈接腳本 u-boot.lds

OUTPUT_FORMAT("elf32-littlearm")
ENTRY(_start)
SECTIONS {
    . = 0x00000000;
    .text : {
        cpu/arm920t/start.o (.text)  /* 必須最先,復位向量 */
        board/samsung/mini2440/lowlevel_init.o (.text)
        board/samsung/mini2440/nand_read.o (.text)
        *(.text)
    }
    .rodata : { *(.rodata*) }
    .data : { *(.data) }
    .u_boot_cmd : { *(.u_boot_cmd) }  /* 命令表段 */
    .bss (NOLOAD) : { *(.bss) }
}

TEXT_BASE = 0x33F80000(來自 board/samsung/mini2440/config.mk)決定最終鏈接地址。

鏈接命令 GEN_UBOOT

arm-linux-ld -Bstatic -T u-boot.lds -Ttext 0x33F80000 \
    --start-group libs --end-group -Map u-boot.map -o u-boot

提取命令表符號 __u_boot_cmd_start/end 通過 -u 強制鏈接。

生成 u-boot.bin

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

--gap-fill=0xff 用 0xFF 填充段間隙,符合 NOR Flash 擦除特性。

生成 System.map

arm-linux-nm u-boot | grep -v '...' | LC_ALL=C sort > System.map

供調試時地址↔符號查找使用。

總結:關鍵文件與目錄結構

文件/目錄作用
mkconfig配置腳本,生成鏈接、config.mk、config.h
include/config.mk架構/板級配置變量
include/config.hC 預處理宏配置
include/autoconf.mkMake 可用的 CONFIG_* 變量
board/samsung/mini2440/板級代碼:lowlevel_init, nand_read, config.mk(TEXT_BASE)
cpu/arm920t/CPU 相關:start.S, u-boot.lds, config.mk
lib_arm/ARM 通用庫
common/通用代碼:命令表、環境變量、控制台

避坑指南

  1. 首次編譯必須執行 make *_config,否則缺 config.mk 報錯。
  2. 交叉編譯器前綴 CROSS_COMPILE=arm-linux- 需在環境變量或 lib_arm/config.mk 設置。
  3. 修改 TEXT_BASE 需對應修改鏈接腳本與啟動代碼搬運邏輯。
  4. NAND 啟動需定義 CONFIG_NAND_U_BOOT,原版 U-Boot 對 s3c2440 支持有限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved