日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

u-boot分析之makefile分析(二)

發布時間:2025/4/5 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 u-boot分析之makefile分析(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

u-boot(二)makefile

  • 引入
  • 目錄結構(1.1.6)
  • 配置文件
  • 目標
  • 配置具體的單板
  • 編譯階段
  • 過程
  • 鏈接入口
  • 配置鏈接地址
  • 附錄
  • 附錄A:mkconfig解析
  • 附錄B 鏈接腳本

u-boot(二)makefile

引入

如果要分析uboot結構以及如何鏈接的話,最好的方法就是去分析它的makefile。我們是怎么編譯的?先執行配置make 100ask24x0_config,然后編譯make.所以在頂層目錄下的Makefile一定存在這個100ask24x0_config.我們就從這里入手

目錄結構(1.1.6)

  • 總體來說,命令是存放在common中,比如common中的cmd_nand.會調用驅動層的driver中的nand/nandbase.c,再去調用平臺級別cpu,以及單板的(IO等)board.分為四層結構如下:
  • 在硬件層次,從上往下分別是 架構相關> CPU相關> 單板相關
  • 具體的說明在頂層的README中有講
--------------------------------------------------lib_generic common --------------------------------------------------post net fs disk --------------------------------------------------dtt nand_spl rtc drivers --------------------------------------------------board cpu lib_xxx 目錄說明
lib_generic通用的庫文件(crc)等
common通用程序,命令在這里
include頭文件和配置文件
?asm-arm
?config
↑↑↑↑↑↑↑↑↑↑↑-------用戶接口-------
disk硬盤接口
net網絡驅動
fs文件系統
↑↑↑↑↑↑↑↑↑↑↑-------中間層-------
dtt溫度等其他傳感器驅動
rtc時鐘
nand_splnand啟動相關
drivers驅動程序
↑↑↑↑↑↑↑↑↑↑↑--------驅動層--------
cpu針對具體cpu
Lib_xxx架構通用的文件
board開發板相關的,Io等相關
↑↑↑↑↑↑↑↑↑↑↑------CPU相關,單板相關-------
doc文檔
example測試程序
tools制作u-boot格式映象工具等

頂層的mkconfig 配置了交叉編譯工具的版本,鏈接參數等

配置文件

100ask24x0_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0

執行make 100ask24x0_config 就相當于執行?mkconfig 100ask24x0? arm? arm920t? 100ask24x0? NULL? s3c24x0,

?上述命令以及參數分別對應?? ? ? ? ? ? ? ? ? ? ? ? ? $0? ? ? ? ? ? ? ? $1? ? ? ? ? ? $2? ? ? ? $3? ? ? ? ? ? ?$4? ? ? ? ? ? ? ?$5? ? ? ? ??$6

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # Parameters: ?Target ?Architecture ?CPU ?Board [VENDOR] [SOC]

其中頂層mkconfig是一個shell腳本文件, 它會根據上面參數配置交叉編譯工具的版本,鏈接參數等等。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

################################################################################### # # # 首先是進行單板的配置 # # make 100ask24x0_config # # # ################################################################################### 100ask24x0_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0################################################################################## #unconfig 執行的操作如下,可以先不去管它 unconfig:@rm -f $(obj)include/config.h $(obj)include/config.mk \$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp################################################################################## #當前目錄 SRCTREE := $(CURDIR) # 當前目錄下的mkconfig文件 MKCONFIG := $(SRCTREE)/mkconfig export MKCONFIG ################################################################################## # $@表示目標,在$()中的@也表示目標,接下去的是字符串替換,也就是將目標中的_config 替換為空 # 開頭@ 表示不回顯 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0 #也就是相當于 mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 # 也就是調用外部shell腳本了

目標

  • ①配置單板的名字?100ask24x0
  • ②建立符號鏈接
include/asminclude/asm-arm
include/asm-arm/archinclude/asm-arm/arch-s3c24x0
include/asm-arm/procinclude/asm-arm/proc-armv
  • ③建立include/config.mk,包含cpu,soc等信息
ARCH = arm CPU = arm920t BOARD = 100ask24x0 SOC = s3c24x0
  • ④新建include/config.h,開發板相關頭文件,這個文件用來配置裁剪uboot,所以如果要在board目錄下新建一個開發板的目錄,需要在include/configs下建立$1.h頭文件,此處$1 =?100ask24x0,所以包含configs/100ask24x0.h
/* Automatically generated - do not edit */ #include <configs/100ask24x0.h>

配置具體的單板

uboot還沒有類似linux一樣的可視化配置界面(比如使用 make menuconfig來配置),要手動修改配置文件,從上述第4步驟我們可以發現,單板的具體配置是在include/configs/<board_name>.h中配置的,有以下兩類配置,由兩類宏進行配置:

  • 選項配置(Options),前綴為"CONFIG_",用于選擇CPU 、SOC、開發板類型,配置系統時鐘,選擇設備驅動等,還有功能開關,可以理解為1級開關
  • 參數配置(Setting),?前綴為"CFG_",用于設置malloc緩沖池大小,u-boot命令選項,下載文件的默認加載地址,FLASH起始地址等。
  • 可以這樣認為,"CONFIG_"除了設置一些參數外,主要用來設置Uboot的功能、選擇使用文件中的哪一部分;而"CFG_"用來設置更細節的參數。

    編譯階段

    過程

    重新來看根目錄的makefile

    • 包含配置階段設置的參數
    include $(OBJTREE)/include/config.mk export ARCH CPU BOARD VENDOR SOC#ARCH = arm #CPU = arm920t #BOARD = 100ask24x0 #SOC = s3c24x0
    • 配置交叉工具鏈
    ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- endif
    • 包含啟動文件,這里也就是cpu/arm920t/start.o
    OBJS = cpu/$(CPU)/start.o
    • 包含庫文件BOARDDIR=100ask24x0,BOARD=100ask24x0,CPU=arm920t
    IBS = lib_generic/libgeneric.a LIBS += board/$(BOARDDIR)/lib$(BOARD).a LIBS += cpu/$(CPU)/lib$(CPU).a ifdef SOC LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a endif LIBS += lib_$(ARCH)/lib$(ARCH).a LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a LIBS += net/libnet.a LIBS += disk/libdisk.a LIBS += rtc/librtc.a LIBS += dtt/libdtt.a LIBS += drivers/libdrivers.a LIBS += drivers/nand/libnand.a LIBS += drivers/nand_legacy/libnand_legacy.a LIBS += drivers/usb/libusb.a LIBS += drivers/sk98lin/libsk98lin.a LIBS += common/libcommon.a LIBS += $(BOARDLIBS)LIBS := $(addprefix $(obj),$(LIBS)) .PHONY : $(LIBS)
    • 目標all
    ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)all: $(ALL)$(obj)u-boot.bin: $(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \-Map u-boot.map -o u-boot

    鏈接入口

    UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.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 net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\cd /home/book/Desktop/u-boot/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/book/Desktop/u-boot/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \--start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.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 net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group -L /opt/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5 -lgcc \-Map u-boot.map -o u-boot arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
    • 查看下最后的鏈接,可以看到鏈接腳本是board/100ask24x0/u-boot.lds,代碼段的基地址0x33F80000,也就是說,鏈接腳本里面的地址會加上這個數字.
    arm-linux-ld -Bstatic -T /home/book/Desktop/u-boot/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \..................

    也就是說該u-boot應該在0x33F80000這個位置運行

    配置鏈接地址

    • 搜索下0x33F80000,在board/100ask24x0/config.mk中有定義TEXT_BASE = 0x33F80000
    • 鏈接參數由makefile中可以看出來$(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS)是在LDFLAGS中定義,我們可以用debug.mk調試,可以使用d-再一層解析具體的,但是這里已經能夠看到$(TEXT_BASE)定義了這個地址了
    make -f Makefile -f debug.mk d-LDFLAGSLDFLAGS=-Bstatic -T /home/book/Desktop/u-boot/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 origin = filevalue = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)flavor = recursive
    • 也可以搜索下grep "LDFLAGS" * -nR,可以發現在頂層的config.mk看到定義
    LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
    • 如何知道uboot的整體執行流程,將start.S從頭分析到尾就可以大概知道。根據makefile分析所得cpu/arm920t/start.S是uboot的第1個執行文件,從這個文件一路分析下去就可以把uboot貫通起來。

    附錄

    附錄A:mkconfig解析

    ################################################################################### # # # 首先是進行單板的配置 # # make 100ask24x0_config # # # ################################################################################### 100ask24x0_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0################################################################################## #unconfig 執行的操作如下,可以先不去管它 unconfig:@rm -f $(obj)include/config.h $(obj)include/config.mk \$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp################################################################################## #當前目錄 SRCTREE := $(CURDIR) # 當前目錄下的mkconfig文件 MKCONFIG := $(SRCTREE)/mkconfig export MKCONFIG ################################################################################## # $@表示目標,在$()中的@也表示目標,接下去的是字符串替換,也就是將目標中的_config 替換為空 # 開頭@ 表示不回顯 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0 #也就是相當于 mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 # 也就是調用外部shell腳本了################################################################################### # # # mkconfig的文件注釋,shell腳本調用 # # mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 # # [$0] [$1] [$2] [$3] [$4] [$5] [$6] # ################################################################################### #!/bin/sh -e# Script to create header files and links to configure # U-Boot for a specific board. # # Parameters: Target Architecture CPU Board [VENDOR] [SOC] # # (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de> #APPEND=no # Default: Create new config file BOARD_NAME="" # Name to print in make output# 不包含這些打頭的參數,忽略這段代碼 # $# 參數個數,-gt 大于 while [ $# -gt 0 ] ; docase "$1" in--) shift ; break ;;-a) shift ; APPEND=yes ;;-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;*) break ;;esac done# 利用了||的特性,如果未定義BOARD_NAME,BOARD_NAME=參數1=100ask24x0 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"# 參數個數合法性判斷,必須是5個 [ $# -lt 4 ] && exit 1 [ $# -gt 6 ] && exit 1# 打印顯示 echo "Configuring for ${BOARD_NAME} board..."# # Create link to architecture specific headers ## 這里SRCTREE=OBJTREE=$(CURDIR),我們可以去頂層的makefile中看到 # 也可以使用debug打印變量 make -f Makefile -f debug.mk OBJTREE # OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) # SRCTREE := $(CURDIR) # 也就是說 執行else 分支 # 建立asm的符號連接 if [ "$SRCTREE" != "$OBJTREE" ] ; thenmkdir -p ${OBJTREE}/includemkdir -p ${OBJTREE}/include2cd ${OBJTREE}/include2rm -f asmln -s ${SRCTREE}/include/asm-$2 asmLNPREFIX="../../include2/asm/"cd ../includerm -rf asm-$2rm -f asmmkdir asm-$2ln -s asm-$2 asm else# 刪除原有的asm鏈接,建立新的鏈接 ln -s asm-arm asmcd ./includerm -f asmln -s asm-$2 asm firm -f asm-$2/arch# -z string 測試指定字符是否為空,空著真,非空為假 # -o: or # $6=s3c24x0,執行else # ln -s arch-s3c24x0 asm-arm/arch # asm-arch指向了arch-s3c24x0if [ -z "$6" -o "$6" = "NULL" ] ; thenln -s ${LNPREFIX}arch-$3 asm-$2/arch elseln -s ${LNPREFIX}arch-$6 asm-$2/arch fi# if滿足,刪除 asm-arm/proc # 重新建立新的鏈接 proc-armc 到asm-arm/proc if [ "$2" = "arm" ] ; thenrm -f asm-$2/procln -s ${LNPREFIX}proc-armv asm-$2/proc fi# # Create include file for Make # # ARCH = arm # CPU = arm920t # BOARD = 100ask24x0 # SOC = s3c24x0 echo "ARCH = $2" > config.mk echo "CPU = $3" >> config.mk echo "BOARD = $4" >> config.mk[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk# # Create board specific header file # # /* Automatically generated - do not edit */ # #include <configs/100ask24x0.h>if [ "$APPEND" = "yes" ] # Append to existing config file thenecho >> config.h else> config.h # Create new config file fi echo "/* Automatically generated - do not edit */" >>config.h echo "#include <configs/$1.h>" >>config.hexit 0

    附錄B 鏈接腳本

    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS {. = 0x00000000; //這個地址會加上 -Ttext 0x33F80000 這個地址. = ALIGN(4);.text :{//代碼段的第一個文件是這個cpu/arm920t/start.o (.text)board/100ask24x0/boot_init.o (.text)//其他所有代碼段 *(.text)}. = ALIGN(4);.rodata : { *(.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 : { *(.bss) }_end = .; }

    轉載:https://www.cnblogs.com/zongzi10010/p/10023667.html

    總結

    以上是生活随笔為你收集整理的u-boot分析之makefile分析(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。