娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

【IMX6ULL學習筆記】七、Linux 頂層Makefile

發布者:BlissfulDreams最新更新時間:2025-03-03 來源: cnblogs關鍵字:Linux 手機看文章 掃描二維碼
隨時隨地手機看文章

一、Linux 工程目錄分析

image

二、頂層 Makefile 詳解

1、配置工程,生成.config配置文件:

make xxx_defconfig

會調用頂層的Makefile的 %config 規則。


第 534 行:引用 arch/arm/Makefile 這個文件,這個文件很重要, zImage、uImage 等這些文件就是由 arch/arm/Makefile 來生成的。

第 540 行:%config 規則: %通配符,當輸入“make xxx_defconfig”的時候就會匹配到%config 目標


%config: scripts_basic outputmakefile FORCE

    $(Q)$(MAKE) $(build)=scripts/kconfig $@

第一步:依賴部分

目標 %config 依賴于 scripts_basic、outputmakefile、FORCE


①FORCE目標:

FORCE 在頂層 Makefile的 1610 行有如下定義:


PHONY += FORCE

FORCE:

FORCE 是沒有規則和依賴的,所以每次都會重新生成 FORCE。當 FORCE 作為其他目標的依賴時,由于 FORCE 總是被更新過的,因此依賴所在的規則總是會執行的。即將FORCE當做依賴時,對應的目標規則總是會被執行。


②scripts_basic目標:

image

該目標會執行以下命令:


$(Q)$(MAKE) $(build)=scripts/basic

$(Q)rm -f .tmp_quiet_recordmcount

其中:


Q是顯示方式:靜默make -s;詳細make V=1;不顯示make V=0

MAKE=make

build定義在scriptskbuild.include

    build := -f $(srctree)/scripts/Makefile.build obj

    展開后:

    build := -f ./scripts/Makefile.build obj

image

展開后:


@make -f ./scripts/Makefile.build obj=scripts/basic

@rm -f .tmp_quiet_recordmcount

最終會調用文件./scripts/Makefile.build


③outputmakefile目標:

image

可以通過 echo 查看 KBUILD_SRC 為空:


mytest:

    @echo KBUILD_SRC = $(KBUILD_SRC)

所以該目標規則沒有執行如何命令。


第二步:命令部分

目標 %config 依賴于 scripts_basic、outputmakefile、FORCE ,執行以下命令:


 $(Q)$(MAKE) $(build)=scripts/kconfig $@

展開:


make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

也跟文件./scripts/Makefile.build 有關


第三步:Makefile.build

上面的分析最后指向以下兩條命令:


make -f ./scripts/Makefile.build obj=scripts/basic

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

1、 scripts_basic 目標對應的命令:

make -f ./scripts/Makefile.build obj=scripts/basic

打開文件 scripts/Makefile.build,有如下代碼


# Modified for U-Boot

prefix := tpl

src := $(patsubst $(prefix)/%,%,$(obj))

ifeq ($(obj),$(src))

prefix := spl

src := $(patsubst $(prefix)/%,%,$(obj))

ifeq ($(obj),$(src))

prefix := .

endif

endif

# The filename Kbuild has precedence over Makefile

kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))

kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)

include $(kbuild-file)

使用@echo打印各個變量值,結果如下:


src= scripts/basic

kbuild-dir = ./scripts/basic

kbuild-file = ./scripts/basic/Makefile

include ./scripts/basic/Makefile

其中src的值即為obj=scripts/basic的值,并且包含了scripts/basic/目錄下的Makefile。


make執行時未指定目標,會執行Makefile.build中的默認目標,如下:


__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))

$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target))

$(subdir-ym) $(always)

@:

其中KBUILD_BUILTIN = 1、KBUILD_MODULES = 0,展開后即為:


__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)

@:

在 scripts/Makefile.build 的默認執行目標末尾使用@echo 打印各變量值,得:


builtin-target =

lib-target =

extra-y =

subdir-ym =

always = scripts/basic/fixdep scripts/basic/bin2c

展開后只剩 always ,即 $(always) = scripts/basic/fixdep scripts/basic/bin2c,因此需要先編譯scripts/basic/fixdep.c 和 scripts/basic/bin2c.c 生成fixdep、bin2c這個兩個軟件。


2、 %config 目標對應的命令:

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

src的值即為obj=scripts/basic的值,所以Makefile.build中各個變量值如下:


src= scripts/kconfig

kbuild-dir = ./scripts/kconfig

kbuild-file = ./scripts/kconfig/Makefile

include ./scripts/kconfig/Makefile

include包含了./scripts/kconfig目錄下的Makefile,執行make時會調用scripts/kconfig/ Makefile中的內容,此文件有如下所示內容:


%_defconfig: $(obj)/conf

    $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)


# Added for U-Boot (backward compatibility)

%_config: %_defconfig

    @:

目標%_defconfig 剛好和我們輸入的 xxx_defconfig 匹配,依賴為$(obj)/conf,展開后就是 scripts/kconfig/conf,該依賴會編譯 scripts/kconfig/conf.c 生成 conf 這個軟件。


得到 scripts/kconfig/conf 以后就要執行目標%_defconfig 的命令:


 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

將其展開就是:


@ scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig

結果是將配置輸出到.config 文件中,最終生成 Linux 根目錄下的.config 文件。


2、make 生成 vmlinux、zImag、uImag 等文件

make 或 make all  //編譯linux,未指定目標將執行Makefile中默認目標

image

_all 的依賴如下圖所示:

image

如果 KBUILD_EXTMOD(編譯模塊) 為空的話 _all 依賴于all,all 定義如下:


all: vmlinux

image


(1)、vmlinux依賴分析:

vmlinux 依賴 scripts/link-vmlinux.sh 和 $(vmlinux-deps) ,如下:

image

上圖第912 行定義了 vmlinux-deps,值為:


vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)

image

上圖第907行:


KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds

其中 SRCARCH=arm,展開即:


KBUILD_LDS= arch/arm/kernel/vmlinux.lds

綜上所述,vmlinux 的依賴為:


scripts/link-vmlinux.sh、$(head-y) 、$(init-y)、$(core-y) 、$(libs-y) 、$(drivers-y) 、$(net-y)、arch/arm/kernel/vmlinux.lds 和 FORCE

重點來看一下

(

h

e

a

d

?

y

)

(init-y)、

(

c

o

r

e

?

y

)

(libs-y) 、

(

d

r

i

v

e

r

s

?

y

)

(net-y)這六個變量的值:


①head-y依賴:

head-y 定義在文件 arch/arm/Makefile 中,內容如下:


head-y := arch/arm/kernel/head$(MMUEXT).o

不使能 MMU 時 MMUEXT=-nommu,使能 MMU 時為空,因此 head-y 最終的值為:


head-y = arch/arm/kernel/head.o

②init-y、drivers-y、net-y依賴:

在頂層 Makefile 中有如下代碼:


init-y := init/

drivers-y := drivers/ sound/ firmware/

net-y := net/

......

init-y := $(patsubst %/, %/built-in.o, $(init-y))

drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))

net-y := $(patsubst %/, %/built-in.o, $(net-y))

init-y、libs-y、drivers-y 和 net-y 最終的值為:


init-y = init/built-in.o

drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o

net-y = net/built-in.o

③lib-y依賴

libs-y 基本和 init-y 一樣,在頂層 Makefile 中存在如下代碼:


libs-y := lib/

......

libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))

libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))

libs-y := $(libs-y1) $(libs-y2)

libs-y 應該等于“lib.a built-in.o”,這個只正確了一部分!因為在 arch/arm/Makefile 中會向 libs-y 中追加一些值,代碼如下:


libs-y := arch/arm/lib/ $(libs-y)

arch/arm/Makefile 將 libs-y 的值改為了:arch/arm/lib $(libs-y),展開以后為:


libs-y = arch/arm/lib lib/

libs-y 最終應該為:


libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o

④core-y依賴

core-y 和 init-y 也一樣,在頂層 Makefile 中有如下代碼:


core-y := usr/

......

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

但是在 arch/arm/Makefile 中會對 core-y 進行追加,代碼如下:


core-$(CONFIG_FPE_NWFPE)  += arch/arm/nwfpe/

core-$(CONFIG_FPE_FASTFPE)  += $(FASTFPE_OBJ)

core-$(CONFIG_VFP)    += arch/arm/vfp/

core-$(CONFIG_XEN)    += arch/arm/xen/

core-$(CONFIG_KVM_ARM_HOST)   += arch/arm/kvm/

core-$(CONFIG_VDSO)   += arch/arm/vdso/


# If we have a machine-specific directory, then include it in the build.

core-y        += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/

core-y        += arch/arm/probes/

core-y        += arch/arm/net/

core-y        += arch/arm/crypto/

core-y        += arch/arm/firmware/

core-y        += $(machdirs) $(platdirs)

第 1~6 行:根據不同的配置向 core-y 追加不同的值,比如使能 VFP 的話就會在 .config 中有 CONFIG_VFP=y 這一行,那么 core-y 就會追加“arch/arm/vfp/”。

第 9~14 行:就是對 core-y 直接追加的值。


在頂層 Makefile 中有如下一行:


core-y := $(patsubst %/, %/built-in.o, $(core-y))

