1. 程式人生 > >uboot的配置和編譯檔案解析

uboot的配置和編譯檔案解析

Makefile分析

版本確定

在檔案開頭的幾行就是版本號:

VERSION = 1 // 主版本號
PATCHLEVEL = 3  // Patch版本號
SUBLEVEL = 4    // 次版本號
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

版本號最終生成一個U_BOOT_VERSION的變數,用於確定最終的版本號,VERSION_FILE這個檔案在編譯過程中自動生成,內容是一個值為版本號的巨集定義。

HOST配置

緊接著是HOST的配置:

HOSTARCH := $(shell uname -m | \   
    sed -e s/i.86/i386/ \
        -e s/sun4u/sparc64/ \
        -e s/arm.*/arm/ \
        -e s/sa110/arm/ \
        -e s/powerpc/ppc/ \
        -e s/ppc64/ppc/ \
        -e s/macppc/ppc/)
# 在shell中執行命令“uname -m”,並用管道連線sed命令,“sed -e s/p1/p2” 命令是把p1替換成p2,其中“.”和“*”是萬用字元,分別匹配一個和多個字元
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \ sed -e 's/\(cygwin\).*/cygwin/') # 獲取作業系統的名稱,轉成小寫 export HOSTARCH HOSTOS

HOSTARCH 表示主機CPU的架構,HOSTOS 表示主機的作業系統。

靜默編譯

平時編譯的時候命令列會打印出編譯日誌資訊,配置引數在下面的程式碼中:

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))   
XECHO = echo
else
XECHO = : endif # 在MAKEFLAGS中尋找-s,如果有,定義列印語句,如果沒有,列印指令為空

編譯方法

uboot有兩種編譯方式,原地編譯和單獨輸出資料夾編譯,預設是原地編譯,編譯出來的結果放在原始檔相同的目錄中。單獨輸出資料夾在編譯時另外指定一個目錄,編譯生成檔案都放置在該目錄中。有兩種方式指定輸出目錄:

#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
#
# 1) Add O= to the make command line    在編譯命令中增加一個名為O的引數,指向要輸出的目錄
# 'make O=/tmp/build all'
#
# 2) Set environement variable BUILD_DIR to point to the desired location   設定環境變數BUILD_DIR為要輸出的目錄路徑
# 'export BUILD_DIR=/tmp/build'     
# 'make'
#
# The second approach can also be used with a MAKEALL script
# 'export BUILD_DIR=/tmp/build'
# './MAKEALL'
#
# Command line 'O=' setting overrides BUILD_DIR environent variable.        兩個都指定的話O會覆蓋BUILD_DIR
#
# When none of the above methods is used the local build is performed and
# the object files are placed in the source directory.
#

以後的程式碼就是針對於兩種編譯方式的變數定義以及實現,其中有幾個環境變數需要明白:

  1. OBJTREE:編譯出的目標檔案存放的根目錄,不同的編譯方式中,該目錄的位置不一樣。
  2. SRCTREE:原始碼的根目錄。

配置編譯環境

實現程式碼中,include $(obj)include/config.mk這句程式碼用於包含架構,CPU以及開發板的配置資訊,config.mk檔案在配置後才會生成,隨後會將其中的配置資訊匯出到環境變數中:export ARCH CPU BOARD VENDOR SOC

  1. ARCH:編譯目標CPU的架構。
  2. CROSS_COMPILE:定義交叉編譯工具鏈的字首,在編譯時加上字尾就可以找到工具鏈中的命令。

引入配置指令碼

如下的程式碼:

# load other configuration
include $(TOPDIR)/config.mk

引入了根目錄中的config.mk檔案。

編譯工具的定義

# Include the make variables (CC, etc...)
#
AS  = $(CROSS_COMPILE)as
LD  = $(CROSS_COMPILE)ld
CC  = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR  = $(CROSS_COMPILE)ar
NM  = $(CROSS_COMPILE)nm
LDR = $(CROSS_COMPILE)ldr
STRIP   = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB  = $(CROSS_COMPILE)RANLIB

這些程式碼定義了編譯的工具的位置。

包含開發板的配置引數

# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk

ifdef   ARCH
sinclude $(TOPDIR)/$(ARCH)_config.mk  # include architecture dependend rules
endif
ifdef   CPU
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk   # include  CPU  specific rules
endif
ifdef   SOC
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk   # include  SoC  specific rules
endif
ifdef   VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
endif
ifdef   BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk  # include board specific rules
endif

這些語句用於包含開發板,CPU,架構等配置引數,其中autoconfig.mk也是在配置過程中生成的,用於指導uboot的編譯過程,其中的配置會根據條件編譯來影響uboot的編譯走向。這些配置是根據根目錄中“include/configs/xxx.h”中的檔案定義出來的,對應X210開發板的標頭檔案位於:include/configs/x210_sd.h,移植的很大一部分工作也在這個檔案中完成。

連結指令碼

如下程式碼中定義了連結指令碼:

ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
endif

根據autoconfig中有沒有CONFIG_NAND_U_BOOT來選擇不同的lds連結指令碼檔案,該連結指令碼在uboot編譯的時候連結屬性。

TEXT_BASE

ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif

判斷如果config.mk定義了TEXT_BASE巨集,則加上指定的編譯屬性。TEXT_BASE是一個記憶體地址,是整個uboot連結時指定的連結地址,在X210中該地址是0xc3e00000,因為uboot中啟用了虛擬地址對映,所以0xc3e00000相當於0x23e00000。

自動推導規則

ifndef REMOTE_BUILD

%.s:    %.S
    $(CPP) $(AFLAGS) -o [email protected] $<
%.o:    %.S
    $(CC) $(AFLAGS) -c -o [email protected] $<
%.o:    %.c
    $(CC) $(CFLAGS) -c -o [email protected] $<

else

$(obj)%.s: %.S
    $(CPP) $(AFLAGS) -o [email protected] $<
$(obj)%.o: %.S
    $(CC) $(AFLAGS) -c -o [email protected] $<
$(obj)%.o: %.c
    $(CC) $(CFLAGS) -c -o [email protected] $<
endif

剩餘部分

從此處一直到257行,主要是用於編譯uboot中所有的目標檔案,在291行出現了目標all,直接make的話就是在make這個目標。目標中有一些目標很重要,例如u-boot是最終編譯生成的可執行elf檔案,使用obj-cpy將該檔案轉化為可燒錄檔案u-boot.bin.

unconfig表示未配置,用於作為各個開發板配置目標的依賴,當已經配置過開發板後再次配置時,還可以配置。

uboot配置過程

uboot在配置過程中主要執行的是MakeFile中的如下程式碼:

x210_sd_config :    unconfig
    @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
    @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

這兩條命令,最終會在指定的目錄位置中建立一個config.mk檔案,該檔案中內容為“TEXT_BASE = 0xc3e00000”。

$(@:_config=)代表替換,$(@代表目標,要把目標中的_config這一部分替換為=號後面的內容,但是後面的內容為空,所以就得到了x210_sd,就是第一個引數,所以第一句中第一個引數是x210_sd,所以就把這幾個引數傳給了mkconfig指令碼。

配置開發板名稱

APPEND=no   # Default: Create new config file
BOARD_NAME=""   # Name to print in make output

while [ $# -gt 0 ] ; do
    case "$1" in
    --) shift ; break ;;
    -a) shift ; APPEND=yes ;;
    -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
    *)  break ;;
    esac
done

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

配置BOARD_NAME為$1,也就是x210_sd。

判斷引數個數