經過上述代碼的轉換,最終 core-y 的值為:


core-y = usr/built-in.o

        arch/arm/vfp/built-in.o

        arch/arm/vdso/built-in.o

        arch/arm/kernel/built-in.o

        arch/arm/mm/built-in.o

        arch/arm/common/built-in.o

        arch/arm/probes/built-in.o

        arch/arm/net/built-in.o

        arch/arm/crypto/built-in.o

        arch/arm/firmware/built-in.o

        arch/arm/mach-imx/built-in.o

        kernel/built-in.o

        mm/built-in.o

        fs/built-in.o

        ipc/built-in.o

        security/built-in.o

        crypto/built-in.o

        block/built-in.o

(2)、vmlinux命令分析:

vmlinux 的依賴分析完成,接下來分析 vmlinux 執行的命令:


+$(call if_changed,link-vmlinux)

該命令最終會調用 scripts/link-vmlinux.sh 這個腳本,根據 arch/arm/kernel/vmlinux.lds 鏈接文件,將各個子目錄下的所有 built-in.o、*.a 鏈接生成 vmlinux。


(3)、vmlinux生成zImag、uImag等:

頂層Makefile中有如下定義:


include arch/$(SRCARCH)/Makefile

export KBUILD_DEFCONFIG KBUILD_KCONFIG

image

展開即:


include arch/arm/Makefile

在 arch/arm/Makefile 中的默認執行目標如下:

image

展開即:


all : zImag dtbs

arch/arm/Makefile 中還有如下定義:


BOOT_TARGETS  = zImage Image xipImage bootpImage uImage

INSTALL_TARGETS = zinstall uinstall install


PHONY += bzImage $(BOOT_TARGETS) $(INSTALL_TARGETS)


$(BOOT_TARGETS): vmlinux

  $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

image

展開即:


zImage Image xipImage bootpImage uImage: vmlinux

    $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

Makefile 默認執行的目標依賴于 zImag ,要編譯 zImage,那么命令展開以后如下所示:


@ make -f ./scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/boot/zImage

是使用 scripts/Makefile.build 文件來完成 vmlinux 到 zImage 的轉換。


關鍵字:Linux 引用地址:【IMX6ULL學習筆記】七、Linux 頂層Makefile

上一篇:【IMX6ULL學習筆記】八、Linux啟動流程
下一篇:【IMX6ULL學習筆記】六、U-BOOT環境變量與Linux啟動

推薦閱讀最新更新時間:2025-03-27 12:01