[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1

如果引數個數不符合就返回,退出配置過程。

建立符號連結

33-118行是為各個不同的架構建立符號連結,使用者給標頭檔案包含提供指向性連線,使uboot具有可移植性。

建立Make標頭檔案

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

檔案位於include/config.mk,是為了讓主Makefile包含進去。

建立config.h

if [ "$APPEND" = "yes" ]   # Append to existing config file
then
    echo >> config.h
else
    > config.h      # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h

檔案內容是包含configs中配置開發板名稱的標頭檔案。是對開發板的巨集定義配置。

uboot連結指令碼

uboot的連結指令碼和裸機程式的連結指令碼本質上並沒有區別。uboot中的連結指令碼是uboot.lds,位於board/samsung/x210目錄中。

ENTRY(_start)

該程式碼用於指定_start為整個程式的入口地址,就是程式的開頭地址,或者是第一句指令。

SECTIONS
{
    . = 0x00000000;

    . = ALIGN(4);
    .text      :
    {
      cpu/s5pc11x/start.o   (.text)
      cpu/s5pc11x/s5pc110/cpu_init.o    (.text)
      board/samsung/x210/lowlevel_init.o    (.text)
          cpu/s5pc11x/onenand_cp.o      (.text)                 
          cpu/s5pc11x/nand_cp.o (.text)                     
          cpu/s5pc11x/movi.o (.text) 
          common/secure_boot.o (.text) 
      common/ace_sha1.o (.text)
      cpu/s5pc11x/pmic.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);
    .mmudata : { *(.mmudata) }

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

指定程式碼段,資料段和bss段。

. = 0x00000000;表示指定該地址為連結地址,其實指定一個程式的連結地址有兩種方法,一種是在MakeFile中ld的flag中使用-Ttext 0x00000020的方式指定連結地址,另外一種是連結一個連結指令碼,在連結指令碼的開頭使用. = 0x00000020方式來指定,這兩種方式是可以配合使用的,如果兩種方式同時使用,以-Ttext指定的為準。

在uboot中我們使用TEXT_BASE值來指定,相當於使用了-Ttext = TEXT_BASE。

. = ALIGN(4);表示使用4位元組的對齊方式。

.text是程式碼段。程式碼段中必須要注意檔案排列的順序,會影響最終生成的可執行程式的排列順序,指出名稱的依次排列,最後使用 *(.text)表示剩餘的部分不指定順序,指定放在前面的檔案,就是必須要放在前16KB內的檔案,這些檔案中的函式在前16KB會被呼叫,後面的檔案中函式順序就無所謂了。

.got,.u_boot_cmd,.mmudata屬於自定義段。

相關推薦

uboot配置編譯檔案解析

Makefile分析 版本確定 在檔案開頭的幾行就是版本號: VERSION = 1 // 主版本號 PATCHLEVEL = 3 // Patch版本號 SUBLEVEL = 4 // 次版本號 EXTRAVERSION = U_BOOT

五.linux開發之uboot移植(五)——uboot配置編譯過程詳解

一.uboot主Makefile分析1 1、uboot version確定(Makefile的24-29行) Makefile程式碼部分 (1)uboo

新版uboot配置編譯

size www target ref tle 移植 targe font mil 轉載文章來至於: http://www.linuxidc.com/Linux/2015-02/112934.htm新版uboot配置、編譯

php擴展開發筆記(2)多個源代碼文件的配置編譯

nes repr 過程 http fadein ews add ng- star 我們在開發過程中,為了代碼得可讀性和易維護性,肯定是須要多個代碼文件的,而不不過通過 ext_skel 生成得骨架文件。這篇文章主要介紹下。多個代碼文件的時候。我們須要註意

TensorFlow-GPU環境配置之四——配置編譯TensorFlow

http mage body class 調用 技術 圖片 環境 進行 首先,使用configure進行配置 配置完成後,使用bazel編譯retrain命令,編譯命令中加入--config=cuda即為啟用GPU 編譯進行中。。。 編譯完成 編譯完成後,調用ret

openwrt針對RT5350代碼下載,配置編譯

check rip 文件中 自己 squashfs utils sdn 斷網 包括 轉載地址:http://blog.csdn.net/dean_gdp/arti

jfinalQ開發教程04-jfinal配置jfinalQ檔案結構

jfinalQ 1.前言 有耐心看完前5講的同學,可正真看到jfinalQ到底是什麼了, 前4講說了程式碼生成工具,即:jfinalQ-gencode, 第5講說了加密部署工具,即,jfinalQ-encrypt, 如果對這兩部分感興趣,那麼接下來的內容會更加有趣哦~

Linux3.4核心的基本配置編譯

瞭解Linux3.4核心的特性及新增功能,掌握Linux核心的編譯過程及Linux核心配置選項的內容。 【實驗環境】         ●主機:Ubuntu 10.10 (64bit);   &

nuxus 3在Maven專案的配置POM檔案配置

在nuxus 3中的Maven預設會建立三個倉庫,這三個倉庫的關係如下: public是release和snapshot的全集,release預設為關閉狀態,所以在配置nexus 3時需要將其開啟。 下面是具體的配置過程,參考如下: 1、對專案獨立設定: 開啟專

uboot 2018-9 目錄檔案解析

/ arch  體系結構特定檔案   / arc  ARC架構   / arm   通用檔案ARM體系結構通用檔案   / m68k           檔案通用於m

《15.核心的配置編譯原理》

《15.核心的配置和編譯原理》 第一部分、章節目錄 2.15.1.linux核心原始碼目錄結構1 2.15.2.linux核心原始碼目錄結構2 2.15.3.核心配置和編譯體驗 2.15.4.核心的配置原理1 2.15.5.menuconfig的使用和演示 2.15.6.menuconf

uboot 2018-9 目錄檔案解析

/ arch  體系結構特定檔案   / arc  ARC架構   / arm   通用檔案ARM體系結構通用檔案   / m68k           檔案通用於m68k體系結構   / microblaze  檔案泛型為microblaze體系結構   / mips 

轉 JVM位元組碼命令 反編譯檔案解析

位元組碼 助記符 指令含義 0x00 nop 什麼都不做。 0x01 aconst_null 將 null 推送至棧頂。 0x02 iconst_m1 將 int 型-1 推送至棧頂。 0x03 iconst_0 將 int 型 0 推送至棧頂。 0x04 i

64位配置編譯

第四講 建立64位的配置 編譯器 首先,你要確定你所使用的Visual Studio的版本允許你編譯程式為64位程式碼。如果你想使用最新的版本(寫本課本時)Visual Studio 2008 來開發64位應用,以下的表格幫助你理解你所需要的Visual Studio 版本。            

Android Studio 之 Gradle 安裝配置編譯

目錄 前言 由於生產力很大一部分取決於生產工具的使用,為了緊跟時代的潮流,我也從Eclipse切換到Android Studio來進行Android開發。 使用Android Studio的時候,最先遇到的難點應該就是Gradle的安裝、配置

Linux核心配置編譯過程詳解

一、引言:  本文件的內容大部份內容都是從網上收集而來,然後配合一些新的截 圖(核心版本:V2.4.19)。在每一配置項後會有一個選擇指南的部份,用來指導大家怎麼樣 根據自己的情況來做相應的選擇;還有在每一個大項和文件的最後會有一個經驗談,它是一些高手們在應對問題和處理特有

嵌入式 Linux開發Kernel移植(二)——kernel核心配置編譯

嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯    本文選擇linux 2.6.35.7版本kernel進行實踐。一、linux kernel原始碼目錄分析Kbuild,K

如何把核心、uboot檔案系統下載到開發板中

1、首先準備好所需要的檔案:u-boot、uImage、rootfs.img。 2、下載u-boot: tftp   0x40000000   u-boot.bin nand   erase  0    0x60000 nand    write   ox40000000

TensorFlow使用PyCharm編輯器進行配置編譯在Windows下

遵循:BY-SA 作者:譚東 時間:2017年5月29日 環境:Windows 7 TensorFlow支援很多編輯器,你可以隨便選擇,如Vim、Syder等。這裡我以PyCharm IDE為編輯器進行配置講解。 前提是我們已經在Windows下已經安裝

內核配置編譯

oot 如果 參考 netd 流程 成了 規模 sel 依賴項 一. 相關重要文件   1.1. Kconfig     1.1.1. 什麽是kconfig文件       a. Kconfig文件分布在各目錄下構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了