Uncompressing Linux... done, booting the kernel
今天用主線Linux內核移植到MINI6410,主線內核2.6.37.1基本已經支持了MINI6410的板子,所以移植到能夠啟動起來的階段很簡單,但是在移植的時候還是出現了一個比較常見的問題: MINI6410 # bootm 0x50008000 ## Booting kernel from Legacy Image at 50008000 ... Image Name: Linux-2.6.37.1 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3800644 Bytes = 3.6 MiB Load Address: 50008000
[單片機]
S3C6410嵌入式應用平臺構建(四)——linux-3.14.4移植到OK6410-(初步啟動)
這次,還是把基本的基于我目前最新的Linux源碼進行移植到OK6410吧,同時也寫下我移植過程中遇到的問題及解決方法,不過有些方法是借鑒網上的,有些是自己加的,會有一些小bug。 一、基本工作 1. 源碼下載 https://www.kernel.org/ ,最好是下載stable版本,否則會有小bug。(我現在調試的是stable版本, linux-3.14.4) 2. 拷到自己的文件夾下解壓,我下的是.xz后綴的,這樣文件比較小,只是解壓時多一個步驟。 $ xz –d linux-3.14.4.tar.xz $ tar xvf linux-3.14.4.tar 3. 解壓完后,進入解壓后的目錄 二、源碼
[單片機]
S3C6410嵌入式應用平臺構建(四)——<font color='red'>linux</font>-3.14.4移植到OK6410-(初步啟動)
Linux移植之內核啟動過程start_kernel函數簡析
在Linux移植之內核啟動過程引導階段分析中從arch/arm/kernel/head.S開始分析,最后分析到課start_kernel這個C函數,下面就簡單分析下這個函數,因為涉及到Linux的內容較多,這里只是簡單介紹下內核啟動流程。先看一下內核啟動的流程框圖,截圖來自《嵌入式Linux應用開發完全手冊》。內核引導階段已經分析過,接下來分析一下內核啟動的第二階段。 1、start_kernel函數全局概覽 2、start_kernel函數調用層次 1、start_kernel函數全局概覽,對start_kernel作一下粗略注釋。 打開initMain.c ,下面主要分析處理UBOOT傳入的參數,其中r1是傳入的第一個參
[單片機]
<font color='red'>Linux</font>移植之內核啟動過程start_kernel函數簡析
Linux驅動之定時器在按鍵去抖中的應用
機械按鍵在按下的過程中會出現抖動的情況,如下圖,這樣就會導致本來按下一次按鍵的過程會出現多次中斷,導致判斷出錯。在按鍵驅動程序中我們可以這么做: 在按鍵驅動程序中我們可以這么做來取消按鍵抖動的影響:當出現一個按鍵中斷后不會馬上去處理它,而是延時一個抖動時間(一般10ms),如果在這個時間內再次出現中斷那么再次延時10ms。這樣循環,一直到在這個10ms內只有一個按鍵中斷,那么就認為這次是真的按鍵值,然后在定時器處理函數里處理它。上述過程可以利用內核的定時器來實現。 定時器二要素:定時時間、定時時間到后做什么事情。根據這兩個要素來編寫程序,直接在sixth_drv.c的驅動程序上更改直接看到代碼: 1、定時器的創建,先建立一個定
[單片機]
<font color='red'>Linux</font>驅動之定時器在按鍵去抖中的應用
linux-2.6.32在mini2440開發板上移植 SD卡驅動移植
編者:這個驅動還是比較復雜的,先移植著,以后在分析吧。 SD卡驅動移植 1 在內核中注冊SD 設備驅動 Linux-2.6.32.2 已經自帶了S3C2440 芯片的SD 卡驅動,我們只需在初始化代碼中加入SD 平臺設備結構就可以,打開arch/arm/mach-s3c2440/mach-mini2440.c,在nand flash 平臺結構后面添加如下紅色代碼: ;在mini2440.c 的頂部添加SD 卡設備結構所需的頭文件 #include linux/mmc/host.h #include plat/mci.h static struct platform_device mini2440_device_eth = { .n
[單片機]
關于linux下的嵌入式文件系統以及flash文件系統選擇
嵌入式linux下常見的文件系統 ? RomFS:只讀文件系統,可以放在ROM空間,也 可以在系統的RAM中,嵌入式linux中常用來作 根文件系統 ? RamFS:利用VFS自身結構而形成的內存文件系 統,使用系統的RAM空間 ? JFFS/JFFS2:為Flash設計的日志文件系統 ? Yaffs:專門為Nand Flash設計 ? proc:為內核和內核模塊將信息發送給進程提 供一種機制,可以查看系統模塊裝載的信息 ? devFS:設備文件系統 Linux上的Ext2fs ? 支持4 TB 存儲、文件名稱最長1012 字符 ? 可選擇邏輯塊 ? 快速符號鏈接 ? Ext2不適合flash設備 ? 是為象IDE 設備那樣的塊設
[單片機]
STM32MP1處理器下實現RT-Thread和Linux同時運行
架構說明 本項目以 STM32MP157A-DK1 為硬件平臺。作為能夠支持輕松開發更廣泛應用的通用微處理器產品線,STM32MP157 系列基于雙核Cortex-A7 與 Cortex-M4 組成的異構架構,加強了支持多應用和靈活應用的能力,可以隨時實現最佳性能和功率數據。Cortex-A7 內核提供對開源操作系統(Linux/Android)的支持,而 Cortex-M4 內核可以利用 STM32 MCU 的生態系統。本篇文章將介紹如何在 STM32MP157 上運行 RT-Thread OS。 啟動方式 Forced USB boot For flashing : 通過 USB 燒寫固件。在此模式下,可以使用 STM32
[單片機]
STM32MP1處理器下實現RT-Thread和<font color='red'>Linux</font>同時運行
基于Linux-2.6.32.2在mini2440驅動分析一:串口驅動
串口驅動文件位于: linux-2.6.32.2/drivers/serial/s3c2440.c,省去非重點部分分析。 #include linux/module.h #include linux/ioport.h #include linux/io.h #include linux/platform_device.h #include linux/init.h #include linux/serial_core.h #include linux/serial.h #include asm/irq.h #include mach/hardware.h #include plat/regs-serial
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 盈江县| 临洮县| 郧西县| 江川县| 丰县| 五华县| 三台县| 阿拉善左旗| 乡宁县| 怀远县| 新蔡县| 汽车| 客服| 定襄县| 交城县| 定边县| 莲花县| 青阳县| 白山市| 尼勒克县| 南京市| 教育| 太和县| 五家渠市| 盐边县| 库伦旗| 两当县| 遂昌县| 石泉县| 名山县| 南昌县| 伊宁市| 沽源县| 赞皇县| 霍山县| 蓬安县| 宝坻区| 依安县| 巫溪县| 双峰县| 凤山市|